107bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov//===-- interception_linux.h ------------------------------------*- C++ -*-===//
207bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov//
307bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov//                     The LLVM Compiler Infrastructure
407bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov//
507bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov// This file is distributed under the University of Illinois Open Source
607bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov// License. See LICENSE.TXT for details.
707bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov//
807bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov//===----------------------------------------------------------------------===//
907bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov//
1007bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov// This file is a part of AddressSanitizer, an address sanity checker.
1107bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov//
1207bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov// Windows-specific interception methods.
1307bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov//===----------------------------------------------------------------------===//
1407bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov
1507bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov#ifdef _WIN32
1607bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov
1707bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov#if !defined(INCLUDED_FROM_INTERCEPTION_LIB)
1807bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov# error "interception_win.h should be included from interception library only"
1907bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov#endif
2007bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov
2107bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov#ifndef INTERCEPTION_WIN_H
2207bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov#define INTERCEPTION_WIN_H
2307bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov
2407bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanovnamespace __interception {
256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// All the functions in the OverrideFunction() family return true on success,
266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// false on failure (including "couldn't find the function").
272716a61d085a8fdf13a099822720e320414cc4dcTimur Iskhodzhanov
286d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// Overrides a function by its address.
296d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesbool OverrideFunction(uptr old_func, uptr new_func, uptr *orig_old_func = 0);
306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
316d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// Overrides a function in a system DLL or DLL CRT by its exported name.
326d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesbool OverrideFunction(const char *name, uptr new_func, uptr *orig_old_func = 0);
3307bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov}  // namespace __interception
3407bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov
356d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#if defined(INTERCEPTION_DYNAMIC_CRT)
366d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#define INTERCEPT_FUNCTION_WIN(func)                                           \
376d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  ::__interception::OverrideFunction(#func,                                    \
386d1862363c88c183b0ed7740fca876342cf0474bStephen Hines                                     (::__interception::uptr)WRAP(func),       \
396d1862363c88c183b0ed7740fca876342cf0474bStephen Hines                                     (::__interception::uptr *)&REAL(func))
402716a61d085a8fdf13a099822720e320414cc4dcTimur Iskhodzhanov#else
416d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#define INTERCEPT_FUNCTION_WIN(func)                                           \
426d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  ::__interception::OverrideFunction((::__interception::uptr)func,             \
436d1862363c88c183b0ed7740fca876342cf0474bStephen Hines                                     (::__interception::uptr)WRAP(func),       \
446d1862363c88c183b0ed7740fca876342cf0474bStephen Hines                                     (::__interception::uptr *)&REAL(func))
452716a61d085a8fdf13a099822720e320414cc4dcTimur Iskhodzhanov#endif
4607bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov
476d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#define INTERCEPT_FUNCTION_VER_WIN(func, symver) INTERCEPT_FUNCTION_WIN(func)
485e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
4907bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov#endif  // INTERCEPTION_WIN_H
5007bb9f1e3600195119aec1aae1aa48a6ed2f5febTimur Iskhodzhanov#endif  // _WIN32
51