From 177623b42c69743828b8bd0a40c0f07b072ba86d Mon Sep 17 00:00:00 2001 From: "cdn@chromium.org" Date: Tue, 20 Sep 2011 20:28:17 +0000 Subject: Move handle dumpage to the renderer process (so that it works correctly) and move handle enumerator into common. BUG=96488 TEST=N/A Review URL: http://codereview.chromium.org/7888024 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102004 0039d316-1c4b-4281-b951-d872f2087c98 --- content/browser/child_process_launcher.cc | 15 - content/browser/handle_enumerator_win.cc | 439 --------------------- content/browser/handle_enumerator_win.h | 79 ---- .../renderer_host/browser_render_process_host.cc | 17 + .../renderer_host/browser_render_process_host.h | 2 + .../renderer_host/mock_render_process_host.cc | 3 + .../renderer_host/mock_render_process_host.h | 1 + .../browser/renderer_host/render_process_host.cc | 19 + .../browser/renderer_host/render_process_host.h | 6 + content/common/child_process_messages.h | 6 + content/common/child_thread.cc | 19 + content/common/child_thread.h | 2 + content/common/content_switches.cc | 16 +- content/common/content_switches.h | 7 +- content/common/handle_enumerator_win.cc | 329 +++++++++++++++ content/common/handle_enumerator_win.h | 54 +++ content/content_browser.gypi | 2 - content/content_common.gypi | 2 + 18 files changed, 469 insertions(+), 549 deletions(-) delete mode 100644 content/browser/handle_enumerator_win.cc delete mode 100644 content/browser/handle_enumerator_win.h create mode 100644 content/common/handle_enumerator_win.cc create mode 100644 content/common/handle_enumerator_win.h (limited to 'content') diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc index e438989..1462e10 100644 --- a/content/browser/child_process_launcher.cc +++ b/content/browser/child_process_launcher.cc @@ -21,7 +21,6 @@ #if defined(OS_WIN) #include "base/file_path.h" -#include "content/browser/handle_enumerator_win.h" #include "content/common/sandbox_policy.h" #elif defined(OS_MACOSX) #include "content/browser/mach_broker_mac.h" @@ -237,20 +236,6 @@ class ChildProcessLauncher::Context if (!terminate_child_on_shutdown_) return; -#if defined(OS_WIN) - const CommandLine& browser_command_line = - *CommandLine::ForCurrentProcess(); - if (browser_command_line.HasSwitch(switches::kAuditHandles) || - browser_command_line.HasSwitch(switches::kAuditAllHandles)) { - scoped_refptr handle_enum( - new content::HandleEnumerator(process_.handle(), - browser_command_line.HasSwitch(switches::kAuditAllHandles))); - handle_enum->RunHandleEnumeration(); - process_.set_handle(base::kNullProcessHandle); - return; - } -#endif - // On Posix, EnsureProcessTerminated can lead to 2 seconds of sleep! So // don't this on the UI/IO threads. BrowserThread::PostTask( diff --git a/content/browser/handle_enumerator_win.cc b/content/browser/handle_enumerator_win.cc deleted file mode 100644 index 0d5ba51..0000000 --- a/content/browser/handle_enumerator_win.cc +++ /dev/null @@ -1,439 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/handle_enumerator_win.h" - -#include -#include - -#include "base/logging.h" -#include "base/process.h" -#include "base/process_util.h" -#include "base/utf_string_conversions.h" -#include "base/win/windows_version.h" -#include "content/browser/browser_child_process_host.h" -#include "content/browser/browser_thread.h" -#include "content/browser/renderer_host/render_process_host.h" -#include "content/common/result_codes.h" -#include "sandbox/src/handle_table.h" - -namespace { - -typedef std::map HandleTypeMap; - -HandleTypeMap& MakeHandleTypeMap() { - HandleTypeMap& handle_types = *(new HandleTypeMap()); - handle_types[sandbox::HandleTable::kTypeProcess] = content::ProcessHandle; - handle_types[sandbox::HandleTable::kTypeThread] = content::ThreadHandle; - handle_types[sandbox::HandleTable::kTypeFile] = content::FileHandle; - handle_types[sandbox::HandleTable::kTypeDirectory] = - content::DirectoryHandle; - handle_types[sandbox::HandleTable::kTypeKey] = content::KeyHandle; - handle_types[sandbox::HandleTable::kTypeWindowStation] = - content::WindowStationHandle; - handle_types[sandbox::HandleTable::kTypeDesktop] = content::DesktopHandle; - handle_types[sandbox::HandleTable::kTypeService] = content::ServiceHandle; - handle_types[sandbox::HandleTable::kTypeMutex] = content::MutexHandle; - handle_types[sandbox::HandleTable::kTypeSemaphore] = - content::SemaphoreHandle; - handle_types[sandbox::HandleTable::kTypeEvent] = content::EventHandle; - handle_types[sandbox::HandleTable::kTypeTimer] = content::TimerHandle; - handle_types[sandbox::HandleTable::kTypeNamedPipe] = - content::NamedPipeHandle; - handle_types[sandbox::HandleTable::kTypeJobObject] = content::JobHandle; - handle_types[sandbox::HandleTable::kTypeFileMap] = content::FileMapHandle; - handle_types[sandbox::HandleTable::kTypeAlpcPort] = - content::AlpcPortHandle; - - return handle_types; -} - -} // namespace - -namespace content { - -const wchar_t kNtdllDllName[] = L"ntdll.dll"; -const size_t kMaxHandleNameLength = 1024; - -void HandleEnumerator::EnumerateHandles() { - sandbox::HandleTable handles; - - string16 output = ProcessTypeString(type_); - output.append(ASCIIToUTF16(" Process - Handles at shutdown:\n")); - for (sandbox::HandleTable::Iterator sys_handle - = handles.HandlesForProcess(::GetProcessId(handle_)); - sys_handle != handles.end(); ++sys_handle) { - HandleType current_type = StringToHandleType(sys_handle->Type()); - if (!all_handles_ && (current_type != ProcessHandle && - current_type != FileHandle && - current_type != DirectoryHandle && - current_type != KeyHandle && - current_type != WindowStationHandle && - current_type != DesktopHandle && - current_type != ServiceHandle)) - continue; - - output += ASCIIToUTF16("["); - output += sys_handle->Type(); - output += ASCIIToUTF16("] ("); - output += sys_handle->Name(); - output += ASCIIToUTF16(")\n"); - output += GetAccessString(current_type, - sys_handle->handle_entry()->GrantedAccess); - } - LOG(INFO) << output; -} - -void HandleEnumerator::RunHandleEnumeration() { - DCHECK(status_ == Starting); - if (BrowserThread::CurrentlyOn(BrowserThread::IO)) - FindProcessOnIOThread(); - else if (BrowserThread::CurrentlyOn(BrowserThread::UI)) - FindProcessOnUIThread(); - else - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - NewRunnableMethod(this, - &HandleEnumerator::FindProcessOnIOThread)); -} - -void HandleEnumerator::FindProcessOnIOThread() { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - - for (BrowserChildProcessHost::Iterator iter; !iter.Done(); ++iter) { - if (iter->handle() == handle_) { - type_ = iter->type(); - status_ = Finished; - break; - } - } - - if (status_ == Starting) { - status_ = InProgress; - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - NewRunnableMethod(this, - &HandleEnumerator::FindProcessOnUIThread)); - } else { - status_ = Finished; - BrowserThread::PostTask( - BrowserThread::PROCESS_LAUNCHER, FROM_HERE, - NewRunnableMethod(this, - &HandleEnumerator::EnumerateHandlesAndTerminateProcess)); - } -} - -void HandleEnumerator::FindProcessOnUIThread() { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - - for (RenderProcessHost::iterator renderer_iter( - RenderProcessHost::AllHostsIterator()); !renderer_iter.IsAtEnd(); - renderer_iter.Advance()) { - RenderProcessHost* render_process_host = renderer_iter.GetCurrentValue(); - if (render_process_host->GetHandle() == handle_) { - type_ = ChildProcessInfo::RENDER_PROCESS; - status_ = Finished; - break; - } - } - - if (status_ == Starting) { - status_ = InProgress; - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - NewRunnableMethod(this, - &HandleEnumerator::FindProcessOnIOThread)); - } else { - status_ = Finished; - BrowserThread::PostTask( - BrowserThread::PROCESS_LAUNCHER, FROM_HERE, - NewRunnableMethod(this, - &HandleEnumerator::EnumerateHandlesAndTerminateProcess)); - } -} - -void HandleEnumerator::EnumerateHandlesAndTerminateProcess() { - HandleEnumerator::EnumerateHandles(); - base::Process process(handle_); - process.Terminate(content::RESULT_CODE_NORMAL_EXIT); - process.Close(); -} - -string16 ProcessTypeString(ChildProcessInfo::ProcessType process_type) { - switch (process_type) { - case ChildProcessInfo::UNKNOWN_PROCESS: - return ASCIIToUTF16("Unknown"); - case ChildProcessInfo::BROWSER_PROCESS: - return ASCIIToUTF16("Browser"); - case ChildProcessInfo::RENDER_PROCESS: - return ASCIIToUTF16("Renderer"); - case ChildProcessInfo::PLUGIN_PROCESS: - return ASCIIToUTF16("Plugin"); - case ChildProcessInfo::WORKER_PROCESS: - return ASCIIToUTF16("Worker"); - case ChildProcessInfo::NACL_LOADER_PROCESS: - return ASCIIToUTF16("NaCL Loader"); - case ChildProcessInfo::UTILITY_PROCESS: - return ASCIIToUTF16("Utility"); - case ChildProcessInfo::PROFILE_IMPORT_PROCESS: - return ASCIIToUTF16("Profile Import"); - case ChildProcessInfo::ZYGOTE_PROCESS: - return ASCIIToUTF16("Zygote"); - case ChildProcessInfo::SANDBOX_HELPER_PROCESS: - return ASCIIToUTF16("Sandbox Helper"); - case ChildProcessInfo::NACL_BROKER_PROCESS: - return ASCIIToUTF16("NaCL Broker"); - case ChildProcessInfo::GPU_PROCESS: - return ASCIIToUTF16("GPU"); - case ChildProcessInfo::PPAPI_PLUGIN_PROCESS: - return ASCIIToUTF16("Pepper Plugin"); - case ChildProcessInfo::PPAPI_BROKER_PROCESS: - return ASCIIToUTF16("Pepper Broker"); - default: - return string16(); - } -} - -HandleType StringToHandleType(const string16& type) { - static HandleTypeMap handle_types = MakeHandleTypeMap(); - HandleTypeMap::iterator result = handle_types.find(type); - return result != handle_types.end() ? result->second : OtherHandle; -} - -string16 GetAccessString(HandleType handle_type, - ACCESS_MASK access) { - string16 output; - if (access & GENERIC_READ) - output.append(ASCIIToUTF16("\tGENERIC_READ\n")); - if (access & GENERIC_WRITE) - output.append(ASCIIToUTF16("\tGENERIC_WRITE\n")); - if (access & GENERIC_EXECUTE) - output.append(ASCIIToUTF16("\tGENERIC_EXECUTE\n")); - if (access & GENERIC_ALL) - output.append(ASCIIToUTF16("\tGENERIC_ALL\n")); - if (access & DELETE) - output.append(ASCIIToUTF16("\tDELETE\n")); - if (access & READ_CONTROL) - output.append(ASCIIToUTF16("\tREAD_CONTROL\n")); - if (access & WRITE_DAC) - output.append(ASCIIToUTF16("\tWRITE_DAC\n")); - if (access & WRITE_OWNER) - output.append(ASCIIToUTF16("\tWRITE_OWNER\n")); - if (access & SYNCHRONIZE) - output.append(ASCIIToUTF16("\tSYNCHRONIZE\n")); - - switch (handle_type) { - case ProcessHandle: - if (access & PROCESS_CREATE_PROCESS) - output.append(ASCIIToUTF16("\tPROCESS_CREATE_PROCESS\n")); - if (access & PROCESS_CREATE_THREAD) - output.append(ASCIIToUTF16("\tPROCESS_CREATE_THREAD\n")); - if (access & PROCESS_DUP_HANDLE) - output.append(ASCIIToUTF16("\tPROCESS_DUP_HANDLE\n")); - if (access & PROCESS_QUERY_INFORMATION) - output.append(ASCIIToUTF16("\tPROCESS_QUERY_INFORMATION\n")); - if (access & PROCESS_QUERY_LIMITED_INFORMATION) - output.append(ASCIIToUTF16("\tPROCESS_QUERY_LIMITED_INFORMATION\n")); - if (access & PROCESS_SET_INFORMATION) - output.append(ASCIIToUTF16("\tPROCESS_SET_INFORMATION\n")); - if (access & PROCESS_SET_QUOTA) - output.append(ASCIIToUTF16("\tPROCESS_SET_QUOTA\n")); - if (access & PROCESS_SUSPEND_RESUME) - output.append(ASCIIToUTF16("\tPROCESS_SUSPEND_RESUME\n")); - if (access & PROCESS_TERMINATE) - output.append(ASCIIToUTF16("\tPROCESS_TERMINATE\n")); - if (access & PROCESS_VM_OPERATION) - output.append(ASCIIToUTF16("\tPROCESS_VM_OPERATION\n")); - if (access & PROCESS_VM_READ) - output.append(ASCIIToUTF16("\tPROCESS_VM_READ\n")); - if (access & PROCESS_VM_WRITE) - output.append(ASCIIToUTF16("\tPROCESS_VM_WRITE\n")); - break; - case ThreadHandle: - if (access & THREAD_DIRECT_IMPERSONATION) - output.append(ASCIIToUTF16("\tTHREAD_DIRECT_IMPERSONATION\n")); - if (access & THREAD_GET_CONTEXT) - output.append(ASCIIToUTF16("\tTHREAD_GET_CONTEXT\n")); - if (access & THREAD_IMPERSONATE) - output.append(ASCIIToUTF16("\tTHREAD_IMPERSONATE\n")); - if (access & THREAD_QUERY_INFORMATION ) - output.append(ASCIIToUTF16("\tTHREAD_QUERY_INFORMATION\n")); - if (access & THREAD_QUERY_LIMITED_INFORMATION) - output.append(ASCIIToUTF16("\tTHREAD_QUERY_LIMITED_INFORMATION\n")); - if (access & THREAD_SET_CONTEXT) - output.append(ASCIIToUTF16("\tTHREAD_SET_CONTEXT\n")); - if (access & THREAD_SET_INFORMATION) - output.append(ASCIIToUTF16("\tTHREAD_SET_INFORMATION\n")); - if (access & THREAD_SET_LIMITED_INFORMATION) - output.append(ASCIIToUTF16("\tTHREAD_SET_LIMITED_INFORMATION\n")); - if (access & THREAD_SET_THREAD_TOKEN) - output.append(ASCIIToUTF16("\tTHREAD_SET_THREAD_TOKEN\n")); - if (access & THREAD_SUSPEND_RESUME) - output.append(ASCIIToUTF16("\tTHREAD_SUSPEND_RESUME\n")); - if (access & THREAD_TERMINATE) - output.append(ASCIIToUTF16("\tTHREAD_TERMINATE\n")); - break; - case FileHandle: - if (access & FILE_APPEND_DATA) - output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n")); - if (access & FILE_EXECUTE) - output.append(ASCIIToUTF16("\tFILE_EXECUTE\n")); - if (access & FILE_READ_ATTRIBUTES) - output.append(ASCIIToUTF16("\tFILE_READ_ATTRIBUTES\n")); - if (access & FILE_READ_DATA) - output.append(ASCIIToUTF16("\tFILE_READ_DATA\n")); - if (access & FILE_READ_EA) - output.append(ASCIIToUTF16("\tFILE_READ_EA\n")); - if (access & FILE_WRITE_ATTRIBUTES) - output.append(ASCIIToUTF16("\tFILE_WRITE_ATTRIBUTES\n")); - if (access & FILE_WRITE_DATA) - output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n")); - if (access & FILE_WRITE_EA) - output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n")); - if (access & FILE_WRITE_EA) - output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n")); - break; - case DirectoryHandle: - if (access & FILE_ADD_FILE) - output.append(ASCIIToUTF16("\tFILE_ADD_FILE\n")); - if (access & FILE_ADD_SUBDIRECTORY) - output.append(ASCIIToUTF16("\tFILE_ADD_SUBDIRECTORY\n")); - if (access & FILE_APPEND_DATA) - output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n")); - if (access & FILE_DELETE_CHILD) - output.append(ASCIIToUTF16("\tFILE_DELETE_CHILD\n")); - if (access & FILE_LIST_DIRECTORY) - output.append(ASCIIToUTF16("\tFILE_LIST_DIRECTORY\n")); - if (access & FILE_READ_DATA) - output.append(ASCIIToUTF16("\tFILE_READ_DATA\n")); - if (access & FILE_TRAVERSE) - output.append(ASCIIToUTF16("\tFILE_TRAVERSE\n")); - if (access & FILE_WRITE_DATA) - output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n")); - break; - case KeyHandle: - if (access & KEY_CREATE_LINK) - output.append(ASCIIToUTF16("\tKEY_CREATE_LINK\n")); - if (access & KEY_CREATE_SUB_KEY) - output.append(ASCIIToUTF16("\tKEY_CREATE_SUB_KEY\n")); - if (access & KEY_ENUMERATE_SUB_KEYS) - output.append(ASCIIToUTF16("\tKEY_ENUMERATE_SUB_KEYS\n")); - if (access & KEY_EXECUTE) - output.append(ASCIIToUTF16("\tKEY_EXECUTE\n")); - if (access & KEY_NOTIFY) - output.append(ASCIIToUTF16("\tKEY_NOTIFY\n")); - if (access & KEY_QUERY_VALUE) - output.append(ASCIIToUTF16("\tKEY_QUERY_VALUE\n")); - if (access & KEY_READ) - output.append(ASCIIToUTF16("\tKEY_READ\n")); - if (access & KEY_SET_VALUE) - output.append(ASCIIToUTF16("\tKEY_SET_VALUE\n")); - if (access & KEY_WOW64_32KEY) - output.append(ASCIIToUTF16("\tKEY_WOW64_32KEY\n")); - if (access & KEY_WOW64_64KEY) - output.append(ASCIIToUTF16("\tKEY_WOW64_64KEY\n")); - break; - case WindowStationHandle: - if (access & WINSTA_ACCESSCLIPBOARD) - output.append(ASCIIToUTF16("\tWINSTA_ACCESSCLIPBOARD\n")); - if (access & WINSTA_ACCESSGLOBALATOMS) - output.append(ASCIIToUTF16("\tWINSTA_ACCESSGLOBALATOMS\n")); - if (access & WINSTA_CREATEDESKTOP) - output.append(ASCIIToUTF16("\tWINSTA_CREATEDESKTOP\n")); - if (access & WINSTA_ENUMDESKTOPS) - output.append(ASCIIToUTF16("\tWINSTA_ENUMDESKTOPS\n")); - if (access & WINSTA_ENUMERATE) - output.append(ASCIIToUTF16("\tWINSTA_ENUMERATE\n")); - if (access & WINSTA_EXITWINDOWS) - output.append(ASCIIToUTF16("\tWINSTA_EXITWINDOWS\n")); - if (access & WINSTA_READATTRIBUTES) - output.append(ASCIIToUTF16("\tWINSTA_READATTRIBUTES\n")); - if (access & WINSTA_READSCREEN) - output.append(ASCIIToUTF16("\tWINSTA_READSCREEN\n")); - if (access & WINSTA_WRITEATTRIBUTES) - output.append(ASCIIToUTF16("\tWINSTA_WRITEATTRIBUTES\n")); - break; - case DesktopHandle: - if (access & DESKTOP_CREATEMENU) - output.append(ASCIIToUTF16("\tDESKTOP_CREATEMENU\n")); - if (access & DESKTOP_CREATEWINDOW) - output.append(ASCIIToUTF16("\tDESKTOP_CREATEWINDOW\n")); - if (access & DESKTOP_ENUMERATE) - output.append(ASCIIToUTF16("\tDESKTOP_ENUMERATE\n")); - if (access & DESKTOP_HOOKCONTROL) - output.append(ASCIIToUTF16("\tDESKTOP_HOOKCONTROL\n")); - if (access & DESKTOP_JOURNALPLAYBACK) - output.append(ASCIIToUTF16("\tDESKTOP_JOURNALPLAYBACK\n")); - if (access & DESKTOP_JOURNALRECORD) - output.append(ASCIIToUTF16("\tDESKTOP_JOURNALRECORD\n")); - if (access & DESKTOP_READOBJECTS) - output.append(ASCIIToUTF16("\tDESKTOP_READOBJECTS\n")); - if (access & DESKTOP_SWITCHDESKTOP) - output.append(ASCIIToUTF16("\tDESKTOP_SWITCHDESKTOP\n")); - if (access & DESKTOP_WRITEOBJECTS) - output.append(ASCIIToUTF16("\tDESKTOP_WRITEOBJECTS\n")); - break; - case ServiceHandle: - if (access & SC_MANAGER_CREATE_SERVICE) - output.append(ASCIIToUTF16("\tSC_MANAGER_CREATE_SERVICE\n")); - if (access & SC_MANAGER_CONNECT) - output.append(ASCIIToUTF16("\tSC_MANAGER_CONNECT\n")); - if (access & SC_MANAGER_ENUMERATE_SERVICE ) - output.append(ASCIIToUTF16("\tSC_MANAGER_ENUMERATE_SERVICE\n")); - if (access & SC_MANAGER_LOCK) - output.append(ASCIIToUTF16("\tSC_MANAGER_LOCK\n")); - if (access & SC_MANAGER_MODIFY_BOOT_CONFIG ) - output.append(ASCIIToUTF16("\tSC_MANAGER_MODIFY_BOOT_CONFIG\n")); - if (access & SC_MANAGER_QUERY_LOCK_STATUS ) - output.append(ASCIIToUTF16("\tSC_MANAGER_QUERY_LOCK_STATUS\n")); - break; - case EventHandle: - if (access & EVENT_MODIFY_STATE) - output.append(ASCIIToUTF16("\tEVENT_MODIFY_STATE\n")); - break; - case MutexHandle: - if (access & MUTEX_MODIFY_STATE) - output.append(ASCIIToUTF16("\tMUTEX_MODIFY_STATE\n")); - break; - case SemaphoreHandle: - if (access & SEMAPHORE_MODIFY_STATE) - output.append(ASCIIToUTF16("\tSEMAPHORE_MODIFY_STATE\n")); - break; - case TimerHandle: - if (access & TIMER_MODIFY_STATE) - output.append(ASCIIToUTF16("\tTIMER_MODIFY_STATE\n")); - if (access & TIMER_QUERY_STATE) - output.append(ASCIIToUTF16("\tTIMER_QUERY_STATE\n")); - break; - case NamedPipeHandle: - if (access & PIPE_ACCESS_INBOUND) - output.append(ASCIIToUTF16("\tPIPE_ACCESS_INBOUND\n")); - if (access & PIPE_ACCESS_OUTBOUND) - output.append(ASCIIToUTF16("\tPIPE_ACCESS_OUTBOUND\n")); - break; - case JobHandle: - if (access & JOB_OBJECT_ASSIGN_PROCESS) - output.append(ASCIIToUTF16("\tJOB_OBJECT_ASSIGN_PROCESS\n")); - if (access & JOB_OBJECT_QUERY) - output.append(ASCIIToUTF16("\tJOB_OBJECT_QUERY\n")); - if (access & JOB_OBJECT_SET_ATTRIBUTES) - output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_ATTRIBUTES\n")); - if (access & JOB_OBJECT_SET_SECURITY_ATTRIBUTES) - output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_SECURITY_ATTRIBUTES\n")); - if (access & JOB_OBJECT_TERMINATE) - output.append(ASCIIToUTF16("\tJOB_OBJECT_TERMINATE\n")); - break; - case FileMapHandle: - if (access & FILE_MAP_EXECUTE) - output.append(ASCIIToUTF16("\tFILE_MAP_EXECUTE\n")); - if (access & FILE_MAP_READ) - output.append(ASCIIToUTF16("\tFILE_MAP_READ\n")); - if (access & FILE_MAP_WRITE) - output.append(ASCIIToUTF16("\tFILE_MAP_WRITE\n")); - break; - } - return output; -} - -} // namespace content diff --git a/content/browser/handle_enumerator_win.h b/content/browser/handle_enumerator_win.h deleted file mode 100644 index 12b426c..0000000 --- a/content/browser/handle_enumerator_win.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_HANDLE_ENUMERATOR_WIN_H_ -#define CONTENT_BROWSER_HANDLE_ENUMERATOR_WIN_H_ - -#include "base/memory/ref_counted.h" -#include "base/process.h" -#include "content/common/child_process_info.h" - -namespace content { - -enum HandleType { - ProcessHandle, - ThreadHandle, - FileHandle, - DirectoryHandle, - KeyHandle, - WindowStationHandle, - DesktopHandle, - ServiceHandle, - EventHandle, - MutexHandle, - SemaphoreHandle, - TimerHandle, - NamedPipeHandle, - JobHandle, - FileMapHandle, - AlpcPortHandle, - OtherHandle -}; - -static HandleType StringToHandleType(const string16& type); - -static string16 ProcessTypeString(ChildProcessInfo::ProcessType process_type); - -static string16 GetAccessString(HandleType handle_type, ACCESS_MASK access); - -class HandleEnumerator : public base::RefCountedThreadSafe { - public: - enum HandleEnumStatus { - Starting, - InProgress, - Finished - }; - - HandleEnumerator(base::ProcessHandle handle, bool all_handles): - handle_(handle), - type_(ChildProcessInfo::UNKNOWN_PROCESS), - status_(Starting), - all_handles_(all_handles) { } - - ChildProcessInfo::ProcessType type() const { return type_; } - - HandleEnumStatus status() const { return status_; } - - void RunHandleEnumeration(); - - void EnumerateHandles(); - - private: - void FindProcessOnIOThread(); - - void FindProcessOnUIThread(); - - void EnumerateHandlesAndTerminateProcess(); - - base::ProcessHandle handle_; - ChildProcessInfo::ProcessType type_; - HandleEnumStatus status_; - bool all_handles_; - - DISALLOW_COPY_AND_ASSIGN(HandleEnumerator); -}; - -} // namespace content - -#endif // CONTENT_BROWSER_HANDLE_ENUMERATOR_WIN_H_ diff --git a/content/browser/renderer_host/browser_render_process_host.cc b/content/browser/renderer_host/browser_render_process_host.cc index 3abf9fc..2efd8fb 100644 --- a/content/browser/renderer_host/browser_render_process_host.cc +++ b/content/browser/renderer_host/browser_render_process_host.cc @@ -530,6 +530,8 @@ void BrowserRenderProcessHost::PropagateBrowserCommandLineToRenderer( static const char* const kSwitchNames[] = { // We propagate the Chrome Frame command line here as well in case the // renderer is not run in the sandbox. + switches::kAuditAllHandles, + switches::kAuditHandles, switches::kChromeFrame, switches::kDisable3DAPIs, switches::kDisableAcceleratedCompositing, @@ -657,6 +659,15 @@ bool BrowserRenderProcessHost::FastShutdownIfPossible() { return true; } +void BrowserRenderProcessHost::DumpHandles() { +#if defined(OS_WIN) + Send(new ChildProcessMsg_DumpHandles()); + return; +#endif + + NOTIMPLEMENTED(); +} + // This is a platform specific function for mapping a transport DIB given its id TransportDIB* BrowserRenderProcessHost::MapTransportDIB( TransportDIB::Id dib_id) { @@ -757,6 +768,8 @@ bool BrowserRenderProcessHost::OnMessageReceived(const IPC::Message& msg) { IPC_BEGIN_MESSAGE_MAP_EX(BrowserRenderProcessHost, msg, msg_is_ok) IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ShutdownRequest, OnShutdownRequest) + IPC_MESSAGE_HANDLER(ChildProcessHostMsg_DumpHandlesDone, + OnDumpHandlesDone) IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged, SuddenTerminationChanged) IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction, @@ -902,6 +915,10 @@ void BrowserRenderProcessHost::OnShutdownRequest() { Send(new ChildProcessMsg_Shutdown()); } +void BrowserRenderProcessHost::OnDumpHandlesDone() { + Cleanup(); +} + void BrowserRenderProcessHost::SuddenTerminationChanged(bool enabled) { set_sudden_termination_allowed(enabled); } diff --git a/content/browser/renderer_host/browser_render_process_host.h b/content/browser/renderer_host/browser_render_process_host.h index d209b03..97297e9 100644 --- a/content/browser/renderer_host/browser_render_process_host.h +++ b/content/browser/renderer_host/browser_render_process_host.h @@ -62,6 +62,7 @@ class BrowserRenderProcessHost : public RenderProcessHost, virtual void WidgetHidden(); virtual int VisibleWidgetCount() const; virtual bool FastShutdownIfPossible(); + virtual void DumpHandles(); virtual base::ProcessHandle GetHandle(); virtual TransportDIB* GetTransportDIB(TransportDIB::Id dib_id); virtual void SetCompositingSurface( @@ -91,6 +92,7 @@ class BrowserRenderProcessHost : public RenderProcessHost, // Control message handlers. void OnShutdownRequest(); + void OnDumpHandlesDone(); void SuddenTerminationChanged(bool enabled); void OnUserMetricsRecordAction(const std::string& action); void OnRevealFolderInOS(const FilePath& path); diff --git a/content/browser/renderer_host/mock_render_process_host.cc b/content/browser/renderer_host/mock_render_process_host.cc index 87ec8de..d3f182d 100644 --- a/content/browser/renderer_host/mock_render_process_host.cc +++ b/content/browser/renderer_host/mock_render_process_host.cc @@ -74,6 +74,9 @@ bool MockRenderProcessHost::FastShutdownIfPossible() { return true; } +void MockRenderProcessHost::DumpHandles() { +} + base::ProcessHandle MockRenderProcessHost::GetHandle() { return base::kNullProcessHandle; } diff --git a/content/browser/renderer_host/mock_render_process_host.h b/content/browser/renderer_host/mock_render_process_host.h index 03e163e..c719472 100644 --- a/content/browser/renderer_host/mock_render_process_host.h +++ b/content/browser/renderer_host/mock_render_process_host.h @@ -50,6 +50,7 @@ class MockRenderProcessHost : public RenderProcessHost { virtual int VisibleWidgetCount() const; virtual void AddWord(const string16& word); virtual bool FastShutdownIfPossible(); + virtual void DumpHandles(); virtual base::ProcessHandle GetHandle(); virtual TransportDIB* GetTransportDIB(TransportDIB::Id dib_id); virtual void SetCompositingSurface( diff --git a/content/browser/renderer_host/render_process_host.cc b/content/browser/renderer_host/render_process_host.cc index 44e52231..958a30d 100644 --- a/content/browser/renderer_host/render_process_host.cc +++ b/content/browser/renderer_host/render_process_host.cc @@ -4,12 +4,14 @@ #include "content/browser/renderer_host/render_process_host.h" +#include "base/command_line.h" #include "base/rand_util.h" #include "base/sys_info.h" #include "content/browser/browser_thread.h" #include "content/browser/child_process_security_policy.h" #include "content/common/child_process_info.h" #include "content/common/content_constants.h" +#include "content/common/content_switches.h" #include "content/common/notification_service.h" namespace { @@ -128,6 +130,23 @@ void RenderProcessHost::Release(int listener_id) { // Make sure that all associated resource requests are stopped. CancelResourceRequests(listener_id); +#if defined(OS_WIN) + // Dump the handle table if handle auditing is enabled. + const CommandLine& browser_command_line = + *CommandLine::ForCurrentProcess(); + if (browser_command_line.HasSwitch(switches::kAuditHandles) || + browser_command_line.HasSwitch(switches::kAuditAllHandles)) { + DumpHandles(); + + // We wait to close the channels until the child process has finished + // dumping handles and sends us ChildProcessHostMsg_DumpHandlesDone. + return; + } +#endif + Cleanup(); +} + +void RenderProcessHost::Cleanup() { // When no other owners of this object, we can delete ourselves if (listeners_.IsEmpty()) { NotificationService::current()->Notify( diff --git a/content/browser/renderer_host/render_process_host.h b/content/browser/renderer_host/render_process_host.h index 2164634..44d5dc8 100644 --- a/content/browser/renderer_host/render_process_host.h +++ b/content/browser/renderer_host/render_process_host.h @@ -104,6 +104,9 @@ class CONTENT_EXPORT RenderProcessHost : public IPC::Channel::Sender, // See Attach() void Release(int listener_id); + // Schedules the host for deletion and removes it from the all_hosts list. + void Cleanup(); + // Listeners should call this when they've sent a "Close" message and // they're waiting for a "Close_ACK", so that if the renderer process // goes away we'll know that it was intentional rather than a crash. @@ -213,6 +216,9 @@ class CONTENT_EXPORT RenderProcessHost : public IPC::Channel::Sender, // Returns True if it was able to do fast shutdown. virtual bool FastShutdownIfPossible() = 0; + // Dump the child process' handle table before shutting down. + virtual void DumpHandles() = 0; + // Returns the process object associated with the child process. In certain // tests or single-process mode, this will actually represent the current // process. diff --git a/content/common/child_process_messages.h b/content/common/child_process_messages.h index 32ff20b..b1a8b33 100644 --- a/content/common/child_process_messages.h +++ b/content/common/child_process_messages.h @@ -40,6 +40,9 @@ IPC_MESSAGE_CONTROL0(ChildProcessMsg_EndTracing) // Sent to all child processes to get trace buffer fullness. IPC_MESSAGE_CONTROL0(ChildProcessMsg_GetTraceBufferPercentFull) +// Sent to child processes to dump their handle table. +IPC_MESSAGE_CONTROL0(ChildProcessMsg_DumpHandles) + //////////////////////////////////////////////////////////////////////////////// // Messages sent from the child process to the browser. @@ -60,6 +63,9 @@ IPC_MESSAGE_CONTROL1(ChildProcessHostMsg_TraceDataCollected, IPC_MESSAGE_CONTROL1(ChildProcessHostMsg_TraceBufferPercentFullReply, float /*trace buffer percent full*/) +// Reply to ChildProcessMsg_DumpHandles when handle table dump is complete. +IPC_MESSAGE_CONTROL0(ChildProcessHostMsg_DumpHandlesDone) + #if defined(OS_WIN) // Request that the given font be loaded by the host so it's cached by the // OS. Please see ChildProcessHost::PreCacheFont for details. diff --git a/content/common/child_thread.cc b/content/common/child_thread.cc index 95d0080..f76c2a5 100644 --- a/content/common/child_thread.cc +++ b/content/common/child_thread.cc @@ -22,6 +22,10 @@ #include "ipc/ipc_switches.h" #include "webkit/glue/webkit_glue.h" +#if defined(OS_WIN) +#include "content/common/handle_enumerator_win.h" +#endif + ChildThread::ChildThread() { channel_name_ = CommandLine::ForCurrentProcess()->GetSwitchValueASCII( switches::kProcessChannelID); @@ -158,6 +162,7 @@ bool ChildThread::OnMessageReceived(const IPC::Message& msg) { IPC_MESSAGE_HANDLER(ChildProcessMsg_SetIPCLoggingEnabled, OnSetIPCLoggingEnabled) #endif + IPC_MESSAGE_HANDLER(ChildProcessMsg_DumpHandles, OnDumpHandles) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() @@ -191,6 +196,20 @@ void ChildThread::OnSetIPCLoggingEnabled(bool enable) { } #endif // IPC_MESSAGE_LOG_ENABLED +void ChildThread::OnDumpHandles() { +#if defined(OS_WIN) + scoped_refptr handle_enum( + new content::HandleEnumerator( + CommandLine::ForCurrentProcess()->HasSwitch( + switches::kAuditAllHandles))); + handle_enum->EnumerateHandles(); + Send(new ChildProcessHostMsg_DumpHandlesDone); + return; +#endif + + NOTIMPLEMENTED(); +} + ChildThread* ChildThread::current() { return ChildProcess::current()->main_thread(); } diff --git a/content/common/child_thread.h b/content/common/child_thread.h index 8956ff2..356ffd5 100644 --- a/content/common/child_thread.h +++ b/content/common/child_thread.h @@ -87,6 +87,8 @@ class CONTENT_EXPORT ChildThread : public IPC::Channel::Listener, virtual void OnSetIPCLoggingEnabled(bool enable); #endif + virtual void OnDumpHandles(); + void set_on_channel_error_called(bool on_channel_error_called) { on_channel_error_called_ = on_channel_error_called; } diff --git a/content/common/content_switches.cc b/content/common/content_switches.cc index 4b232a4..6bafd31 100644 --- a/content/common/content_switches.cc +++ b/content/common/content_switches.cc @@ -17,6 +17,13 @@ const char kAllowRunningInsecureContent[] = "allow-running-insecure-content"; // Allows debugging of sandboxed processes (see zygote_main_linux.cc). const char kAllowSandboxDebugging[] = "allow-sandbox-debugging"; +// Enumerates and prints a child process' most dangerous handles when it +// is terminated. +const char kAuditHandles[] = "enable-handle-auditing"; + +// The same as kAuditHandles except all handles are enumerated. +const char kAuditAllHandles[] = "enable-handle-auditing-all"; + // Causes the browser process to throw an assertion on startup. const char kBrowserAssertTest[] = "assert-test"; @@ -484,15 +491,6 @@ const char kZygoteCmdPrefix[] = "zygote-cmd-prefix"; // Causes the process to run as a renderer zygote. const char kZygoteProcess[] = "zygote"; -#if defined(OS_WIN) -// Enumerates and prints a child process' most dangerous handles when it -// is terminated. -const char kAuditHandles[] = "enable-handle-auditing"; - -// The same as kAuditHandles except all handles are enumerated. -const char kAuditAllHandles[] = "enable-handle-auditing-all"; -#endif - #if defined(OS_POSIX) && !defined(OS_MACOSX) // Specify the amount the trackpad should scroll by. const char kScrollPixels[] = "scroll-pixels"; diff --git a/content/common/content_switches.h b/content/common/content_switches.h index ea1636b..8bf6e23 100644 --- a/content/common/content_switches.h +++ b/content/common/content_switches.h @@ -16,6 +16,8 @@ namespace switches { CONTENT_EXPORT extern const char kAllowFileAccessFromFiles[]; CONTENT_EXPORT extern const char kAllowRunningInsecureContent[]; extern const char kAllowSandboxDebugging[]; +extern const char kAuditHandles[]; +extern const char kAuditAllHandles[]; CONTENT_EXPORT extern const char kBrowserAssertTest[]; CONTENT_EXPORT extern const char kBrowserCrashTest[]; extern const char kBrowserSubprocessPath[]; @@ -158,11 +160,6 @@ CONTENT_EXPORT extern const char kWorkerProcess[]; CONTENT_EXPORT extern const char kZygoteCmdPrefix[]; CONTENT_EXPORT extern const char kZygoteProcess[]; -#if defined(OS_WIN) -extern const char kAuditHandles[]; -extern const char kAuditAllHandles[]; -#endif - #if defined(OS_POSIX) && !defined(OS_MACOSX) extern const char kScrollPixels[]; #endif diff --git a/content/common/handle_enumerator_win.cc b/content/common/handle_enumerator_win.cc new file mode 100644 index 0000000..c95ac10 --- /dev/null +++ b/content/common/handle_enumerator_win.cc @@ -0,0 +1,329 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/common/handle_enumerator_win.h" + +#include +#include + +#include "base/command_line.h" +#include "base/logging.h" +#include "base/process.h" +#include "base/process_util.h" +#include "base/utf_string_conversions.h" +#include "base/win/windows_version.h" +#include "content/common/content_switches.h" +#include "content/common/result_codes.h" +#include "sandbox/src/handle_table.h" + +namespace { + +typedef std::map HandleTypeMap; + +HandleTypeMap& MakeHandleTypeMap() { + HandleTypeMap& handle_types = *(new HandleTypeMap()); + handle_types[sandbox::HandleTable::kTypeProcess] = content::ProcessHandle; + handle_types[sandbox::HandleTable::kTypeThread] = content::ThreadHandle; + handle_types[sandbox::HandleTable::kTypeFile] = content::FileHandle; + handle_types[sandbox::HandleTable::kTypeDirectory] = + content::DirectoryHandle; + handle_types[sandbox::HandleTable::kTypeKey] = content::KeyHandle; + handle_types[sandbox::HandleTable::kTypeWindowStation] = + content::WindowStationHandle; + handle_types[sandbox::HandleTable::kTypeDesktop] = content::DesktopHandle; + handle_types[sandbox::HandleTable::kTypeService] = content::ServiceHandle; + handle_types[sandbox::HandleTable::kTypeMutex] = content::MutexHandle; + handle_types[sandbox::HandleTable::kTypeSemaphore] = + content::SemaphoreHandle; + handle_types[sandbox::HandleTable::kTypeEvent] = content::EventHandle; + handle_types[sandbox::HandleTable::kTypeTimer] = content::TimerHandle; + handle_types[sandbox::HandleTable::kTypeNamedPipe] = + content::NamedPipeHandle; + handle_types[sandbox::HandleTable::kTypeJobObject] = content::JobHandle; + handle_types[sandbox::HandleTable::kTypeFileMap] = content::FileMapHandle; + handle_types[sandbox::HandleTable::kTypeAlpcPort] = + content::AlpcPortHandle; + + return handle_types; +} + +} // namespace + +namespace content { + +const size_t kMaxHandleNameLength = 1024; + +void HandleEnumerator::EnumerateHandles() { + sandbox::HandleTable handles; + std::string process_type = + CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + switches::kProcessType); + string16 output = ASCIIToUTF16(process_type); + output.append(ASCIIToUTF16(" process - Handles at shutdown:\n")); + for (sandbox::HandleTable::Iterator sys_handle + = handles.HandlesForProcess(::GetCurrentProcessId()); + sys_handle != handles.end(); ++sys_handle) { + HandleType current_type = StringToHandleType(sys_handle->Type()); + if (!all_handles_ && (current_type != ProcessHandle && + current_type != FileHandle && + current_type != DirectoryHandle && + current_type != KeyHandle && + current_type != WindowStationHandle && + current_type != DesktopHandle && + current_type != ServiceHandle)) + continue; + + output += ASCIIToUTF16("["); + output += sys_handle->Type(); + output += ASCIIToUTF16("] ("); + output += sys_handle->Name(); + output += ASCIIToUTF16(")\n"); + output += GetAccessString(current_type, + sys_handle->handle_entry()->GrantedAccess); + } + LOG(INFO) << output; +} + +HandleType StringToHandleType(const string16& type) { + static HandleTypeMap handle_types = MakeHandleTypeMap(); + HandleTypeMap::iterator result = handle_types.find(type); + return result != handle_types.end() ? result->second : OtherHandle; +} + +string16 GetAccessString(HandleType handle_type, + ACCESS_MASK access) { + string16 output; + if (access & GENERIC_READ) + output.append(ASCIIToUTF16("\tGENERIC_READ\n")); + if (access & GENERIC_WRITE) + output.append(ASCIIToUTF16("\tGENERIC_WRITE\n")); + if (access & GENERIC_EXECUTE) + output.append(ASCIIToUTF16("\tGENERIC_EXECUTE\n")); + if (access & GENERIC_ALL) + output.append(ASCIIToUTF16("\tGENERIC_ALL\n")); + if (access & DELETE) + output.append(ASCIIToUTF16("\tDELETE\n")); + if (access & READ_CONTROL) + output.append(ASCIIToUTF16("\tREAD_CONTROL\n")); + if (access & WRITE_DAC) + output.append(ASCIIToUTF16("\tWRITE_DAC\n")); + if (access & WRITE_OWNER) + output.append(ASCIIToUTF16("\tWRITE_OWNER\n")); + if (access & SYNCHRONIZE) + output.append(ASCIIToUTF16("\tSYNCHRONIZE\n")); + + switch (handle_type) { + case ProcessHandle: + if (access & PROCESS_CREATE_PROCESS) + output.append(ASCIIToUTF16("\tPROCESS_CREATE_PROCESS\n")); + if (access & PROCESS_CREATE_THREAD) + output.append(ASCIIToUTF16("\tPROCESS_CREATE_THREAD\n")); + if (access & PROCESS_DUP_HANDLE) + output.append(ASCIIToUTF16("\tPROCESS_DUP_HANDLE\n")); + if (access & PROCESS_QUERY_INFORMATION) + output.append(ASCIIToUTF16("\tPROCESS_QUERY_INFORMATION\n")); + if (access & PROCESS_QUERY_LIMITED_INFORMATION) + output.append(ASCIIToUTF16("\tPROCESS_QUERY_LIMITED_INFORMATION\n")); + if (access & PROCESS_SET_INFORMATION) + output.append(ASCIIToUTF16("\tPROCESS_SET_INFORMATION\n")); + if (access & PROCESS_SET_QUOTA) + output.append(ASCIIToUTF16("\tPROCESS_SET_QUOTA\n")); + if (access & PROCESS_SUSPEND_RESUME) + output.append(ASCIIToUTF16("\tPROCESS_SUSPEND_RESUME\n")); + if (access & PROCESS_TERMINATE) + output.append(ASCIIToUTF16("\tPROCESS_TERMINATE\n")); + if (access & PROCESS_VM_OPERATION) + output.append(ASCIIToUTF16("\tPROCESS_VM_OPERATION\n")); + if (access & PROCESS_VM_READ) + output.append(ASCIIToUTF16("\tPROCESS_VM_READ\n")); + if (access & PROCESS_VM_WRITE) + output.append(ASCIIToUTF16("\tPROCESS_VM_WRITE\n")); + break; + case ThreadHandle: + if (access & THREAD_DIRECT_IMPERSONATION) + output.append(ASCIIToUTF16("\tTHREAD_DIRECT_IMPERSONATION\n")); + if (access & THREAD_GET_CONTEXT) + output.append(ASCIIToUTF16("\tTHREAD_GET_CONTEXT\n")); + if (access & THREAD_IMPERSONATE) + output.append(ASCIIToUTF16("\tTHREAD_IMPERSONATE\n")); + if (access & THREAD_QUERY_INFORMATION ) + output.append(ASCIIToUTF16("\tTHREAD_QUERY_INFORMATION\n")); + if (access & THREAD_QUERY_LIMITED_INFORMATION) + output.append(ASCIIToUTF16("\tTHREAD_QUERY_LIMITED_INFORMATION\n")); + if (access & THREAD_SET_CONTEXT) + output.append(ASCIIToUTF16("\tTHREAD_SET_CONTEXT\n")); + if (access & THREAD_SET_INFORMATION) + output.append(ASCIIToUTF16("\tTHREAD_SET_INFORMATION\n")); + if (access & THREAD_SET_LIMITED_INFORMATION) + output.append(ASCIIToUTF16("\tTHREAD_SET_LIMITED_INFORMATION\n")); + if (access & THREAD_SET_THREAD_TOKEN) + output.append(ASCIIToUTF16("\tTHREAD_SET_THREAD_TOKEN\n")); + if (access & THREAD_SUSPEND_RESUME) + output.append(ASCIIToUTF16("\tTHREAD_SUSPEND_RESUME\n")); + if (access & THREAD_TERMINATE) + output.append(ASCIIToUTF16("\tTHREAD_TERMINATE\n")); + break; + case FileHandle: + if (access & FILE_APPEND_DATA) + output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n")); + if (access & FILE_EXECUTE) + output.append(ASCIIToUTF16("\tFILE_EXECUTE\n")); + if (access & FILE_READ_ATTRIBUTES) + output.append(ASCIIToUTF16("\tFILE_READ_ATTRIBUTES\n")); + if (access & FILE_READ_DATA) + output.append(ASCIIToUTF16("\tFILE_READ_DATA\n")); + if (access & FILE_READ_EA) + output.append(ASCIIToUTF16("\tFILE_READ_EA\n")); + if (access & FILE_WRITE_ATTRIBUTES) + output.append(ASCIIToUTF16("\tFILE_WRITE_ATTRIBUTES\n")); + if (access & FILE_WRITE_DATA) + output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n")); + if (access & FILE_WRITE_EA) + output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n")); + if (access & FILE_WRITE_EA) + output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n")); + break; + case DirectoryHandle: + if (access & FILE_ADD_FILE) + output.append(ASCIIToUTF16("\tFILE_ADD_FILE\n")); + if (access & FILE_ADD_SUBDIRECTORY) + output.append(ASCIIToUTF16("\tFILE_ADD_SUBDIRECTORY\n")); + if (access & FILE_APPEND_DATA) + output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n")); + if (access & FILE_DELETE_CHILD) + output.append(ASCIIToUTF16("\tFILE_DELETE_CHILD\n")); + if (access & FILE_LIST_DIRECTORY) + output.append(ASCIIToUTF16("\tFILE_LIST_DIRECTORY\n")); + if (access & FILE_READ_DATA) + output.append(ASCIIToUTF16("\tFILE_READ_DATA\n")); + if (access & FILE_TRAVERSE) + output.append(ASCIIToUTF16("\tFILE_TRAVERSE\n")); + if (access & FILE_WRITE_DATA) + output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n")); + break; + case KeyHandle: + if (access & KEY_CREATE_LINK) + output.append(ASCIIToUTF16("\tKEY_CREATE_LINK\n")); + if (access & KEY_CREATE_SUB_KEY) + output.append(ASCIIToUTF16("\tKEY_CREATE_SUB_KEY\n")); + if (access & KEY_ENUMERATE_SUB_KEYS) + output.append(ASCIIToUTF16("\tKEY_ENUMERATE_SUB_KEYS\n")); + if (access & KEY_EXECUTE) + output.append(ASCIIToUTF16("\tKEY_EXECUTE\n")); + if (access & KEY_NOTIFY) + output.append(ASCIIToUTF16("\tKEY_NOTIFY\n")); + if (access & KEY_QUERY_VALUE) + output.append(ASCIIToUTF16("\tKEY_QUERY_VALUE\n")); + if (access & KEY_READ) + output.append(ASCIIToUTF16("\tKEY_READ\n")); + if (access & KEY_SET_VALUE) + output.append(ASCIIToUTF16("\tKEY_SET_VALUE\n")); + if (access & KEY_WOW64_32KEY) + output.append(ASCIIToUTF16("\tKEY_WOW64_32KEY\n")); + if (access & KEY_WOW64_64KEY) + output.append(ASCIIToUTF16("\tKEY_WOW64_64KEY\n")); + break; + case WindowStationHandle: + if (access & WINSTA_ACCESSCLIPBOARD) + output.append(ASCIIToUTF16("\tWINSTA_ACCESSCLIPBOARD\n")); + if (access & WINSTA_ACCESSGLOBALATOMS) + output.append(ASCIIToUTF16("\tWINSTA_ACCESSGLOBALATOMS\n")); + if (access & WINSTA_CREATEDESKTOP) + output.append(ASCIIToUTF16("\tWINSTA_CREATEDESKTOP\n")); + if (access & WINSTA_ENUMDESKTOPS) + output.append(ASCIIToUTF16("\tWINSTA_ENUMDESKTOPS\n")); + if (access & WINSTA_ENUMERATE) + output.append(ASCIIToUTF16("\tWINSTA_ENUMERATE\n")); + if (access & WINSTA_EXITWINDOWS) + output.append(ASCIIToUTF16("\tWINSTA_EXITWINDOWS\n")); + if (access & WINSTA_READATTRIBUTES) + output.append(ASCIIToUTF16("\tWINSTA_READATTRIBUTES\n")); + if (access & WINSTA_READSCREEN) + output.append(ASCIIToUTF16("\tWINSTA_READSCREEN\n")); + if (access & WINSTA_WRITEATTRIBUTES) + output.append(ASCIIToUTF16("\tWINSTA_WRITEATTRIBUTES\n")); + break; + case DesktopHandle: + if (access & DESKTOP_CREATEMENU) + output.append(ASCIIToUTF16("\tDESKTOP_CREATEMENU\n")); + if (access & DESKTOP_CREATEWINDOW) + output.append(ASCIIToUTF16("\tDESKTOP_CREATEWINDOW\n")); + if (access & DESKTOP_ENUMERATE) + output.append(ASCIIToUTF16("\tDESKTOP_ENUMERATE\n")); + if (access & DESKTOP_HOOKCONTROL) + output.append(ASCIIToUTF16("\tDESKTOP_HOOKCONTROL\n")); + if (access & DESKTOP_JOURNALPLAYBACK) + output.append(ASCIIToUTF16("\tDESKTOP_JOURNALPLAYBACK\n")); + if (access & DESKTOP_JOURNALRECORD) + output.append(ASCIIToUTF16("\tDESKTOP_JOURNALRECORD\n")); + if (access & DESKTOP_READOBJECTS) + output.append(ASCIIToUTF16("\tDESKTOP_READOBJECTS\n")); + if (access & DESKTOP_SWITCHDESKTOP) + output.append(ASCIIToUTF16("\tDESKTOP_SWITCHDESKTOP\n")); + if (access & DESKTOP_WRITEOBJECTS) + output.append(ASCIIToUTF16("\tDESKTOP_WRITEOBJECTS\n")); + break; + case ServiceHandle: + if (access & SC_MANAGER_CREATE_SERVICE) + output.append(ASCIIToUTF16("\tSC_MANAGER_CREATE_SERVICE\n")); + if (access & SC_MANAGER_CONNECT) + output.append(ASCIIToUTF16("\tSC_MANAGER_CONNECT\n")); + if (access & SC_MANAGER_ENUMERATE_SERVICE ) + output.append(ASCIIToUTF16("\tSC_MANAGER_ENUMERATE_SERVICE\n")); + if (access & SC_MANAGER_LOCK) + output.append(ASCIIToUTF16("\tSC_MANAGER_LOCK\n")); + if (access & SC_MANAGER_MODIFY_BOOT_CONFIG ) + output.append(ASCIIToUTF16("\tSC_MANAGER_MODIFY_BOOT_CONFIG\n")); + if (access & SC_MANAGER_QUERY_LOCK_STATUS ) + output.append(ASCIIToUTF16("\tSC_MANAGER_QUERY_LOCK_STATUS\n")); + break; + case EventHandle: + if (access & EVENT_MODIFY_STATE) + output.append(ASCIIToUTF16("\tEVENT_MODIFY_STATE\n")); + break; + case MutexHandle: + if (access & MUTEX_MODIFY_STATE) + output.append(ASCIIToUTF16("\tMUTEX_MODIFY_STATE\n")); + break; + case SemaphoreHandle: + if (access & SEMAPHORE_MODIFY_STATE) + output.append(ASCIIToUTF16("\tSEMAPHORE_MODIFY_STATE\n")); + break; + case TimerHandle: + if (access & TIMER_MODIFY_STATE) + output.append(ASCIIToUTF16("\tTIMER_MODIFY_STATE\n")); + if (access & TIMER_QUERY_STATE) + output.append(ASCIIToUTF16("\tTIMER_QUERY_STATE\n")); + break; + case NamedPipeHandle: + if (access & PIPE_ACCESS_INBOUND) + output.append(ASCIIToUTF16("\tPIPE_ACCESS_INBOUND\n")); + if (access & PIPE_ACCESS_OUTBOUND) + output.append(ASCIIToUTF16("\tPIPE_ACCESS_OUTBOUND\n")); + break; + case JobHandle: + if (access & JOB_OBJECT_ASSIGN_PROCESS) + output.append(ASCIIToUTF16("\tJOB_OBJECT_ASSIGN_PROCESS\n")); + if (access & JOB_OBJECT_QUERY) + output.append(ASCIIToUTF16("\tJOB_OBJECT_QUERY\n")); + if (access & JOB_OBJECT_SET_ATTRIBUTES) + output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_ATTRIBUTES\n")); + if (access & JOB_OBJECT_SET_SECURITY_ATTRIBUTES) + output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_SECURITY_ATTRIBUTES\n")); + if (access & JOB_OBJECT_TERMINATE) + output.append(ASCIIToUTF16("\tJOB_OBJECT_TERMINATE\n")); + break; + case FileMapHandle: + if (access & FILE_MAP_EXECUTE) + output.append(ASCIIToUTF16("\tFILE_MAP_EXECUTE\n")); + if (access & FILE_MAP_READ) + output.append(ASCIIToUTF16("\tFILE_MAP_READ\n")); + if (access & FILE_MAP_WRITE) + output.append(ASCIIToUTF16("\tFILE_MAP_WRITE\n")); + break; + } + return output; +} + +} // namespace content diff --git a/content/common/handle_enumerator_win.h b/content/common/handle_enumerator_win.h new file mode 100644 index 0000000..ada972f --- /dev/null +++ b/content/common/handle_enumerator_win.h @@ -0,0 +1,54 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_COMMON_HANDLE_ENUMERATOR_WIN_H_ +#define CONTENT_COMMON_HANDLE_ENUMERATOR_WIN_H_ + +#include "base/memory/ref_counted.h" +#include "base/process.h" +#include "base/string16.h" + +namespace content { + +enum HandleType { + ProcessHandle, + ThreadHandle, + FileHandle, + DirectoryHandle, + KeyHandle, + WindowStationHandle, + DesktopHandle, + ServiceHandle, + EventHandle, + MutexHandle, + SemaphoreHandle, + TimerHandle, + NamedPipeHandle, + JobHandle, + FileMapHandle, + AlpcPortHandle, + OtherHandle +}; + +static HandleType StringToHandleType(const string16& type); + +static string16 GetAccessString(HandleType handle_type, ACCESS_MASK access); + +class HandleEnumerator : public base::RefCountedThreadSafe { + public: + explicit HandleEnumerator(bool all_handles): + all_handles_(all_handles) { } + + void EnumerateHandles(); + + private: + bool all_handles_; + + DISALLOW_COPY_AND_ASSIGN(HandleEnumerator); +}; + +} // namespace content + +#endif // CONTENT_COMMON_HANDLE_ENUMERATOR_WIN_H_ + diff --git a/content/content_browser.gypi b/content/content_browser.gypi index 2cb74f8..4e6c6d1 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi @@ -222,8 +222,6 @@ 'browser/gpu/gpu_process_host.h', 'browser/gpu/gpu_process_host_ui_shim.cc', 'browser/gpu/gpu_process_host_ui_shim.h', - 'browser/handle_enumerator_win.cc', - 'browser/handle_enumerator_win.h', 'browser/host_zoom_map.cc', 'browser/host_zoom_map.h', 'browser/in_process_webkit/browser_webkitplatformsupport_impl.cc', diff --git a/content/content_common.gypi b/content/content_common.gypi index f9bc297..98e9971 100644 --- a/content/content_common.gypi +++ b/content/content_common.gypi @@ -123,6 +123,8 @@ 'common/gpu/media/gpu_video_decode_accelerator.h', 'common/gpu/transport_texture.cc', 'common/gpu/transport_texture.h', + 'common/handle_enumerator_win.cc', + 'common/handle_enumerator_win.h', 'common/hi_res_timer_manager_posix.cc', 'common/hi_res_timer_manager_win.cc', 'common/hi_res_timer_manager.h', -- cgit v1.1