Wie kann ich Lesen Sie die 64-bit-Registrierungsschlüssel von einem 32-bit-Prozess?
Habe ich mit der key-Wert MachineGuid
aus HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography
zur eindeutigen Identifizierung von hosts, sondern von 32-bit-Prozesse unter 64-bit-Computer, der Wert scheint zu fehlen. Ich denke, es ist die Suche unter Wow6432Node, wo es tatsächlich fehlt. Nach diese Sie sollte zu erhalten, können Sie die rechts-Taste durch das hinzufügen einer Flagge, sondern unter code immer noch nicht erscheinen, um die Arbeit zu tun. Was bin ich?
const
KEY_WOW64_64KEY=$0100;
var
r:HKEY;
s:string;
i,l:integer;
begin
//use cryptography machineguid, keep a local copy of this in initialization?
l:=40;
if RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('Software\Microsoft\Cryptography'),
0,KEY_QUERY_VALUE,r)=ERROR_SUCCESS then
begin
SetLength(s,l);
if RegQueryValue(r,'MachineGuid',PChar(s),l)=ERROR_SUCCESS then
begin
SetLength(s,l);
RegCloseKey(r);
end
else
begin
//try from-32-to-64
RegCloseKey(r);
if RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('Software\Microsoft\Cryptography'),
0,KEY_QUERY_VALUE or KEY_WOW64_64KEY,r)=ERROR_SUCCESS then
begin
l:=40;
if RegQueryValue(r,'MachineGuid',PChar(s),l)=ERROR_SUCCESS then
SetLength(s,l)
else
l:=0;
RegCloseKey(r);
end;
end;
end;
- Warum nutzen Sie nicht TRegistry? Auch Ihre Logik ist eine echte Sauerei. Sie möchten eine einzelne Funktion aufrufen, um den Wert Lesen. Nennen Sie es zweimal. Erste mal, übergeben Sie 0. Zweites mal passieren KEY_WOW64_64KEY. Nur anrufen zweite mal, wenn der erste mal ausfällt. Dies ist extract method refactoring.
- Ich TRegistry verwendet werden, bevor, aber nicht wissen, Sie kann hinzufügen KEY_WOW64_64KEY über den Konstruktor mit parameter.
- Sicher, es tut. Siehe meine Antwort. EDIT: Sieht aus wie Sie fand meine Antwort jetzt. Beachten Sie auch, dass Sie ändern können, die
Access
Immobilie jederzeit zu wechseln der Ansichten innerhalb einer bereits erstellten registry-Objekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code ist unnötig Komplex, vor allem, weil Sie sind nicht unter Ausnutzung der eingebauten
TRegistry
Klasse, die Schilde, die Sie von der Komplexität der low-level-registry-API. Betrachten Sie beispielsweise den folgenden code:Die Funktion
ReadRegStr
wird den string-Wert mit dem NamenName
aus dem SchlüsselKey
relativ zum root-keyRoot
. Wenn ein Fehler Auftritt, beispielsweise wenn der Schlüssel oder name nicht vorhanden ist, oder wenn der Wert vom falschen Typ, dann wird eine Ausnahme ausgelöst.Den
View
parameter ist eine enumeration, die macht es einfach für Sie, um Zugriff auf native 32-bit-oder 64-bit-Aussicht auf die registry. Beachten Sie, dass die Muttersprache heißt Muttersprache, um den Prozess, der ausgeführt wird. So wird es die 32-bit-Ansicht für 32-bit-Prozess-und 64-bit-Ansicht für ein 64-bit-Prozess. Diese Aufzählung spiegelt die äquivalente definition in .net.TRegistry
funktioniert, wenn ein Wert nicht vorhanden ist. Aber wenn Sie sehen eine leere Zeichenfolge, dann ist etwas falsch. Dein code (meinen code) den richtigen Wert zurück, wenn ich Sie laufen. Ich Frage mich, welche version von Delphi Sie sind auf. Vielleicht sind Sie auf einem alten Delphi für dieTRegistry
nicht respektiertKEY_WOW64_64KEY
. Das würde mich überraschen aber. Ich bin ein bisschen misstrauisch, seit Sie bei der DefinitionKEY_WOW64_64KEY
aber ich bin gerade erst von Windows.pas. Also, was Delphi benutzt du?Ich schlage vor, Sie verwenden die
IsWow64Process()
Funktion zu wissen, wenn Sie ein 32-Prozess ausgeführt wird, auf einem 64-bit OS, und dann gelten nur dieKEY_WOW64_64KEY
flags, die in diesem spezifischen Zustand. Wenn die app ist ein 32-bit-Prozess auf einem 32-bit OS oder 64-bit-Prozess auf einem 64-bit-OS, der Fahnen ist nicht erforderlich.Beispiel:
KEY_WOW64_64KEY
bedingungslosIsWow64Process()
muss dynamisch geladen werden, jedenfalls zu erkennen, ob WOW64 ist auch vorhanden.In meiner Verwendung dieses Registrierungsschlüssels ich ging einen Schritt weiter. Wenn der Wert nicht existieren, ich Sie erstellt habe: nicht in HKEY_LOCAL_MACHINE, würde eine Erhöhung erforderlich, aber in HKEY_CURRENT_USER. Wer sehen den eingeführten Schlüssel es ist unwahrscheinlich, um zu realisieren, dass es ein dummy.
Das ist ein guter Punkt von @Remy Lebeau - TeamB obwohl, ich sollte mod den obigen code entsprechend.
ValueExists()
vor dem AufrufReadString()
. Es gibt eine leere Zeichenfolge zurück, wenn der Wert nicht vorhanden ist, es wird keine Ausnahme ausgelöst, wie die anderen lese-Methoden tun.Nennen reg.exe über diesen Weg
C:\Windows\sysnative\reg.exe
Zum Beispiel:
Quelle: https://stackoverflow.com/a/25103599