static void doChildren(int argc, char **argv) { const char *arguments = "debugger children last"; struct child_blackbox blackbox; const char *blackbox_file, *p; char event_name[MAX_PATH]; PROCESS_INFORMATION pi; STARTUPINFOA si; HANDLE event; char *cmd; BOOL ret; if (!strcmp(argv[3], "last")) return; blackbox_file = argv[3]; p = strrchr(blackbox_file, '\\'); p = p ? p+1 : blackbox_file; strcpy(event_name, p); strcat(event_name, "_init"); event = OpenEventA(EVENT_ALL_ACCESS, FALSE, event_name); child_ok(event != NULL, "OpenEvent failed, last error %d.\n", GetLastError()); SetEvent(event); CloseHandle(event); p = strrchr(blackbox_file, '\\'); p = p ? p+1 : blackbox_file; strcpy(event_name, p); strcat(event_name, "_attach"); event = OpenEventA(EVENT_ALL_ACCESS, FALSE, event_name); child_ok(event != NULL, "OpenEvent failed, last error %d.\n", GetLastError()); WaitForSingleObject(event, INFINITE); CloseHandle(event); cmd = HeapAlloc(GetProcessHeap(), 0, strlen(argv[0]) + strlen(arguments) + 2); sprintf(cmd, "%s %s", argv[0], arguments); memset(&si, 0, sizeof(si)); si.cb = sizeof(si); ret = CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); child_ok(ret, "CreateProcess failed, last error %d.\n", GetLastError()); child_ok(WaitForSingleObject(pi.hProcess, 10000) == WAIT_OBJECT_0, "Timed out waiting for the child to exit\n"); ret = CloseHandle(pi.hThread); child_ok(ret, "CloseHandle failed, last error %d.\n", GetLastError()); ret = CloseHandle(pi.hProcess); child_ok(ret, "CloseHandle failed, last error %d.\n", GetLastError()); blackbox.failures = child_failures; save_blackbox(blackbox_file, &blackbox, sizeof(blackbox)); HeapFree(GetProcessHeap(), 0, cmd); }
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)); }