different minds about different platforms

a blog of Dirk Eisenberg (>)

  Home  |   Contact  |   Syndication    |   Login
  47 Posts | 4 Stories | 7 Comments | 17 Trackbacks

News

Ich hoffe das jeder Besucher in diesem Blog das ein oder andere interessante Thema findet. Als Autor der Beiträge freue ich mich besonders über Feedback in Form von Kommentaren oder auch persönlicher als E-Mail. Dankbar nehme ich Anregungen und Korrekturen von fehlerhaften Inhalten entgegen.

Article Categories

Archives

Post Categories

Image Galleries

Blogs

Links

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:

  1. 64Bit Prozesse
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir
  2. 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.

posted on Monday, March 06, 2006 8:06 PM