diff options
Diffstat (limited to 'chrome_frame/chrome_frame_helper_main.cc')
-rw-r--r-- | chrome_frame/chrome_frame_helper_main.cc | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/chrome_frame/chrome_frame_helper_main.cc b/chrome_frame/chrome_frame_helper_main.cc new file mode 100644 index 0000000..f4369a88 --- /dev/null +++ b/chrome_frame/chrome_frame_helper_main.cc @@ -0,0 +1,131 @@ +// Copyright (c) 2010 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. +// +// chrome_frame_helper_main.cc : The .exe that bootstraps the +// chrome_frame_helper.dll. +// +// This is a small exe that loads the hook dll to set the event hooks and then +// waits in a message loop. It is intended to be shut down by looking for a +// window with the class and title +// kChromeFrameHelperWindowClassName and kChromeFrameHelperWindowName and then +// sending that window a WM_CLOSE message. +// + +#include <crtdbg.h> +#include <windows.h> + +// Window class and window names. +const wchar_t kChromeFrameHelperWindowClassName[] = + L"ChromeFrameHelperWindowClass"; +const wchar_t kChromeFrameHelperWindowName[] = + L"ChromeFrameHelperWindowName"; + +// Small helper class that assists in loading the DLL that contains code +// to register our event hook callback. Automatically removes the hook and +// unloads the DLL on destruction. +class HookDllLoader { + public: + HookDllLoader() : dll_(NULL), start_proc_(NULL), stop_proc_(NULL) {} + ~HookDllLoader() { + if (dll_) { + Unload(); + } + } + + bool Load() { + dll_ = LoadLibrary(L"chrome_frame_helper.dll"); + if (dll_) { + start_proc_ = GetProcAddress(dll_, "StartUserModeBrowserInjection"); + stop_proc_ = GetProcAddress(dll_, "StopUserModeBrowserInjection"); + } + + bool result = true; + if (!start_proc_ || !stop_proc_) { + _ASSERTE(L"failed to load hook dll."); + result = false; + } else { + if (FAILED(start_proc_())) { + _ASSERTE(L"failed to initialize hook dll."); + result = false; + } + } + return result; + } + + void Unload() { + if (stop_proc_) { + stop_proc_(); + } + if (dll_) { + FreeLibrary(dll_); + } + } + + private: + HMODULE dll_; + PROC start_proc_; + PROC stop_proc_; +}; + + +LRESULT CALLBACK ChromeFrameHelperWndProc(HWND hwnd, + UINT message, + WPARAM wparam, + LPARAM lparam) { + switch (message) { + case WM_DESTROY: + PostQuitMessage(0); + break; + default: + return ::DefWindowProc(hwnd, message, wparam, lparam); + } + return 0; +} + +HWND RegisterAndCreateWindow(HINSTANCE hinstance) { + WNDCLASSEX wcex = {0}; + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.lpfnWndProc = ChromeFrameHelperWndProc; + wcex.hInstance = GetModuleHandle(NULL); + wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1); + wcex.lpszClassName = kChromeFrameHelperWindowClassName; + RegisterClassEx(&wcex); + + HWND hwnd = CreateWindow(kChromeFrameHelperWindowClassName, + kChromeFrameHelperWindowName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, + CW_USEDEFAULT, 0, NULL, NULL, hinstance, NULL); + + return hwnd; +} + +int APIENTRY wWinMain(HINSTANCE hinstance, HINSTANCE, wchar_t*, int show_cmd) { + // TODO(robertshield): Before this actually gets used, add breakpad + // integration. + + // Create a window with a known class and title just to listen for WM_CLOSE + // messages that will shut us down. + HWND hwnd = RegisterAndCreateWindow(hinstance); + _ASSERTE(hwnd); + + // Load the hook dll, and set the event hooks. + HookDllLoader loader; + bool loaded = loader.Load(); + _ASSERTE(loaded); + + if (loaded) { + MSG msg; + BOOL ret; + // Main message loop: + while ((ret = GetMessage(&msg, NULL, 0, 0))) { + if (ret == -1) { + break; + } else { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + + return 0; +} |