1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome_frame/event_hooker.h"
6
7 #include <crtdbg.h>
8 #include "chrome_frame/bho_loader.h"
9
10 EXTERN_C IMAGE_DOS_HEADER __ImageBase;
11
EventHooker()12 EventHooker::EventHooker()
13 : window_creation_hook_(NULL) {}
14
~EventHooker()15 EventHooker::~EventHooker() {
16 StopHook();
17 }
18
StartHook()19 bool EventHooker::StartHook() {
20 if ((NULL != window_creation_hook_)) {
21 return false;
22 }
23
24 window_creation_hook_ = SetWinEventHook(EVENT_OBJECT_CREATE,
25 EVENT_OBJECT_CREATE,
26 reinterpret_cast<HMODULE>(
27 &__ImageBase),
28 WindowCreationHookProc,
29 0,
30 0,
31 WINEVENT_INCONTEXT);
32 if (NULL == window_creation_hook_) {
33 return false;
34 }
35 return true;
36 }
37
StopHook()38 void EventHooker::StopHook() {
39 if (NULL != window_creation_hook_) {
40 UnhookWinEvent(window_creation_hook_);
41 window_creation_hook_ = NULL;
42 }
43 }
44
WindowCreationHookProc(HWINEVENTHOOK hook,DWORD event,HWND window,LONG object_id,LONG child_id,DWORD event_tid,DWORD event_time)45 VOID CALLBACK EventHooker::WindowCreationHookProc(HWINEVENTHOOK hook,
46 DWORD event,
47 HWND window,
48 LONG object_id,
49 LONG child_id,
50 DWORD event_tid,
51 DWORD event_time) {
52 _ASSERTE((EVENT_OBJECT_CREATE == event) ||
53 (EVENT_OBJECT_PARENTCHANGE == event));
54 if (OBJID_WINDOW == object_id) {
55 BHOLoader::GetInstance()->OnHookEvent(event, window);
56 }
57 }
58
59