OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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.h" | 5 #include "base/process.h" |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/process_util.h" | 8 #include "base/process_util.h" |
9 #include "base/win/windows_version.h" | 9 #include "base/win/windows_version.h" |
10 | 10 |
11 namespace base { | 11 namespace base { |
12 | 12 |
13 void Process::Close() { | 13 void Process::Close() { |
14 if (!process_) | 14 if (!process_) |
15 return; | 15 return; |
| 16 |
16 // Don't call CloseHandle on a pseudo-handle. | 17 // Don't call CloseHandle on a pseudo-handle. |
17 if (process_ != ::GetCurrentProcess()) { | 18 if (process_ != ::GetCurrentProcess()) |
18 // TODO(apatrick): Call NtCloseHandle directly, without going through the | 19 ::CloseHandle(process_); |
19 // import table to determine if CloseHandle is being hooked. | |
20 // http://crbug.com/81449. | |
21 HMODULE module = GetModuleHandle(L"ntdll.dll"); | |
22 typedef UINT (WINAPI *CloseHandlePtr)(HANDLE handle); | |
23 CloseHandlePtr close_handle = reinterpret_cast<CloseHandlePtr>( | |
24 GetProcAddress(module, "NtClose")); | |
25 close_handle(process_); | |
26 | |
27 // It used to look like this: | |
28 // ::CloseHandle(process_); | |
29 } | |
30 | 20 |
31 process_ = NULL; | 21 process_ = NULL; |
32 } | 22 } |
33 | 23 |
34 void Process::Terminate(int result_code) { | 24 void Process::Terminate(int result_code) { |
35 if (!process_) | 25 if (!process_) |
36 return; | 26 return; |
37 | 27 |
38 // TODO(apatrick): Call NtTerminateProcess directly, without going through the | 28 // Call NtTerminateProcess directly, without going through the import table, |
39 // import table to determine if TerminateProcess is being hooked. | 29 // which might have been hooked with a buggy replacement by third party |
40 // http://crbug.com/81449. | 30 // software. http://crbug.com/81449. |
41 HMODULE module = GetModuleHandle(L"ntdll.dll"); | 31 HMODULE module = GetModuleHandle(L"ntdll.dll"); |
42 typedef UINT (WINAPI *TerminateProcessPtr)(HANDLE handle, UINT code); | 32 typedef UINT (WINAPI *TerminateProcessPtr)(HANDLE handle, UINT code); |
43 TerminateProcessPtr terminate_process = reinterpret_cast<TerminateProcessPtr>( | 33 TerminateProcessPtr terminate_process = reinterpret_cast<TerminateProcessPtr>( |
44 GetProcAddress(module, "NtTerminateProcess")); | 34 GetProcAddress(module, "NtTerminateProcess")); |
45 terminate_process(process_, result_code); | 35 terminate_process(process_, result_code); |
46 | |
47 // It used to look like this: | |
48 // ::TerminateProcess(process_, result_code); | |
49 } | 36 } |
50 | 37 |
51 bool Process::IsProcessBackgrounded() const { | 38 bool Process::IsProcessBackgrounded() const { |
52 if (!process_) | 39 if (!process_) |
53 return false; // Failure case. | 40 return false; // Failure case. |
54 DWORD priority = GetPriority(); | 41 DWORD priority = GetPriority(); |
55 if (priority == 0) | 42 if (priority == 0) |
56 return false; // Failure case. | 43 return false; // Failure case. |
57 return ((priority == BELOW_NORMAL_PRIORITY_CLASS) || | 44 return ((priority == BELOW_NORMAL_PRIORITY_CLASS) || |
58 (priority == IDLE_PRIORITY_CLASS)); | 45 (priority == IDLE_PRIORITY_CLASS)); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 Process Process::Current() { | 78 Process Process::Current() { |
92 return Process(::GetCurrentProcess()); | 79 return Process(::GetCurrentProcess()); |
93 } | 80 } |
94 | 81 |
95 int Process::GetPriority() const { | 82 int Process::GetPriority() const { |
96 DCHECK(process_); | 83 DCHECK(process_); |
97 return ::GetPriorityClass(process_); | 84 return ::GetPriorityClass(process_); |
98 } | 85 } |
99 | 86 |
100 } // namespace base | 87 } // namespace base |
OLD | NEW |