Home | History | Annotate | Line # | Download | only in interception
      1  1.1  kamil //===-- interception_linux.h ------------------------------------*- C++ -*-===//
      2  1.1  kamil //
      3  1.1  kamil //                     The LLVM Compiler Infrastructure
      4  1.1  kamil //
      5  1.1  kamil // This file is distributed under the University of Illinois Open Source
      6  1.1  kamil // License. See LICENSE.TXT for details.
      7  1.1  kamil //
      8  1.1  kamil //===----------------------------------------------------------------------===//
      9  1.1  kamil //
     10  1.1  kamil // This file is a part of AddressSanitizer, an address sanity checker.
     11  1.1  kamil //
     12  1.1  kamil // Windows-specific interception methods.
     13  1.1  kamil //===----------------------------------------------------------------------===//
     14  1.1  kamil 
     15  1.1  kamil #if SANITIZER_WINDOWS
     16  1.1  kamil 
     17  1.1  kamil #if !defined(INCLUDED_FROM_INTERCEPTION_LIB)
     18  1.1  kamil # error "interception_win.h should be included from interception library only"
     19  1.1  kamil #endif
     20  1.1  kamil 
     21  1.1  kamil #ifndef INTERCEPTION_WIN_H
     22  1.1  kamil #define INTERCEPTION_WIN_H
     23  1.1  kamil 
     24  1.1  kamil namespace __interception {
     25  1.1  kamil // All the functions in the OverrideFunction() family return true on success,
     26  1.1  kamil // false on failure (including "couldn't find the function").
     27  1.1  kamil 
     28  1.1  kamil // Overrides a function by its address.
     29  1.1  kamil bool OverrideFunction(uptr old_func, uptr new_func, uptr *orig_old_func = 0);
     30  1.1  kamil 
     31  1.1  kamil // Overrides a function in a system DLL or DLL CRT by its exported name.
     32  1.1  kamil bool OverrideFunction(const char *name, uptr new_func, uptr *orig_old_func = 0);
     33  1.1  kamil 
     34  1.1  kamil // Windows-only replacement for GetProcAddress. Useful for some sanitizers.
     35  1.1  kamil uptr InternalGetProcAddress(void *module, const char *func_name);
     36  1.1  kamil 
     37  1.1  kamil // Overrides a function only when it is called from a specific DLL. For example,
     38  1.1  kamil // this is used to override calls to HeapAlloc/HeapFree from ucrtbase without
     39  1.1  kamil // affecting other third party libraries.
     40  1.1  kamil bool OverrideImportedFunction(const char *module_to_patch,
     41  1.1  kamil                               const char *imported_module,
     42  1.1  kamil                               const char *function_name, uptr new_function,
     43  1.1  kamil                               uptr *orig_old_func);
     44  1.1  kamil 
     45  1.1  kamil #if !SANITIZER_WINDOWS64
     46  1.1  kamil // Exposed for unittests
     47  1.1  kamil bool OverrideFunctionWithDetour(
     48  1.1  kamil     uptr old_func, uptr new_func, uptr *orig_old_func);
     49  1.1  kamil #endif
     50  1.1  kamil 
     51  1.1  kamil // Exposed for unittests
     52  1.1  kamil bool OverrideFunctionWithRedirectJump(
     53  1.1  kamil     uptr old_func, uptr new_func, uptr *orig_old_func);
     54  1.1  kamil bool OverrideFunctionWithHotPatch(
     55  1.1  kamil     uptr old_func, uptr new_func, uptr *orig_old_func);
     56  1.1  kamil bool OverrideFunctionWithTrampoline(
     57  1.1  kamil     uptr old_func, uptr new_func, uptr *orig_old_func);
     58  1.1  kamil 
     59  1.1  kamil // Exposed for unittests
     60  1.1  kamil void TestOnlyReleaseTrampolineRegions();
     61  1.1  kamil 
     62  1.1  kamil }  // namespace __interception
     63  1.1  kamil 
     64  1.1  kamil #if defined(INTERCEPTION_DYNAMIC_CRT)
     65  1.1  kamil #define INTERCEPT_FUNCTION_WIN(func)                                           \
     66  1.1  kamil   ::__interception::OverrideFunction(#func,                                    \
     67  1.1  kamil                                      (::__interception::uptr)WRAP(func),       \
     68  1.1  kamil                                      (::__interception::uptr *)&REAL(func))
     69  1.1  kamil #else
     70  1.1  kamil #define INTERCEPT_FUNCTION_WIN(func)                                           \
     71  1.1  kamil   ::__interception::OverrideFunction((::__interception::uptr)func,             \
     72  1.1  kamil                                      (::__interception::uptr)WRAP(func),       \
     73  1.1  kamil                                      (::__interception::uptr *)&REAL(func))
     74  1.1  kamil #endif
     75  1.1  kamil 
     76  1.1  kamil #define INTERCEPT_FUNCTION_VER_WIN(func, symver) INTERCEPT_FUNCTION_WIN(func)
     77  1.1  kamil 
     78  1.1  kamil #define INTERCEPT_FUNCTION_DLLIMPORT(user_dll, provider_dll, func)       \
     79  1.1  kamil   ::__interception::OverrideImportedFunction(                            \
     80  1.1  kamil       user_dll, provider_dll, #func, (::__interception::uptr)WRAP(func), \
     81  1.1  kamil       (::__interception::uptr *)&REAL(func))
     82  1.1  kamil 
     83  1.1  kamil #endif  // INTERCEPTION_WIN_H
     84  1.1  kamil #endif  // SANITIZER_WINDOWS
     85