AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

(T)Registry und Wow6432Node

Ein Thema von Dalai · begonnen am 9. Mai 2015 · letzter Beitrag vom 10. Mai 2015
Antwort Antwort
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#1

(T)Registry und Wow6432Node

  Alt 9. Mai 2015, 23:11
Delphi-Version: 5
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:
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;
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 KEY_READ or KEY_WOW64_32KEY 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?

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

Geändert von Dalai (10. Mai 2015 um 11:44 Uhr) Grund: RootKey ergänzt, Parameter bei OpenKey ergänzt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#2

AW: (T)Registry und Wow6432Node

  Alt 9. Mai 2015, 23:31
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?
https://msdn.microsoft.com/en-us/lib.../ms724875.aspx
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Mai 2015 um 23:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#3

AW: (T)Registry und Wow6432Node

  Alt 9. Mai 2015, 23:58
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.
Selbstverständlich habe ich das getan. Daher auch mein Hinweis im OP.

Zitat:
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?
https://msdn.microsoft.com/en-us/lib.../ms724875.aspx
Ja, genau damit habe ich die vergangenen Stunden verbracht. Welche Funktion bringt mich denn deiner Meinung nach weiter? Da ich nichts fand, frag(t)e ich hier. Es ist ja auch schwierig, danach zu suchen, weil man nur die üblichen Geschichten findet, um die es mir nicht geht.

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#4

AW: (T)Registry und Wow6432Node

  Alt 10. Mai 2015, 07:30
Und, nichts gefunden?

Liegt wohl daran, daß es "offiziell" keine Möglichkeit gibt,
außer vielleicht Redirection/Reflection abzuschalten.


https://msdn.microsoft.com/en-us/lib.../aa384182.aspx




















http://stackoverflow.com/questions/9...ey-handle-in-c
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (10. Mai 2015 um 07:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#5

AW: (T)Registry und Wow6432Node

  Alt 10. Mai 2015, 11:11
Liegt wohl daran, daß es "offiziell" keine Möglichkeit gibt,
außer vielleicht Redirection/Reflection abzuschalten.
Nein, das hat keinen Sinn:
Zitat:
[The information in this topic applies to Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP. Starting with Windows 7 and Windows Server 2008 R2, WOW64 no longer uses registry reflection and formerly reflected keys are shared instead.
Davon abgesehen ist hier nichts mit Reflection, denn die macht etwas, was auf den gewünschten Schlüssel nicht zutrifft:
Zitat:
The process of registry reflection copies registry keys and values between two registry views to keep them synchronized.
In diesem Schlüssel wird nichts synchron gehalten, die sind getrennt voneinander.

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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: (T)Registry und Wow6432Node

  Alt 10. Mai 2015, 13:36
Ein Beispiel zu NTQueryKey gibt es ja auch von himitsu:
http://www.delphipraxis.net/711992-post29.html
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#7

AW: (T)Registry und Wow6432Node

  Alt 10. Mai 2015, 15:56
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 russischen Seite, und ein bisschen angepasst:
Delphi-Quellcode:
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;
Nun, das funktioniert auch gut und gibt auf einem XP64
Code:
\REGISTRY\MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
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.

Fazit: Ich hab die Wahl zwischen NtQueryKey + StringReplace oder nur StringReplace (bzw. Verketten von Strings, wenn man es entsprechend anstellt) .

Unabhängig davon danke an himitsu für den richtigen Hinweis!

MfG Dalai
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz