Alexandre Julliard : winetest: Refuse to run if the WoW64 side of the registry is missing.
Alexandre Julliard
julliard at winehq.org
Mon Dec 27 10:03:57 CST 2010
Module: wine
Branch: master
Commit: 5b202367d5d3cd1a5caaab8f8166587f97cfb7fa
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b202367d5d3cd1a5caaab8f8166587f97cfb7fa
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Dec 27 14:45:17 2010 +0100
winetest: Refuse to run if the WoW64 side of the registry is missing.
---
programs/winetest/main.c | 64 ++++++++++++++++++++++++++++-----------------
1 files changed, 40 insertions(+), 24 deletions(-)
diff --git a/programs/winetest/main.c b/programs/winetest/main.c
index 5a7109a..f8c9ac2 100644
--- a/programs/winetest/main.c
+++ b/programs/winetest/main.c
@@ -61,6 +61,7 @@ static int nr_native_dlls;
static const char whitespace[] = " \t\r\n";
static const char testexe[] = "_test.exe";
static char build_id[64];
+static BOOL is_wow64;
/* filters for running only specific tests */
static char *filters[64];
@@ -149,25 +150,34 @@ static int running_under_wine (void)
static int check_mount_mgr(void)
{
- if (running_under_wine())
- {
- HANDLE handle = CreateFileA( "\\\\.\\MountPointManager", GENERIC_READ,
- FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0 );
- if (handle == INVALID_HANDLE_VALUE) return FALSE;
- CloseHandle( handle );
- }
+ HANDLE handle = CreateFileA( "\\\\.\\MountPointManager", GENERIC_READ,
+ FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0 );
+ if (handle == INVALID_HANDLE_VALUE) return FALSE;
+ CloseHandle( handle );
return TRUE;
}
+static int check_wow64_registry(void)
+{
+ char buffer[MAX_PATH];
+ DWORD type, size = MAX_PATH;
+ HKEY hkey;
+ BOOL ret;
+
+ if (!is_wow64) return TRUE;
+ if (RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion", &hkey ))
+ return FALSE;
+ ret = !RegQueryValueExA( hkey, "ProgramFilesDir (x86)", NULL, &type, (BYTE *)buffer, &size );
+ RegCloseKey( hkey );
+ return ret;
+}
+
static int check_display_driver(void)
{
- if (running_under_wine())
- {
- HWND hwnd = CreateWindowA( "STATIC", "", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
- 0, 0, GetModuleHandleA(0), 0 );
- if (!hwnd) return FALSE;
- DestroyWindow( hwnd );
- }
+ HWND hwnd = CreateWindowA( "STATIC", "", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
+ 0, 0, GetModuleHandleA(0), 0 );
+ if (!hwnd) return FALSE;
+ DestroyWindow( hwnd );
return TRUE;
}
@@ -232,11 +242,10 @@ static void print_version (void)
# error CPU unknown
#endif
OSVERSIONINFOEX ver;
- BOOL ext, wow64;
+ BOOL ext;
int is_win2k3_r2;
const char *(CDECL *wine_get_build_id)(void);
void (CDECL *wine_get_host_version)( const char **sysname, const char **release );
- BOOL (WINAPI *pIsWow64Process)(HANDLE hProcess, PBOOL Wow64Process);
BOOL (WINAPI *pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *);
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
@@ -246,10 +255,7 @@ static void print_version (void)
if (!GetVersionEx ((OSVERSIONINFO *) &ver))
report (R_FATAL, "Can't get OS version.");
}
- pIsWow64Process = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"),"IsWow64Process");
- if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &wow64 )) wow64 = FALSE;
-
- xprintf (" Platform=%s%s\n", platform, wow64 ? " (WOW64)" : "");
+ xprintf (" Platform=%s%s\n", platform, is_wow64 ? " (WOW64)" : "");
xprintf (" bRunningUnderWine=%d\n", running_under_wine ());
xprintf (" bRunningOnVisibleDesktop=%d\n", running_on_visible_desktop ());
xprintf (" Submitter=%s\n", email );
@@ -1041,6 +1047,7 @@ usage (void)
int main( int argc, char *argv[] )
{
+ BOOL (WINAPI *pIsWow64Process)(HANDLE hProcess, PBOOL Wow64Process);
char *logname = NULL, *outdir = NULL;
const char *extract = NULL;
const char *cp, *submit = NULL;
@@ -1051,6 +1058,9 @@ int main( int argc, char *argv[] )
if (!LoadStringA( 0, IDS_BUILD_ID, build_id, sizeof(build_id) )) build_id[0] = 0;
+ pIsWow64Process = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"),"IsWow64Process");
+ if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE;
+
for (i = 1; i < argc && argv[i]; i++)
{
if (!strcmp(argv[i], "--help")) {
@@ -1172,11 +1182,17 @@ int main( int argc, char *argv[] )
if (!running_on_visible_desktop ())
report (R_FATAL, "Tests must be run on a visible desktop");
- if (!check_mount_mgr())
- report (R_FATAL, "Mount manager not running, most likely your WINEPREFIX wasn't created correctly.");
+ if (running_under_wine())
+ {
+ if (!check_mount_mgr())
+ report (R_FATAL, "Mount manager not running, most likely your WINEPREFIX wasn't created correctly.");
+
+ if (!check_wow64_registry())
+ report (R_FATAL, "WoW64 keys missing, most likely your WINEPREFIX wasn't created correctly.");
- if (!check_display_driver())
- report (R_FATAL, "Unable to create a window, the display driver is not working.");
+ if (!check_display_driver())
+ report (R_FATAL, "Unable to create a window, the display driver is not working.");
+ }
SetConsoleCtrlHandler(ctrl_handler, TRUE);
More information about the wine-cvs
mailing list