Index: chrome_frame/test_utils.cc |
diff --git a/chrome_frame/test_utils.cc b/chrome_frame/test_utils.cc |
index fd1ec78fde78f22dcbc0f12ef1d1dde5e4ce3c09..9c71f37fde4e192ca638be2861f48fb26a5a61ff 100644 |
--- a/chrome_frame/test_utils.cc |
+++ b/chrome_frame/test_utils.cc |
@@ -7,7 +7,6 @@ |
#include <atlbase.h> |
#include <atlwin.h> |
#include <shellapi.h> |
-#include <winternl.h> |
#include <algorithm> |
@@ -17,7 +16,6 @@ |
#include "base/logging.h" |
#include "base/path_service.h" |
#include "base/process_util.h" |
-#include "base/string_util.h" |
#include "base/stringprintf.h" |
#include "base/utf_string_conversions.h" |
#include "base/win/scoped_handle.h" |
@@ -269,153 +267,6 @@ std::wstring ScopedChromeFrameRegistrar::GetChromeFrameDllPath() const { |
return new_chrome_frame_dll_path_; |
} |
-// TODO(robertshield): The following could be factored out into its own file. |
-namespace { |
- |
-typedef LONG WINAPI |
-NtQueryInformationProcess( |
- IN HANDLE ProcessHandle, |
- IN PROCESSINFOCLASS ProcessInformationClass, |
- OUT PVOID ProcessInformation, |
- IN ULONG ProcessInformationLength, |
- OUT PULONG ReturnLength OPTIONAL |
-); |
- |
-// Get the function pointer to NtQueryInformationProcess in NTDLL.DLL |
-static bool GetQIP(NtQueryInformationProcess** qip_func_ptr) { |
- static NtQueryInformationProcess* qip_func = |
- reinterpret_cast<NtQueryInformationProcess*>( |
- GetProcAddress(GetModuleHandle(L"ntdll.dll"), |
- "NtQueryInformationProcess")); |
- DCHECK(qip_func) << "Could not get pointer to NtQueryInformationProcess."; |
- *qip_func_ptr = qip_func; |
- return qip_func != NULL; |
-} |
- |
-// Get the command line of a process |
-bool GetCommandLineForProcess(uint32 process_id, std::wstring* cmd_line) { |
- DCHECK(process_id != 0); |
- DCHECK(cmd_line); |
- |
- // Open the process |
- base::win::ScopedHandle process_handle(::OpenProcess( |
- PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, |
- false, |
- process_id)); |
- if (!process_handle) { |
- DLOG(ERROR) << "Failed to open process " << process_id << ", last error = " |
- << GetLastError(); |
- } |
- |
- // Obtain Process Environment Block |
- NtQueryInformationProcess* qip_func = NULL; |
- if (process_handle) { |
- GetQIP(&qip_func); |
- } |
- |
- // Read the address of the process params from the peb. |
- DWORD process_params_address = 0; |
- if (qip_func) { |
- PROCESS_BASIC_INFORMATION info = { 0 }; |
- // NtQueryInformationProcess returns an NTSTATUS for whom negative values |
- // are negative. Just check for that instead of pulling in DDK macros. |
- if ((qip_func(process_handle.Get(), |
- ProcessBasicInformation, |
- &info, |
- sizeof(info), |
- NULL)) < 0) { |
- DLOG(ERROR) << "Failed to invoke NtQueryProcessInformation, last error = " |
- << GetLastError(); |
- } else { |
- BYTE* peb = reinterpret_cast<BYTE*>(info.PebBaseAddress); |
- |
- // The process command line parameters are (or were once) located at |
- // the base address of the PEB + 0x10 for 32 bit processes. 64 bit |
- // processes have a different PEB struct as per |
- // http://msdn.microsoft.com/en-us/library/aa813706(VS.85).aspx. |
- // TODO(robertshield): See about doing something about this. |
- SIZE_T bytes_read = 0; |
- if (!::ReadProcessMemory(process_handle.Get(), |
- peb + 0x10, |
- &process_params_address, |
- sizeof(process_params_address), |
- &bytes_read)) { |
- DLOG(ERROR) << "Failed to read process params address, last error = " |
- << GetLastError(); |
- } |
- } |
- } |
- |
- // Copy all the process parameters into a buffer. |
- bool success = false; |
- std::wstring buffer; |
- if (process_params_address) { |
- SIZE_T bytes_read; |
- RTL_USER_PROCESS_PARAMETERS params = { 0 }; |
- if (!::ReadProcessMemory(process_handle.Get(), |
- reinterpret_cast<void*>(process_params_address), |
- ¶ms, |
- sizeof(params), |
- &bytes_read)) { |
- DLOG(ERROR) << "Failed to read RTL_USER_PROCESS_PARAMETERS, " |
- << "last error = " << GetLastError(); |
- } else { |
- // Read the command line parameter |
- const int max_cmd_line_len = std::min( |
- static_cast<int>(params.CommandLine.MaximumLength), |
- 4096); |
- buffer.resize(max_cmd_line_len + 1); |
- if (!::ReadProcessMemory(process_handle.Get(), |
- params.CommandLine.Buffer, |
- &buffer[0], |
- max_cmd_line_len, |
- &bytes_read)) { |
- DLOG(ERROR) << "Failed to copy process command line, " |
- << "last error = " << GetLastError(); |
- } else { |
- *cmd_line = buffer; |
- success = true; |
- } |
- } |
- } |
- |
- return success; |
-} |
- |
-// Used to filter processes by process ID. |
-class ArgumentFilter : public base::ProcessFilter { |
- public: |
- explicit ArgumentFilter(const std::wstring& argument) |
- : argument_to_find_(argument) {} |
- |
- // Returns true to indicate set-inclusion and false otherwise. This method |
- // should not have side-effects and should be idempotent. |
- virtual bool Includes(const base::ProcessEntry& entry) const { |
- bool found = false; |
- std::wstring command_line; |
- if (GetCommandLineForProcess(entry.pid(), &command_line)) { |
- std::wstring::const_iterator it = |
- std::search(command_line.begin(), |
- command_line.end(), |
- argument_to_find_.begin(), |
- argument_to_find_.end(), |
- base::CaseInsensitiveCompareASCII<wchar_t>()); |
- found = (it != command_line.end()); |
- } |
- return found; |
- } |
- |
- protected: |
- std::wstring argument_to_find_; |
-}; |
- |
-} // namespace |
- |
-bool KillAllNamedProcessesWithArgument(const std::wstring& process_name, |
- const std::wstring& argument) { |
- return base::KillProcesses(process_name, 0, &ArgumentFilter(argument)); |
-} |
- |
bool IsWorkstationLocked() { |
bool is_locked = true; |
HDESK input_desk = ::OpenInputDesktop(0, 0, GENERIC_READ); |