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 doDebugger(int argc, char** argv) { const char* logfile; debugger_blackbox_t blackbox; HANDLE start_event, done_event, debug_event; blackbox.argc=argc; logfile=(argc >= 4 ? argv[3] : NULL); blackbox.pid=(argc >= 5 ? atol(argv[4]) : 0); if (strstr(myARGV[2], "attach")) { blackbox.attach_rc=DebugActiveProcess(blackbox.pid); if (!blackbox.attach_rc) blackbox.attach_err=GetLastError(); } else blackbox.attach_rc=TRUE; debug_event=(argc >= 6 ? (HANDLE)atol(argv[5]) : NULL); if (debug_event && strstr(myARGV[2], "event")) { blackbox.debug_rc=SetEvent(debug_event); if (!blackbox.debug_rc) blackbox.debug_err=GetLastError(); } else blackbox.debug_rc=TRUE; get_events(logfile, &start_event, &done_event); if (strstr(myARGV[2], "order")) { trace("debugger: waiting for the start signal...\n"); WaitForSingleObject(start_event, INFINITE); } if (strstr(myARGV[2], "nokill")) { blackbox.nokill_rc=pDebugSetProcessKillOnExit(FALSE); if (!blackbox.nokill_rc) blackbox.nokill_err=GetLastError(); } else blackbox.nokill_rc=TRUE; if (strstr(myARGV[2], "detach")) { blackbox.detach_rc=pDebugActiveProcessStop(blackbox.pid); if (!blackbox.detach_rc) blackbox.detach_err=GetLastError(); } else blackbox.detach_rc=TRUE; save_blackbox(logfile, &blackbox, sizeof(blackbox)); trace("debugger: done debugging...\n"); SetEvent(done_event); /* Just exit with a known value */ ExitProcess(0xdeadbeef); }