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

Nach eingen Diskussionen mit hier nicht näher genannten Kollegen um das Thema File und Registry-Redirection unter 64Bit Windows habe ich mir die Frage gestellt, kann ein 32Bit-Prozess das automatische Redirecten überwinden oder nicht? Ich will die Antwort nicht vorweg nehmen, also hier das gesteckte Ziel:

"Ein 32Bit-Prozess soll einen Datei im 64Bit-Directory  %systemroot%\System32 anlegen."

Unter 64Bit Windows wird das System32-Directory in einem 32Bit-Prozess, der unter der WOW64 Emulation getstartet wird, umgeleitet bzw. überblendet. Ein 64Bit Prozess sieht die Dateien aus %systemroot%\System32 ein 32Bit-Prozess hingegen die Dateien aus %systemroot%\SysWOW64. Nach einiger Einarbeitung in die SDK-Dokumentation zu WOW64 haben sich folgende APIs als Goldgrube erwiesen:

  • Mit IsWow64Process kann geprüft werden ob der aufgerufene Prozess unter WOW64 läuft. Ist das nicht der fall muss es ein 64Bit-Prozess sein oder ein 32Bit auf einem 32Bit OS. GetNativeSystemInfo hilft hier weiter.
  • Wow64DisableWow64FsRedirection schaltet wie der Name schon sagt das WOW64 File-Redirecting für den aufrufenden Thread aus. Zum reverten (nicht wieder einschalten, weil es ja bereits abgeschaltet gewesen sein kann) wird Wow64RevertWow64FsRedirection angeboten.

Der Ablauf um in das System32 für 64Bit Prozesse aus einem 32Bit Prozess zu schreiben sieht dann wie folgt aus:

  1. Prüfen ob Prozess in der WOW64 Emulation läuft
  2. FsRedirection ausschalten
  3. Jetzt kann direkt auf das System32 zugegriffen werden, ohne das der Prozess in SysWOW64 umgeleitet wird.
  4. FsRedirection reverten

Folgendes Beispiel demonstriert das beschriebene Verfahren:

int _tmain(int argc, _TCHAR* argv[])
{
  BOOL bIsWOW64 = FALSE;
  if ( IsWow64Process( GetCurrentProcess(), &bIsWOW64 ) && bIsWOW64 == TRUE )
  {
    LPCTSTR lpszFileToCreate = _T("C:\\windows\\system32\\wow64test.txt"); 

    // Create the file in C:\windows\syswow64 
    HANDLE hFile = CreateFile( lpszFileToCreate, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
    CloseHandle( hFile ); 

    // Create the file in C:\windows\system32 
    PVOID pOldValue = NULL; 
    if ( Wow64DisableWow64FsRedirection( &pOldValue ) ) 
    { 
      HANDLE hFile64 = CreateFile( lpszFileToCreate, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 
      CloseHandle( hFile64 ); 
      Wow64RevertWow64FsRedirection( pOldValue ); 
    } 
  } 
  return 0; 
}

 

posted on Saturday, March 04, 2006 9:22 AM

Feedback

# re: WOW64 - Es lebe der 32Bit Prozess 3/5/2006 9:44 AM Stefan
Man sollte vielleicht noch pruefen, was passiert, wenn man nach abgeschalteter Redirection (Wow64DisableWow64FsRedirection) eine System-DLL mit LoadLibrary laedt: Wird dann evtl. in einen 32-bit Prozess versucht, eine x64-DLL zu laden (was scheitern muss)? Die Antwort auf diese Frage hat Einfluss darauf, wie granular man die Aufrufe von Wow64DisableWow64FsRedirection in einem echten Produkt machen muss.


# re: WOW64 - Es lebe der 32Bit Prozess 3/5/2006 10:39 AM Stefan
Oh ja, ganz vergessen: Man darf natuerlich auf keinen Fall den Code so wie oben schreiben, weil diese neuen APIs natuerlich auf herkoemmlichen 32-bit Betriebssystemen *nicht* existieren. Stattdessen muss man einen LoadLibrary/GetProcAddress-Approach anstreben. Und nein, delayloaden kann man's auch nicht, weil die Funktionen allesamt in kernel32 implementiert ist, und kernel32 kann man nicht delayloaden.

# re: WOW64 - Es lebe der 32Bit Prozess 3/5/2006 10:40 AM Stefan
Hey, die Uhrzeit auf diesem Server stimmt nicht, er ist exakt 3 Stunden hinterher.

# re: WOW64 - Es lebe der 32Bit Prozess 3/5/2006 11:21 AM dirk
Das mit LoadLibrary habe ich mal als Grundwissen voraus gesetzt ;-) weil ja auch die Samples aus der MSDN mit GetProcAddress arbeiten. Das Problem mit der Uhrzeit ist mir auch schon aufgefallen.

Post A Comment
Title:
Name:
Email:
Website:
Comment:
Verification: