// 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.

#include "chrome_frame/event_hooker.h"

#include <crtdbg.h>
#include "chrome_frame/bho_loader.h"

EXTERN_C IMAGE_DOS_HEADER __ImageBase;

EventHooker::EventHooker()
: window_creation_hook_(NULL) {}

EventHooker::~EventHooker() {
  StopHook();
}

bool EventHooker::StartHook() {
  if ((NULL != window_creation_hook_)) {
    return false;
  }

  window_creation_hook_ = SetWinEventHook(EVENT_OBJECT_CREATE,
                                          EVENT_OBJECT_CREATE,
                                          reinterpret_cast<HMODULE>(
                                              &__ImageBase),
                                          WindowCreationHookProc,
                                          0,
                                          0,
                                          WINEVENT_INCONTEXT);
  if (NULL == window_creation_hook_) {
    return false;
  }
  return true;
}

void EventHooker::StopHook() {
  if (NULL != window_creation_hook_) {
    UnhookWinEvent(window_creation_hook_);
    window_creation_hook_ = NULL;
  }
}

VOID CALLBACK EventHooker::WindowCreationHookProc(HWINEVENTHOOK hook,
                                                  DWORD event,
                                                  HWND window,
                                                  LONG object_id,
                                                  LONG child_id,
                                                  DWORD event_tid,
                                                  DWORD event_time) {
  _ASSERTE((EVENT_OBJECT_CREATE == event) ||
           (EVENT_OBJECT_PARENTCHANGE == event));
  if (OBJID_WINDOW == object_id) {
    BHOLoader::GetInstance()->OnHookEvent(event, window);
  }
}