![]() |
Delphi-Version: 5
(T)Registry und Wow6432Node
Hallo, ich bin's schon wieder :).
Der Titel ist zwar nicht unbedingt eindeutig, aber es geht nicht um das Übliche, den Zugriff auf 64 Bit Zweige von einem 32 Bit Programm aus. Folgender Code zum Einstieg:
Delphi-Quellcode:
Nun gibt reg.CurrentPath logischerweise denselben Schlüssel zurück wie ich reingebe. Und zwar auch dann, wenn es ein WOW64-Prozess ist. Selbe Geschichte in einem 64 Bit Prozess, wenn man TRegistry.Access auf
const KEY = '\Software\Microsoft\Windows\CurrentVersion\Run'
var reg: TRegistry; Laccess: DWORD; begin Laccess:= KEY_READ; reg:= TRegistry.Create(Laccess, False); reg.RootKey:= HKEY_LOCAL_MACHINE; try if reg.OpenKey(KEY) then ShowMessage(reg.CurrentPath); finally reg.Free; end; end;
Delphi-Quellcode:
setzt, um an den 32 Bit Schlüssel zu kommen. Gibt es einen Weg, an den vollen/umgeleiteten Schlüssel zu kommen, ohne manuell das "Wow6432Node" reinzupacken?
KEY_READ or KEY_WOW64_32KEY
Ich möchte das nur zur Anzeige nutzen, nicht zum Zugriff auf die Registry. Das soll es dem Benutzer erleichtern, im Fall des Falles zum Schlüssel zu navigieren (z.B. im regedit). MfG Dalai |
AW: (T)Registry und Wow6432Node
Wenn man in die Quellcodes schaut, wo CurrentPath her kommt, dann ist klar, daß dort immer nur das raus kommt, was man eingibt und das muß nichtmal der vollstädige Pfad sein. (speziell wenn man als RootKey den HKEY eines Unterverzeichnisses nimmt)
Und warum kommt eigentlich niemand auf die Idee in die Dokumentation zu schauen, ob es einen Befehlt gibt, der die gewünschte Information aus einem HKEY auslesen tut? ![]() |
AW: (T)Registry und Wow6432Node
Zitat:
Zitat:
MfG Dalai |
AW: (T)Registry und Wow6432Node
Und, nichts gefunden?
Liegt wohl daran, daß es "offiziell" keine Möglichkeit gibt, außer vielleicht Redirection/Reflection abzuschalten. :zwinker: ![]() ![]() |
AW: (T)Registry und Wow6432Node
Zitat:
![]() Zitat:
Zitat:
Ja, das Beispiel hab ich mir angeschaut, aber das gibt eben auch keinen derartigen Pfad aus... Das muss ich mir mal anschauen. Danke. MfG Dalai |
AW: (T)Registry und Wow6432Node
Ein Beispiel zu NTQueryKey gibt es ja auch von himitsu:
![]() |
AW: (T)Registry und Wow6432Node
So, nachdem ein erstes Win32-Kompilat sofort funktionierte und ich einige Stunden brauchte, um herauszufinden, dass Enums für die API 4 Byte groß sein müssen, funktioniert es nun auch mit Win64.
Den Code hab ich aus verschiedenen Quellen zusammengestöpselt, vor allem von dieser ![]()
Delphi-Quellcode:
Nun, das funktioniert auch gut und gibt auf einem XP64
type NTSTATUS = Cardinal;
{$MINENUMSIZE 4} KEY_INFORMATION_CLASS = (KeyBasicInformation, KeyNodeInformation, KeyFullInformation, KeyNameInformation, KeyCachedInformation, KeyFlagsInformation, KeyVirtualizationInformation, KeyHandleTagsInformation, MaxKeyInfoClass); {$MINENUMSIZE 1} KEY_NAME_INFORMATION = packed record NameLength: ULONG; Name: array[0..0] of WideChar; end; PKEY_NAME_INFORMATION = ^KEY_NAME_INFORMATION; function NtQueryKey(KeyHandle: HKEY; KeyInformationClass: KEY_INFORMATION_CLASS; KeyInformation: Pointer; Length: ULONG; ResultLength: PULONG): NTSTATUS; stdcall; external 'ntdll.dll'; //------------------------------------------------------------------------------ function GetNtKeyNameFromHKEY(const AHKEY: HKEY): string; var Len: Cardinal; Info: PKEY_NAME_INFORMATION; Name: PWideChar; begin NtQueryKey(AHKEY, KeyNameInformation, nil, 0, @Len); GetMem(Info, Len); try if NtQueryKey(AHKEY, KeyNameInformation, Info, Len, @Len) = 0 then begin GetMem(Name, Info.NameLength + 2); try Move(Info.Name, Name^, Info.NameLength); Name[Info.NameLength div 2]:= #0; {$IFDEF UNICODE} Result:= Name; {$ELSE} Result:= AnsiString(Name); {$ENDIF} finally FreeMem(Name); end; end; finally FreeMem(Info); end; end; //------------------------------------------------------------------------------ procedure TForm1.Button1Click(Sender: TObject); const KEY = '\Software\Microsoft\Windows\CurrentVersion\Run'; var reg: TRegistry; begin // ShowMessage(IntToStr(SizeOf(KEY_INFORMATION_CLASS))); reg:= TRegistry.Create(KEY_READ); reg.RootKey:= HKEY_LOCAL_MACHINE; try if reg.OpenKey(KEY, False) then begin Edit1.Text:= reg.CurrentPath; Edit2.Text:= GetNtKeyNameFromHKEY(reg.CurrentKey); end; finally reg.Free; end; end;
Code:
zurück. Da ich die Schlüssel aber gern im normalen Format haben möchte, muss hinterher noch ein StringReplace erfolgen. Nun weiß ich aber eigentlich schon vorher, ob hier ein Wow6432Node rauskommen müsste, denn ich habe ein Enum der verschiedenen Schlüssel, in dem die 32 und 64 Bit Zweige getrennt aufgeführt sind.
\REGISTRY\MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
Fazit: Ich hab die Wahl zwischen NtQueryKey + StringReplace oder nur StringReplace (bzw. Verketten von Strings, wenn man es entsprechend anstellt) :cyclops:. Unabhängig davon danke an himitsu für den richtigen Hinweis! MfG Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz