Und wieder hat mich die Schreibwut gepackt und ich möchte Versuche ein weiteres Problem beim Umgang mit 64Bit Windows Features aus einem 32Bit-Prozess heraus beschreiben. Wer sich schonmal die Frage gestellt hat, wie kommte man an den Wert der Variable %ProgramFiles%, kommt schnell zum entsprechendne MSDN Artikel und den Shell-APIs. Das Mittel der Wahl ist SHGetFolderPath und die passende CSIDL.
Was macht man aber unter 64Bit Windows, immerhin wird je ein %ProgramFiles% für 64Bit-Prozesse und eines für 32Bit-Prozesse angeboten. Ruft man also SHGetFolderPath aus einem 64Bit-Prozess aus bekommt man oft C:\Program Files zurück. Aus einem 32Bit-Prozess C:\Program Files(x86).
Warum ist das so?
Zusätzlich zur FileSystem-Redirection gibt es unter 64Bit Windows eine Registry-Redirection und der Registry-Value hinter SHGetFolderPath ist wie folgt zweimal verfügbar:
- 64Bit Prozesse
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir
- 32Bit Prozesse unter der WOW64 Emulation
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ProgramFilesDir
Wie kommt man jetzt an den 64Bit-Wert?
Was kann man nun machen um aus einem 32Bit Prozess sowohl das x86-ProgramFiles-Dir und das x64-ProgramFiles-Dir abzufragen und dabei auf einem legalen Pfad zu bleiben. Gut das Microsoft ein Set von Environment-Variablen Dokumentiert hat die uns weiter helfen werden. Die Folgende Matrix finde sich in der MSDN hier:
| Environment Variable |
64-bit Value |
32-bit Value |
| PROCESSOR_ARCHITECTURE |
Native (AMD64 or IA64) |
x86 |
| PROCESSOR_ARCHITEW6432 |
N/A |
%PROCESSOR_ARCHITECTURE% |
| ProgramFiles |
%ProgramFiles% |
%ProgramFiles(x86)% |
| ProgramW6432 |
N/A |
%ProgramFiles% |
| CommonProgramFiles |
%CommonProgramFiles% |
%CommonProgramFiles(x86)% |
| CommonProgramW6432 |
N/A |
%CommonProgramFiles% |
Ist davon auszugehen das seinem eigenem Prozess die Environment Variablen vererbt werden, ist alles in Butter. Durch einfach Kombination von IsWow64Process und GetEnvironmentVariable lässt sich ein kleines Set von Funktionen bauen die immer das geforderte Directory korrekt zurückgeben egal wie der Prozess daher kommt.