Index: chrome/app/close_handle_hook_win.cc |
diff --git a/chrome/app/close_handle_hook_win.cc b/chrome/app/close_handle_hook_win.cc |
deleted file mode 100644 |
index ca0b01e76c331c38192e97e3eba0e380147a2dfe..0000000000000000000000000000000000000000 |
--- a/chrome/app/close_handle_hook_win.cc |
+++ /dev/null |
@@ -1,118 +0,0 @@ |
-// Copyright 2014 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 "chrome/app/close_handle_hook_win.h" |
- |
-#include <Windows.h> |
- |
-#include <vector> |
- |
-#include "base/files/file_path.h" |
-#include "base/lazy_instance.h" |
-#include "base/strings/string16.h" |
-#include "base/win/iat_patch_function.h" |
-#include "base/win/scoped_handle.h" |
-#include "chrome/common/chrome_version_info.h" |
- |
-namespace { |
- |
-typedef BOOL (WINAPI* CloseHandleType) (HANDLE handle); |
-CloseHandleType g_close_function = NULL; |
- |
-// The entry point for CloseHandle interception. This function notifies the |
-// verifier about the handle that is being closed, and calls the original |
-// function. |
-BOOL WINAPI CloseHandleHook(HANDLE handle) { |
- base::win::OnHandleBeingClosed(handle); |
- return g_close_function(handle); |
-} |
- |
-// Keeps track of all the hooks needed to intercept CloseHandle. |
-class CloseHandleHooks { |
- public: |
- CloseHandleHooks() {} |
- ~CloseHandleHooks() {} |
- |
- void AddIATPatch(const base::string16& module); |
- void Unpatch(); |
- |
- private: |
- std::vector<base::win::IATPatchFunction*> hooks_; |
- DISALLOW_COPY_AND_ASSIGN(CloseHandleHooks); |
-}; |
-base::LazyInstance<CloseHandleHooks> g_hooks = LAZY_INSTANCE_INITIALIZER; |
- |
-void CloseHandleHooks::AddIATPatch(const base::string16& module) { |
- if (module.empty()) |
- return; |
- |
- base::win::IATPatchFunction* patch = new base::win::IATPatchFunction; |
- patch->Patch(module.c_str(), "kernel32.dll", "CloseHandle", CloseHandleHook); |
- hooks_.push_back(patch); |
- if (!g_close_function) { |
- // Things are probably messed up if each intercepted function points to |
- // a different place, but we need only one function to call. |
- g_close_function = |
- reinterpret_cast<CloseHandleType>(patch->original_function()); |
- } |
-} |
- |
-void CloseHandleHooks::Unpatch() { |
- for (std::vector<base::win::IATPatchFunction*>::iterator it = hooks_.begin(); |
- it != hooks_.end(); ++it) { |
- (*it)->Unpatch(); |
- } |
-} |
- |
-bool UseHooks() { |
- chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
- if (channel == chrome::VersionInfo::CHANNEL_CANARY || |
- channel == chrome::VersionInfo::CHANNEL_DEV) { |
- return true; |
- } |
- |
- return false; |
-} |
- |
-base::string16 GetModuleName(HMODULE module) { |
- base::string16 name; |
- if (!module) |
- return name; |
- wchar_t buffer[MAX_PATH]; |
- int rv = GetModuleFileName(module, buffer, MAX_PATH); |
- if (rv == MAX_PATH) |
- return name; |
- |
- buffer[MAX_PATH - 1] = L'\0'; |
- name.assign(buffer); |
- base::FilePath path(name); |
- return path.BaseName().AsUTF16Unsafe(); |
-} |
- |
-HMODULE GetChromeDLLModule() { |
- HMODULE module; |
- if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | |
- GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, |
- reinterpret_cast<wchar_t*>(&GetChromeDLLModule), |
- &module)) { |
- return NULL; |
- } |
- return module; |
-} |
- |
-} // namespace |
- |
-void InstallCloseHandleHooks() { |
- if (!UseHooks()) |
- return; |
- |
- base::win::EnableHandleVerifier(); |
- CloseHandleHooks* hooks = g_hooks.Pointer(); |
- hooks->AddIATPatch(L"chrome.exe"); |
- hooks->AddIATPatch(GetModuleName(GetChromeDLLModule())); |
-} |
- |
-void RemoveCloseHandleHooks() { |
- g_hooks.Get().Unpatch(); |
-} |