// Copyright 2013 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_frame/pin_module.h" #include <windows.h> #include "base/logging.h" #include "chrome_frame/utils.h" extern "C" IMAGE_DOS_HEADER __ImageBase; namespace chrome_frame { namespace { PinModuleCallbackFn g_pin_module_callback = NULL; } // namespace void SetPinModuleCallback(PinModuleCallbackFn callback) { g_pin_module_callback = callback; } void PinModule() { static bool s_pinned = false; if (!s_pinned && !IsUnpinnedMode()) { wchar_t system_buffer[MAX_PATH]; HMODULE this_module = reinterpret_cast<HMODULE>(&__ImageBase); system_buffer[0] = 0; if (GetModuleFileName(this_module, system_buffer, arraysize(system_buffer)) != 0) { HMODULE unused; if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_PIN, system_buffer, &unused)) { DPLOG(FATAL) << "Failed to pin module " << system_buffer; } else { s_pinned = true; if (g_pin_module_callback) g_pin_module_callback(); } } else { DPLOG(FATAL) << "Could not get module path."; } } } } // namespace chrome_frame