blob: 406ddec32ca2972f145af5190085ceb75a48e574 [file] [log] [blame]
// 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.
#ifndef CHROME_ELF_HOOK_UTIL_HOOK_UTIL_H_
#define CHROME_ELF_HOOK_UTIL_HOOK_UTIL_H_
#include <windows.h>
#include "base/macros.h"
namespace sandbox {
class ServiceResolverThunk;
}
namespace elf_hook {
//------------------------------------------------------------------------------
// System Service hooking support
//------------------------------------------------------------------------------
// Creates a |ServiceResolverThunk| based on the OS version. Ownership of the
// resulting thunk is passed to the caller.
sandbox::ServiceResolverThunk* HookSystemService(bool relaxed);
//------------------------------------------------------------------------------
// Import Address Table hooking support
//------------------------------------------------------------------------------
class IATHook {
public:
IATHook();
~IATHook();
// Intercept a function in an import table of a specific
// module. Saves everything needed to Unhook.
//
// NOTE: Hook can only be called once at a time, to enable Unhook().
//
// Arguments:
// module Module to be intercepted
// imported_from_module Module that exports the 'function_name'
// function_name Name of the API to be intercepted
// new_function New function pointer
//
// Returns: Windows error code (winerror.h). NO_ERROR if successful.
DWORD Hook(HMODULE module,
const char* imported_from_module,
const char* function_name,
void* new_function);
// Unhook the IAT entry.
//
// Returns: Windows error code (winerror.h). NO_ERROR if successful.
DWORD Unhook();
private:
void* intercept_function_;
void* original_function_;
IMAGE_THUNK_DATA* iat_thunk_;
DISALLOW_COPY_AND_ASSIGN(IATHook);
};
} // namespace elf_hook
#endif // CHROME_ELF_HOOK_UTIL_HOOK_UTIL_H_