Index: tools/CrashProcess/crash_process.cc |
diff --git a/tools/CrashProcess/crash_process.cc b/tools/CrashProcess/crash_process.cc |
deleted file mode 100644 |
index cb72e792841835f14ae5687472b0a05de869dcbf..0000000000000000000000000000000000000000 |
--- a/tools/CrashProcess/crash_process.cc |
+++ /dev/null |
@@ -1,111 +0,0 @@ |
-// Copyright 2004-2009 Google Inc. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// ======================================================================== |
-// |
-// Tool to crash the specified process. |
-// Injects a remote thread into the named process and causes |
-// this thread to crash. |
-// Options: |
-// 1. Crash by injecting a thread that tries to execute a non-existent code |
-// location. |
-// 2. Crash by Raising a specific exception. |
-// TODO(omaha): Figure out a way to implement: |
-// 3. Crash another thread of the process. |
-// 4. Crash another thread when it enters a particular function. |
-// 5. Crash another thread when it leaves a particular function. |
-// |
-// For now the process name and the address of the crash are hard coded. |
- |
-#include <windows.h> |
-#include <wtypes.h> |
-#include <tchar.h> |
-#include <psapi.h> |
- |
-const int kMaxProcesses = 1024; |
- |
-int _tmain(int argc, TCHAR* argv[]) { |
- if (2 != argc) { |
- wprintf(_T("Incorrect syntax. The single required argument is the ") |
- _T("executable to crash.\n")); |
- return -1; |
- } |
- |
- const TCHAR* target_process_name = argv[1]; |
- |
- DWORD num_processes = 0; |
- DWORD process_ids[kMaxProcesses] = {0}; |
- if (!::EnumProcesses(process_ids, kMaxProcesses, &num_processes)) { |
- wprintf(_T("EnumProcesses failed.\n")); |
- return -1; |
- } |
- |
- wprintf(_T("Found %u processes.\n"), num_processes); |
- bool found = false; |
- for (size_t i = 0; i < num_processes && !found; ++i) { |
- const DWORD access_rights = PROCESS_CREATE_THREAD | |
- PROCESS_QUERY_INFORMATION | |
- PROCESS_VM_OPERATION | |
- PROCESS_VM_WRITE | |
- PROCESS_VM_READ; |
- HANDLE process_handle = ::OpenProcess(access_rights, |
- FALSE, |
- process_ids[i]); |
- if (process_handle) { |
- TCHAR process_name[1024] = {0}; |
- if (::GetProcessImageFileName(process_handle, process_name, 1024) != 0) { |
- size_t len = wcslen(target_process_name); |
- size_t total_len = wcslen(process_name); |
- int offset = total_len - len; |
- if (offset >= 0 && |
- _wcsicmp(&(process_name[offset]), target_process_name) == 0) { |
- found = true; |
- wprintf(_T("Found %s %u. Injecting a crash.\n"), |
- target_process_name, process_ids[i]); |
- DWORD thread_id = 0; |
- LPTHREAD_START_ROUTINE func = |
- reinterpret_cast<LPTHREAD_START_ROUTINE>(0x12345678); |
- void* addr_of_param = reinterpret_cast<void*>(0x2491ed8); |
- HANDLE thread_handle = ::CreateRemoteThread(process_handle, |
- NULL, |
- 0, |
- func, |
- addr_of_param, |
- CREATE_SUSPENDED, |
- &thread_id); |
- if (!thread_handle) { |
- HRESULT hr = HRESULT_FROM_WIN32(::GetLastError()); |
- wprintf(_T("CreateRemoteThread failed.\n")); |
- } |
- if (::ResumeThread(thread_handle) == -1) { |
- wprintf(_T("Resume thread failed.\n")); |
- } else { |
- wprintf(_T("Waiting for process to quit.\n")); |
- ::WaitForSingleObject(thread_handle, 2000); |
- } |
- } |
- } |
- |
- ::CloseHandle(process_handle); |
- } |
- } |
- |
- if (!found) { |
- wprintf(_T("No %s processes found.\n"), target_process_name); |
- } else { |
- wprintf(_T("Done.\n")); |
- } |
- |
- return 0; |
-} |
- |