Alexandre Julliard : kernel32: Make sure the 32/ 64-bit state of the wineprefix matches the binary we are running.

Alexandre Julliard julliard at winehq.org
Wed Oct 21 13:14:11 CDT 2009


Module: wine
Branch: master
Commit: f86d10ffb6a36073786f1beb4a764348dbde8bd4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f86d10ffb6a36073786f1beb4a764348dbde8bd4

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Oct 21 18:03:32 2009 +0200

kernel32: Make sure the 32/64-bit state of the wineprefix matches the binary we are running.

---

 dlls/kernel32/process.c |   26 +++++++++++++++++++++++---
 1 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index 7f0a218..f867cc9 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -906,10 +906,15 @@ static void start_wineboot( HANDLE handles[2] )
     }
     if (GetLastError() != ERROR_ALREADY_EXISTS)  /* we created it */
     {
-        static const WCHAR command_line[] = {'\\','w','i','n','e','b','o','o','t','.','e','x','e',' ','-','-','i','n','i','t',0};
+        static const WCHAR wineboot[] = {'\\','w','i','n','e','b','o','o','t','.','e','x','e',0};
+        static const WCHAR args[] = {' ','-','-','i','n','i','t',0};
+        const DWORD expected_type = (sizeof(void*) > sizeof(int) || is_wow64) ?
+                                     SCS_64BIT_BINARY : SCS_32BIT_BINARY;
         STARTUPINFOW si;
         PROCESS_INFORMATION pi;
-        WCHAR cmdline[MAX_PATH + sizeof(command_line)/sizeof(WCHAR)];
+        DWORD type;
+        void *redir;
+        WCHAR cmdline[MAX_PATH + (sizeof(wineboot) + sizeof(args)) / sizeof(WCHAR)];
 
         memset( &si, 0, sizeof(si) );
         si.cb = sizeof(si);
@@ -919,7 +924,21 @@ static void start_wineboot( HANDLE handles[2] )
         si.hStdError  = GetStdHandle( STD_ERROR_HANDLE );
 
         GetSystemDirectoryW( cmdline, MAX_PATH );
-        lstrcatW( cmdline, command_line );
+        lstrcatW( cmdline, wineboot );
+
+        Wow64DisableWow64FsRedirection( &redir );
+        if (GetBinaryTypeW( cmdline, &type ) && type != expected_type)
+        {
+            if (type == SCS_64BIT_BINARY)
+                MESSAGE( "wine: '%s' is a 64-bit prefix, it cannot be used with 32-bit Wine.\n",
+                     wine_get_config_dir() );
+            else
+                MESSAGE( "wine: '%s' is a 32-bit prefix, it cannot be used with %s Wine.\n",
+                     wine_get_config_dir(), is_wow64 ? "wow64" : "64-bit" );
+            ExitProcess( 1 );
+        }
+
+        lstrcatW( cmdline, args );
         if (CreateProcessW( NULL, cmdline, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi ))
         {
             TRACE( "started wineboot pid %04x tid %04x\n", pi.dwProcessId, pi.dwThreadId );
@@ -932,6 +951,7 @@ static void start_wineboot( HANDLE handles[2] )
             CloseHandle( handles[0] );
             handles[0] = 0;
         }
+        Wow64RevertWow64FsRedirection( redir );
     }
 }
 




More information about the wine-cvs mailing list