| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/process_util.h" | 5 #include "base/process_util.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 #include <winternl.h> | 8 #include <winternl.h> |
| 9 #include <psapi.h> | 9 #include <psapi.h> |
| 10 | 10 |
| 11 #include "base/histogram.h" | 11 #include "base/histogram.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/scoped_handle_win.h" | 13 #include "base/scoped_handle_win.h" |
| 14 #include "base/scoped_ptr.h" | 14 #include "base/scoped_ptr.h" |
| 15 | 15 |
| 16 namespace { | 16 namespace { |
| 17 | 17 |
| 18 // System pagesize. This value remains constant on x86/64 architectures. | 18 // System pagesize. This value remains constant on x86/64 architectures. |
| 19 const int PAGESIZE_KB = 4; | 19 const int PAGESIZE_KB = 4; |
| 20 | 20 |
| 21 // HeapSetInformation function pointer. | 21 // HeapSetInformation function pointer. |
| 22 typedef BOOL (WINAPI* HeapSetFn)(HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T); | 22 typedef BOOL (WINAPI* HeapSetFn)(HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T); |
| 23 | 23 |
| 24 } // namespace | 24 } // namespace |
| 25 | 25 |
| 26 namespace base { | 26 namespace base { |
| 27 | 27 |
| 28 int GetCurrentProcId() { | 28 ProcessId GetCurrentProcId() { |
| 29 return ::GetCurrentProcessId(); | 29 return ::GetCurrentProcessId(); |
| 30 } | 30 } |
| 31 | 31 |
| 32 ProcessHandle GetCurrentProcessHandle() { | 32 ProcessHandle GetCurrentProcessHandle() { |
| 33 return ::GetCurrentProcess(); | 33 return ::GetCurrentProcess(); |
| 34 } | 34 } |
| 35 | 35 |
| 36 ProcessHandle OpenProcessHandle(int pid) { | 36 ProcessHandle OpenProcessHandle(ProcessId pid) { |
| 37 return OpenProcess(PROCESS_DUP_HANDLE | PROCESS_TERMINATE, FALSE, pid); | 37 return OpenProcess(PROCESS_DUP_HANDLE | PROCESS_TERMINATE, FALSE, pid); |
| 38 } | 38 } |
| 39 | 39 |
| 40 void CloseProcessHandle(ProcessHandle process) { | 40 void CloseProcessHandle(ProcessHandle process) { |
| 41 CloseHandle(process); | 41 CloseHandle(process); |
| 42 } | 42 } |
| 43 | 43 |
| 44 // Helper for GetProcId() | 44 // Helper for GetProcId() |
| 45 bool GetProcIdViaGetProcessId(ProcessHandle process, DWORD* id) { | 45 bool GetProcIdViaGetProcessId(ProcessHandle process, DWORD* id) { |
| 46 // Dynamically get a pointer to GetProcessId(). | 46 // Dynamically get a pointer to GetProcessId(). |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 ProcessBasicInformation, | 93 ProcessBasicInformation, |
| 94 &info, sizeof info, | 94 &info, sizeof info, |
| 95 &bytes_returned); | 95 &bytes_returned); |
| 96 if (!SUCCEEDED(status) || (bytes_returned != (sizeof info))) | 96 if (!SUCCEEDED(status) || (bytes_returned != (sizeof info))) |
| 97 return false; | 97 return false; |
| 98 | 98 |
| 99 *id = static_cast<DWORD>(info.UniqueProcessId); | 99 *id = static_cast<DWORD>(info.UniqueProcessId); |
| 100 return true; | 100 return true; |
| 101 } | 101 } |
| 102 | 102 |
| 103 int GetProcId(ProcessHandle process) { | 103 ProcessId GetProcId(ProcessHandle process) { |
| 104 // Get a handle to |process| that has PROCESS_QUERY_INFORMATION rights. | 104 // Get a handle to |process| that has PROCESS_QUERY_INFORMATION rights. |
| 105 HANDLE current_process = GetCurrentProcess(); | 105 HANDLE current_process = GetCurrentProcess(); |
| 106 HANDLE process_with_query_rights; | 106 HANDLE process_with_query_rights; |
| 107 if (DuplicateHandle(current_process, process, current_process, | 107 if (DuplicateHandle(current_process, process, current_process, |
| 108 &process_with_query_rights, PROCESS_QUERY_INFORMATION, | 108 &process_with_query_rights, PROCESS_QUERY_INFORMATION, |
| 109 false, 0)) { | 109 false, 0)) { |
| 110 // Try to use GetProcessId(), if it exists. Fall back on | 110 // Try to use GetProcessId(), if it exists. Fall back on |
| 111 // NtQueryInformationProcess() otherwise (< Win XP SP1). | 111 // NtQueryInformationProcess() otherwise (< Win XP SP1). |
| 112 DWORD id; | 112 DWORD id; |
| 113 bool success = | 113 bool success = |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 | 153 |
| 154 bool LaunchApp(const CommandLine& cl, | 154 bool LaunchApp(const CommandLine& cl, |
| 155 bool wait, bool start_hidden, ProcessHandle* process_handle) { | 155 bool wait, bool start_hidden, ProcessHandle* process_handle) { |
| 156 return LaunchApp(cl.command_line_string(), wait, | 156 return LaunchApp(cl.command_line_string(), wait, |
| 157 start_hidden, process_handle); | 157 start_hidden, process_handle); |
| 158 } | 158 } |
| 159 | 159 |
| 160 // Attempts to kill the process identified by the given process | 160 // Attempts to kill the process identified by the given process |
| 161 // entry structure, giving it the specified exit code. | 161 // entry structure, giving it the specified exit code. |
| 162 // Returns true if this is successful, false otherwise. | 162 // Returns true if this is successful, false otherwise. |
| 163 bool KillProcessById(DWORD process_id, int exit_code, bool wait) { | 163 bool KillProcessById(ProcessId process_id, int exit_code, bool wait) { |
| 164 HANDLE process = OpenProcess(PROCESS_TERMINATE | SYNCHRONIZE, | 164 HANDLE process = OpenProcess(PROCESS_TERMINATE | SYNCHRONIZE, |
| 165 FALSE, // Don't inherit handle | 165 FALSE, // Don't inherit handle |
| 166 process_id); | 166 process_id); |
| 167 if (!process) | 167 if (!process) |
| 168 return false; | 168 return false; |
| 169 | 169 |
| 170 bool ret = KillProcess(process, exit_code, wait); | 170 bool ret = KillProcess(process, exit_code, wait); |
| 171 CloseHandle(process); | 171 CloseHandle(process); |
| 172 return ret; | 172 return ret; |
| 173 } | 173 } |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 void EnableTerminationOnHeapCorruption() { | 642 void EnableTerminationOnHeapCorruption() { |
| 643 // Ignore the result code. Supported on XP SP3 and Vista. | 643 // Ignore the result code. Supported on XP SP3 and Vista. |
| 644 HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); | 644 HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); |
| 645 } | 645 } |
| 646 | 646 |
| 647 void RaiseProcessToHighPriority() { | 647 void RaiseProcessToHighPriority() { |
| 648 SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); | 648 SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); |
| 649 } | 649 } |
| 650 | 650 |
| 651 } // namespace base | 651 } // namespace base |
| OLD | NEW |