static void test_ExitCode(void) { static const char* AeDebug="Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug"; char test_exe[MAX_PATH]; DWORD ret; HKEY hkey; DWORD disposition; LPBYTE auto_val=NULL; DWORD auto_size, auto_type; LPBYTE debugger_val=NULL; DWORD debugger_size, debugger_type; GetModuleFileNameA(GetModuleHandle(NULL), test_exe, sizeof(test_exe)); if (GetFileAttributes(test_exe) == INVALID_FILE_ATTRIBUTES) strcat(test_exe, ".so"); if (GetFileAttributesA(test_exe) == INVALID_FILE_ATTRIBUTES) { ok(0, "could not find the test executable '%s'\n", test_exe); return; } ret=RegCreateKeyExA(HKEY_LOCAL_MACHINE, AeDebug, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &disposition); if (ret == ERROR_SUCCESS) { auto_size=0; ret=RegQueryValueExA(hkey, "auto", NULL, &auto_type, NULL, &auto_size); if (ret == ERROR_SUCCESS) { auto_val=HeapAlloc(GetProcessHeap(), 0, auto_size); RegQueryValueExA(hkey, "auto", NULL, &auto_type, auto_val, &auto_size); } debugger_size=0; ret=RegQueryValueExA(hkey, "debugger", NULL, &debugger_type, NULL, &debugger_size); if (ret == ERROR_SUCCESS) { debugger_val=HeapAlloc(GetProcessHeap(), 0, debugger_size); RegQueryValueExA(hkey, "debugger", NULL, &debugger_type, debugger_val, &debugger_size); } } else if (ret == ERROR_ACCESS_DENIED) { skip("not enough privileges to change the debugger\n"); return; } else if (ret != ERROR_FILE_NOT_FOUND) { ok(0, "could not open the AeDebug key: %d\n", ret); return; } if (debugger_val && debugger_type == REG_SZ && strstr((char*)debugger_val, "winedbg --auto")) crash_and_winedbg(hkey, test_exe); crash_and_debug(hkey, test_exe, "dbg,none"); crash_and_debug(hkey, test_exe, "dbg,event,order"); crash_and_debug(hkey, test_exe, "dbg,attach,event,code2"); if (pDebugSetProcessKillOnExit) crash_and_debug(hkey, test_exe, "dbg,attach,event,nokill"); if (pDebugActiveProcessStop) crash_and_debug(hkey, test_exe, "dbg,attach,event,detach"); if (disposition == REG_CREATED_NEW_KEY) { RegCloseKey(hkey); RegDeleteKeyA(HKEY_LOCAL_MACHINE, AeDebug); } else { if (auto_val) { RegSetValueExA(hkey, "auto", 0, auto_type, auto_val, auto_size); HeapFree(GetProcessHeap(), 0, auto_val); } else RegDeleteValueA(hkey, "auto"); if (debugger_val) { RegSetValueExA(hkey, "debugger", 0, debugger_type, debugger_val, debugger_size); HeapFree(GetProcessHeap(), 0, debugger_val); } else RegDeleteValueA(hkey, "debugger"); RegCloseKey(hkey); } }
static void test_ExitCode(void) { static const char* AeDebug="Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug"; static const char* WineDbg="Software\\Wine\\WineDbg"; char test_exe[MAX_PATH]; DWORD ret; HKEY hkey; DWORD disposition; reg_save_value auto_value; reg_save_value debugger_value; GetModuleFileNameA(GetModuleHandle(NULL), test_exe, sizeof(test_exe)); if (GetFileAttributes(test_exe) == INVALID_FILE_ATTRIBUTES) strcat(test_exe, ".so"); if (GetFileAttributesA(test_exe) == INVALID_FILE_ATTRIBUTES) { ok(0, "could not find the test executable '%s'\n", test_exe); return; } ret=RegCreateKeyExA(HKEY_LOCAL_MACHINE, AeDebug, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &disposition); if (ret == ERROR_SUCCESS) { save_value(hkey, "auto", &auto_value); save_value(hkey, "debugger", &debugger_value); trace("HKLM\\%s\\debugger is set to '%s'\n", AeDebug, debugger_value.data); } else if (ret == ERROR_ACCESS_DENIED) { skip("not enough privileges to change the debugger\n"); return; } else if (ret != ERROR_FILE_NOT_FOUND) { ok(0, "could not open the AeDebug key: %d\n", ret); return; } if (debugger_value.data && debugger_value.type == REG_SZ && strstr((char*)debugger_value.data, "winedbg --auto")) { HKEY hkeyWinedbg; ret=RegCreateKeyA(HKEY_CURRENT_USER, WineDbg, &hkeyWinedbg); if (ret == ERROR_SUCCESS) { static DWORD zero; reg_save_value crash_dlg_value; save_value(hkeyWinedbg, "ShowCrashDialog", &crash_dlg_value); RegSetValueExA(hkeyWinedbg, "ShowCrashDialog", 0, REG_DWORD, (BYTE *)&zero, sizeof(DWORD)); crash_and_winedbg(hkey, test_exe); restore_value(hkeyWinedbg, &crash_dlg_value); RegCloseKey(hkeyWinedbg); } else ok(0, "Couldn't access WineDbg Key - error %u\n", ret); } if (winetest_interactive) /* Since the debugging process never sets the debug event, it isn't recognized as a valid debugger and, after the debugger exits, Windows will show a dialog box asking the user what to do */ crash_and_debug(hkey, test_exe, "dbg,none"); else skip("\"none\" debugger test needs user interaction\n"); if (disposition == REG_CREATED_NEW_KEY) win_skip("'dbg,event,order' test doesn't finish on Win9x/WinMe\n"); else crash_and_debug(hkey, test_exe, "dbg,event,order"); crash_and_debug(hkey, test_exe, "dbg,attach,event,code2"); if (pDebugSetProcessKillOnExit) crash_and_debug(hkey, test_exe, "dbg,attach,event,nokill"); else win_skip("DebugSetProcessKillOnExit is not available\n"); if (pDebugActiveProcessStop) crash_and_debug(hkey, test_exe, "dbg,attach,event,detach"); else win_skip("DebugActiveProcessStop is not available\n"); if (disposition == REG_CREATED_NEW_KEY) { RegCloseKey(hkey); RegDeleteKeyA(HKEY_LOCAL_MACHINE, AeDebug); } else { restore_value(hkey, &auto_value); restore_value(hkey, &debugger_value); RegCloseKey(hkey); } }