Problem mit Wow64DisableWow64FsRedirection
-
Hallo erstmal,
ich habe für mich ein nicht nachvollziehbares Problem mit der API Funktion "Wow64DisableWow64FsRedirection". Ich erkläre erstmal im kurzen worauf ich hinaus will und welcher Teil für mich unverständlich ist. Meine Programmierumgebung ist der C++ Builder XE3 auf einem 64Bit Windows 7 System.
Ich schreibe momentan eine 32Bit VCL-Formularanwendung und wollte zwei Einträge in die Registry schreiben. Das klappt soweit auch ganz gut. Auf 32Bit Betriebsystemen speichert er auch alles unter den richtigen Pfad. Auf 64Bit Systemen weiss ich, dass 32Bit Programme in einer Art Emulation gestartet werden und die "Redirection" / Umleitung ihre Arbeit tut.
Will ich aber jetzt unter einem 64Bit System in den gleichen Pfad der Registry speichern, werden die Einträge in den "WOW6432Node" Schlüssel umgeleitet.
Will man dies verhindern, benutzt man dafür den Aufruf von "Wow64DisableWow64FsRedirection".Das eigentlich Problem ist, dass der Compiler nicht ein bisschen aufmuckt und ohne Einwand alles an Code verarbeitet und die Anwendung erzeugt. Startet man die Anwendung, kommt auch keine Fehlermeldung, selbst nicht auf das Clik-Event des Buttons, wo die Speicherung der Einträge ausgeführt wird. Aber er speichert mir immer noch unter den Schlüssel "WOW6432Node".
"windows.h" ist auch inkludiert, welche "winbase.h" ja mit sich bringt. Die "Kernel32.dll" brauch ja nicht extra geladen zu werden, da dieses automatisch mit dem Programmstart passiert, soweit ich weiss.
Admin-Rechte werden mit einem eingebundenen Manifest, angefordert.Hier mal ein Auszug des Codes mit dem Click-Event:
void __fastcall TForm1::Button1Click(TObject *Sender) { PVOID pOldValue = NULL; Wow64DisableWow64FsRedirection(&pOldValue); TRegistry *Registry = new TRegistry(KEY_ALL_ACCESS); Registry->RootKey = HKEY_LOCAL_MACHINE; Registry->OpenKey("SOFTWARE", false); Registry->CreateKey("Meine Anwendung"); Registry->OpenKey("Meine Anwendung", false); Registry->WriteString("TEST","Hallo"); Registry->CloseKey(); delete Registry; Wow64RevertWow64FsRedirection(pOldValue); }
Ich habe bewusst den Code ohne eine Überprüfung eines 32 oder 64Bit System erstellt, einfachheitshalber damit ich das Problem erstmal eingrenzen und die Funktion testen kann.
Anscheinend reicht es an Code dass der Compiler nicht meckert, aber die Funktion trotzdem nicht vernünftig ausgeführt wird.Wie kann ich das Problem in den Griff bekommen? Habe schon viele Stunden damit verbracht, mich im Internet zu informieren, aber nichts gefunden was bei mir funktioniert. Ich hoffe echt auf euer geistreiches Wissen, dass ihr mir helfen könntet.
-
C++ Coder schrieb:
Will ich aber jetzt unter einem 64Bit System in den gleichen Pfad der Registry speichern, werden die Einträge in den "WOW6432Node" Schlüssel umgeleitet.
Will man dies verhindern, benutzt man dafür den Aufruf von "Wow64DisableWow64FsRedirection".WO hast Du denn das gelesen?????
"Fs" bedeutet "FileSystem" und nicht "Registry"...
Du musst bei Öffnen einfach das Flag "KEY_WOW64_64KEY" angeben!
Siehe auch:
http://www.codeproject.com/Articles/14200/Registry-Redirector-in-x64-IA64
-
Oh.....man. Manchmal sieht man den Wald vor lauter Bäumen nicht mehr. Hätte nicht gedacht das es so leicht ist und nur an diesem Flag liegt.
Aber jetzt mal ohne Mist. Ich war echt der absolut festen Überzeugung, dass ich es mal gelesen habe, dass man dies auch mit "Wow64DisableWow64FsRedirection" lösen kann und es auch auf die Registry, Auswirkungen zeigt.
Das "Fs" für Filesystem steht, war mir auch irgendwo bewusst. Aber naja aus Fehlern lernt man. Nochmals vielen dank, hätte nicht gedacht, dass ich nach einer Antwort schon zur Lösung komme.Haber es jetzt mal kurz getestet mit diesem Code:
void __fastcall TForm1::Button1Click(TObject *Sender) { TRegistry *Registry = new TRegistry(KEY_WOW64_64KEY|KEY_ALL_ACCESS); Registry->RootKey = HKEY_LOCAL_MACHINE; Registry->OpenKey("SOFTWARE", false); Registry->CreateKey("Meine Anwendung"); Registry->OpenKey("Meine Anwendung", false); Registry->WriteString("TEST","Hallo"); Registry->CloseKey(); delete Registry; }