Source wurde am 15.07.2007 aus der MMJ-Quellcodesammlung (Dietmar Horn) in die Babyklappe auf XProfan.Com abgelegt:
Registry: Schlüssel und alle Unterschlüssel binär in Datei speichern
Hive sichern abspeichern Registry
Def @Regsavekey(3)!ADVAPI32,RegSaveKeyASpeichert eine Schlüsselfolge in einen Hive.
Def @Regopenkeyex(5) !ADVAPI32,RegOpenKeyExALiefert Handle eines Registryschlüssels und öffnet ihn.
Def @Regclosekey(1) !ADVAPI32,RegCloseKeySchließt eine geöffneten Registryschlüssel.
Def @Lookupprivilegename(4)!advapi32,LookupPrivilegeNameAErmittelt aus dem Luid eines Privilegs dessen Namen.
Def @Lookupprivilegevalue(3) !advapi32,LookupPrivilegeValueAErmittelt aus dem Namen eines Privilegs dessen Luid.
Def @Openprocesstoken(3) !advapi32,OpenProcessTokenÖffnet Einstellprozess.
Def @Adjusttokenprivileges(6) !advapi32,AdjustTokenPrivilegesStellt Privilegien ein.
Def @Getcurrentprocess(0) !kernel32,GetCurrentProcessErmittel das Handle des aktiven Prozesses.
Declare Fehler&,Schlüssel$,Handle#,Handle&,Button&,Savefile$,Io%
Declare Newstate#,Luid1#,Luid2#,Privileg1#,Token&,Token#,Zahl2&,Zahl1&
Declare Buffer#,Oldvalue#,Out#,Größe#,System$
Der Folgende Codeanteil ist nur unter NT-basierten nötig
Dim Token#,4
Dim Newstate#,16
Dim Luid1#,8
Dim Privileg1#,256
Dim Buffer#,4
Dim Out#,256
Dim Größe#,4
Dim Oldvalue#,256
Clear Out#,Oldvalue#,Größe#,Buffer#,Privileg1#,Luid1#,Token#,System$
Long Newstate#,0=1Nur ein Privileg soll geändert werden
Long Newstate#,12=$00000002Das Privileg soll eingeschaltet werden
Let Fehler&=@Openprocesstoken(@Getcurrentprocess(),$0020 | $0008,Token#)Es wird ein Process mit dem Handle Token gestartet, der Privilegien für mein Programm einstellen soll.
Addstring Fehlercode OpenProcessToken: +@Str$(Fehler&)Wenns geklappt hat, dann 1.
Let Token&=@Long(Token#,0)Das Handle des Einstellprozesses wird ausgelesen.
String Privileg1#,0=SeBackupPrivilegePrivileg für RegSaveKey
Let Fehler&=@Lookupprivilegevalue(@Addr(System$),Privileg1#,Luid1#)Wenn ich es richtig vestanden habe, wird hier aus dem Privilegnamen eine Art lokales Handle für dieses Privileg ermittelt.
Addstring Fehlercode LookupPrivilegeValue: +@Str$(Fehler&)Wenns geklappt hat, dann 1.
Byte Newstate#,4=@Byte(Luid1#,0)
Byte Newstate#,5=@Byte(Luid1#,1)
Byte Newstate#,6=@Byte(Luid1#,2)
Byte Newstate#,7=@Byte(Luid1#,3)
Byte Newstate#,8=@Byte(Luid1#,4)
Byte Newstate#,9=@Byte(Luid1#,5)
Byte Newstate#,10=@Byte(Luid1#,6)
Byte Newstate#,11=@Byte(Luid1#,7)
Clear Buffer#
Let Zahl1&=256
Let Zahl2&=0
Let Fehler&=@Adjusttokenprivileges(Token&,Zahl2&,Newstate#,Zahl1&,Oldvalue#,Buffer#)Das Privileg wird aktiviert.
Addstring Fehlercode AdjustTokenPrivileges: +@Str$(Fehler&)Wenns geklappt hat, dann 1.
Addstring SIZE: +@Str$(@Long(Buffer#,0))
Long Größe#,0=256
@Lookupprivilegename(@Addr(System$),Luid1#,Out#,Größe#)Aus dem ersten Luid wird wieder der Privilegname ermittelt.
Addstring PRIVILEG: +@String$(Out#,0)Nur Rückmeldung, ob es geklappt hat.
Dispose Luid1#
Dispose Privileg1#
Dispose Token#
Dispose Newstate#
Dispose Out#
Dispose Größe#
Ab hier wird abgespeichert
Let Schlüssel$=
Let Savefile$=C:REGHIVE
Dim Handle#,4
Let Fehler&=@Regopenkeyex($80000001,@Addr(Schlüssel$),0,$F003f,Handle#)...hole das Handle des Hive...
Addstring Errorcode Handle des Hive holen: +@Str$(Fehler&)
Let Handle&=@Long(Handle#,0)..Handle für Startpunkt des Hives wird ausgelesen....
Let Fehler&=@Regsavekey(Handle&,@Addr(Savefile$),0)...speichere den Hive unter C:REGHIVE...
Addstring Errorcode Hive abspeichern: +@Str$(Fehler&)
Let Fehler&=@Regclosekey(Handle&)...mach die Kiste zu..
Addstring Errorcode Schlüssel schließen: +@Str$(Fehler&)
Dispose Handle#
Windowtitle Abspeichern des Registryschlüssels Current_User in binärer Form
Windowstyle 31
Window 0,0-640,440
Let Button&=@Createbutton(%Hwnd,Gespeicherten Hive löschen?,20,300,250,30)
@Editbox(API-Rückmeldungen,1)
Chdir C:\
If Findfirst$(REGHIVE)=
Enablewindow Button&,0
Endif
While 0=0
Waitinput
If @Getfocus(Button&)
Let Io%=%Ioresult
Assign #1,C:\REGHIVE
Setfattr #1,$20
Erase #1
Chdir C:\
If Findfirst$(REGHIVE)=
@Messagebox(Hive wurde gelöscht!,Hinweis,64)
Enablewindow Button&,0
Endif
Endif
Wend