static void test_RemoteDebugger(void) { BOOL bret, present; if(!pCheckRemoteDebuggerPresent) { win_skip("CheckRemoteDebuggerPresent is not available\n"); return; } present = TRUE; SetLastError(0xdeadbeef); bret = pCheckRemoteDebuggerPresent(GetCurrentProcess(),&present); ok(bret , "expected CheckRemoteDebuggerPresent to succeed\n"); ok(0xdeadbeef == GetLastError(), "expected error to be unchanged, got %d/%x\n",GetLastError(), GetLastError()); present = TRUE; SetLastError(0xdeadbeef); bret = pCheckRemoteDebuggerPresent(NULL,&present); ok(!bret , "expected CheckRemoteDebuggerPresent to fail\n"); ok(present, "expected parameter to be unchanged\n"); ok(ERROR_INVALID_PARAMETER == GetLastError(), "expected error ERROR_INVALID_PARAMETER, got %d/%x\n",GetLastError(), GetLastError()); SetLastError(0xdeadbeef); bret = pCheckRemoteDebuggerPresent(GetCurrentProcess(),NULL); ok(!bret , "expected CheckRemoteDebuggerPresent to fail\n"); ok(ERROR_INVALID_PARAMETER == GetLastError(), "expected error ERROR_INVALID_PARAMETER, got %d/%x\n",GetLastError(), GetLastError()); }
static void doChild(int argc, char **argv) { struct child_blackbox blackbox; const char *blackbox_file; HANDLE parent; DWORD ppid; BOOL debug; BOOL ret; blackbox_file = argv[4]; sscanf(argv[3], "%08x", &ppid); parent = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ppid); child_ok(!!parent, "OpenProcess failed, last error %#x.\n", GetLastError()); ret = pCheckRemoteDebuggerPresent(parent, &debug); child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); child_ok(!debug, "Expected debug == 0, got %#x.\n", debug); ret = DebugActiveProcess(ppid); child_ok(ret, "DebugActiveProcess failed, last error %#x.\n", GetLastError()); ret = pCheckRemoteDebuggerPresent(parent, &debug); child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); child_ok(debug, "Expected debug != 0, got %#x.\n", debug); ret = pDebugActiveProcessStop(ppid); child_ok(ret, "DebugActiveProcessStop failed, last error %#x.\n", GetLastError()); ret = pCheckRemoteDebuggerPresent(parent, &debug); child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); child_ok(!debug, "Expected debug == 0, got %#x.\n", debug); ret = CloseHandle(parent); child_ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); ret = pIsDebuggerPresent(); child_ok(ret, "Expected ret != 0, got %#x.\n", ret); ret = pCheckRemoteDebuggerPresent(GetCurrentProcess(), &debug); child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); child_ok(debug, "Expected debug != 0, got %#x.\n", debug); if (pNtCurrentTeb) { pNtCurrentTeb()->Peb->BeingDebugged = FALSE; ret = pIsDebuggerPresent(); child_ok(!ret, "Expected ret != 0, got %#x.\n", ret); ret = pCheckRemoteDebuggerPresent(GetCurrentProcess(), &debug); child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); child_ok(debug, "Expected debug != 0, got %#x.\n", debug); pNtCurrentTeb()->Peb->BeingDebugged = TRUE; } blackbox.failures = child_failures; save_blackbox(blackbox_file, &blackbox, sizeof(blackbox)); }
static void test_debug_loop(int argc, char **argv) { const char *arguments = " debugger child "; struct child_blackbox blackbox; char blackbox_file[MAX_PATH]; PROCESS_INFORMATION pi; STARTUPINFOA si; BOOL debug; DWORD pid; char *cmd; BOOL ret; if (!pDebugActiveProcessStop || !pCheckRemoteDebuggerPresent) { win_skip("DebugActiveProcessStop or CheckRemoteDebuggerPresent not available, skipping test.\n"); return; } pid = GetCurrentProcessId(); ret = DebugActiveProcess(pid); ok(!ret, "DebugActiveProcess() succeeded on own process.\n"); get_file_name(blackbox_file); cmd = HeapAlloc(GetProcessHeap(), 0, strlen(argv[0]) + strlen(arguments) + strlen(blackbox_file) + 10); sprintf(cmd, "%s%s%08x %s", argv[0], arguments, pid, blackbox_file); memset(&si, 0, sizeof(si)); si.cb = sizeof(si); ret = CreateProcessA(NULL, cmd, NULL, NULL, FALSE, DEBUG_PROCESS, NULL, NULL, &si, &pi); ok(ret, "CreateProcess failed, last error %#x.\n", GetLastError()); HeapFree(GetProcessHeap(), 0, cmd); ret = pCheckRemoteDebuggerPresent(pi.hProcess, &debug); ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); ok(debug, "Expected debug != 0, got %#x.\n", debug); for (;;) { DEBUG_EVENT ev; ret = WaitForDebugEvent(&ev, INFINITE); ok(ret, "WaitForDebugEvent failed, last error %#x.\n", GetLastError()); if (!ret) break; if (ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) break; ret = ContinueDebugEvent(ev.dwProcessId, ev.dwThreadId, DBG_CONTINUE); ok(ret, "ContinueDebugEvent failed, last error %#x.\n", GetLastError()); if (!ret) break; } ret = CloseHandle(pi.hThread); ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); ret = CloseHandle(pi.hProcess); ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); load_blackbox(blackbox_file, &blackbox, sizeof(blackbox)); ok(!blackbox.failures, "Got %d failures from child process.\n", blackbox.failures); ret = DeleteFileA(blackbox_file); ok(ret, "DeleteFileA failed, last error %#x.\n", GetLastError()); }
static void test_debug_children(char *name, DWORD flag, BOOL debug_child) { const char *arguments = "debugger children"; struct child_blackbox blackbox; char blackbox_file[MAX_PATH], *p; char event_name[MAX_PATH]; PROCESS_INFORMATION pi; STARTUPINFOA si; HANDLE event_init, event_attach; char *cmd; BOOL debug, ret; BOOL got_child_event = FALSE; if (!pDebugActiveProcessStop || !pCheckRemoteDebuggerPresent) { win_skip("DebugActiveProcessStop or CheckRemoteDebuggerPresent not available, skipping test.\n"); return; } get_file_name(blackbox_file); cmd = HeapAlloc(GetProcessHeap(), 0, strlen(name) + strlen(arguments) + strlen(blackbox_file) + 5); sprintf(cmd, "%s %s \"%s\"", name, arguments, blackbox_file); p = strrchr(blackbox_file, '\\'); p = p ? p+1 : blackbox_file; strcpy(event_name, p); strcat(event_name, "_init"); event_init = CreateEventA(NULL, FALSE, FALSE, event_name); ok(event_init != NULL, "OpenEvent failed, last error %d.\n", GetLastError()); p = strrchr(blackbox_file, '\\'); p = p ? p+1 : blackbox_file; strcpy(event_name, p); strcat(event_name, "_attach"); event_attach = CreateEventA(NULL, FALSE, flag!=0, event_name); ok(event_attach != NULL, "CreateEvent failed, last error %d.\n", GetLastError()); memset(&si, 0, sizeof(si)); si.cb = sizeof(si); ret = CreateProcessA(NULL, cmd, NULL, NULL, FALSE, flag, NULL, NULL, &si, &pi); ok(ret, "CreateProcess failed, last error %d.\n", GetLastError()); HeapFree(GetProcessHeap(), 0, cmd); if (!flag) { WaitForSingleObject(event_init, INFINITE); ret = DebugActiveProcess(pi.dwProcessId); ok(ret, "DebugActiveProcess failed, last error %d.\n", GetLastError()); ret = SetEvent(event_attach); ok(ret, "SetEvent failed, last error %d.\n", GetLastError()); } ret = pCheckRemoteDebuggerPresent(pi.hProcess, &debug); ok(ret, "CheckRemoteDebuggerPresent failed, last error %d.\n", GetLastError()); ok(debug, "Expected debug != 0, got %x.\n", debug); for (;;) { DEBUG_EVENT ev; ret = WaitForDebugEvent(&ev, INFINITE); ok(ret, "WaitForDebugEvent failed, last error %d.\n", GetLastError()); if (!ret) break; if (ev.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT && ev.dwProcessId==pi.dwProcessId) break; else if (ev.dwProcessId != pi.dwProcessId) got_child_event = TRUE; ret = ContinueDebugEvent(ev.dwProcessId, ev.dwThreadId, DBG_CONTINUE); ok(ret, "ContinueDebugEvent failed, last error %d.\n", GetLastError()); if (!ret) break; } if(debug_child) ok(got_child_event, "didn't get any child events (flag: %x).\n", flag); else ok(!got_child_event, "got child event (flag: %x).\n", flag); CloseHandle(event_init); CloseHandle(event_attach); ret = CloseHandle(pi.hThread); ok(ret, "CloseHandle failed, last error %d.\n", GetLastError()); ret = CloseHandle(pi.hProcess); ok(ret, "CloseHandle failed, last error %d.\n", GetLastError()); load_blackbox(blackbox_file, &blackbox, sizeof(blackbox)); ok(!blackbox.failures, "Got %d failures from child process.\n", blackbox.failures); ret = DeleteFileA(blackbox_file); ok(ret, "DeleteFileA failed, last error %d.\n", GetLastError()); }