OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
IatHook.hpp File Reference
#include <stdint.h>
#include <cstddef>
#include <cstring>
#include <string.h>
Include dependency graph for IatHook.hpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

template<typename T, typename T1, typename T2>
constexpr T RVA2VA (T1 base, T2 rva)
template<typename T>
constexpr T DataDirectoryFromModuleBase (void *moduleBase, size_t entryID)
PIMAGE_THUNK_DATA FindAddressByName (void *moduleBase, PIMAGE_THUNK_DATA impName, PIMAGE_THUNK_DATA impAddr, const char *funcName)
PIMAGE_THUNK_DATA FindAddressByOrdinal (void *moduleBase, PIMAGE_THUNK_DATA impName, PIMAGE_THUNK_DATA impAddr, uint16_t ordinal)
PIMAGE_THUNK_DATA FindIatThunkInModule (void *moduleBase, const char *dllName, const char *funcName)
PIMAGE_THUNK_DATA FindDelayLoadThunkInModule (void *moduleBase, const char *dllName, const char *funcName)
PIMAGE_THUNK_DATA FindDelayLoadThunkInModule (void *moduleBase, const char *dllName, uint16_t ordinal)

Function Documentation

◆ DataDirectoryFromModuleBase()

template<typename T>
T DataDirectoryFromModuleBase ( void * moduleBase,
size_t entryID )
constexpr
21{
22 auto dosHdr = reinterpret_cast<PIMAGE_DOS_HEADER>(moduleBase);
23 auto ntHdr = RVA2VA<PIMAGE_NT_HEADERS>(moduleBase, dosHdr->e_lfanew);
24 auto dataDir = ntHdr->OptionalHeader.DataDirectory;
25 return RVA2VA<T>(moduleBase, dataDir[entryID].VirtualAddress);
26}
constexpr T RVA2VA(T1 base, T2 rva)
Definition IatHook.hpp:14

References RVA2VA().

Referenced by FindDelayLoadThunkInModule(), FindDelayLoadThunkInModule(), and FindIatThunkInModule().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FindAddressByName()

PIMAGE_THUNK_DATA FindAddressByName ( void * moduleBase,
PIMAGE_THUNK_DATA impName,
PIMAGE_THUNK_DATA impAddr,
const char * funcName )
29{
30 for (; impName->u1.Ordinal; ++impName, ++impAddr)
31 {
32 if (IMAGE_SNAP_BY_ORDINAL(impName->u1.Ordinal))
33 continue;
34
35 auto import = RVA2VA<PIMAGE_IMPORT_BY_NAME>(moduleBase, impName->u1.AddressOfData);
36 if (strcmp(import->Name, funcName) != 0)
37 continue;
38 return impAddr;
39 }
40 return nullptr;
41}

Referenced by FindDelayLoadThunkInModule(), and FindIatThunkInModule().

Here is the caller graph for this function:

◆ FindAddressByOrdinal()

PIMAGE_THUNK_DATA FindAddressByOrdinal ( void * moduleBase,
PIMAGE_THUNK_DATA impName,
PIMAGE_THUNK_DATA impAddr,
uint16_t ordinal )
44{
45 UNREFERENCED_PARAMETER(moduleBase);
46 for (; impName->u1.Ordinal; ++impName, ++impAddr)
47 {
48 if (IMAGE_SNAP_BY_ORDINAL(impName->u1.Ordinal) && IMAGE_ORDINAL(impName->u1.Ordinal) == ordinal)
49 return impAddr;
50 }
51 return nullptr;
52}

Referenced by FindDelayLoadThunkInModule().

Here is the caller graph for this function:

◆ FindDelayLoadThunkInModule() [1/2]

PIMAGE_THUNK_DATA FindDelayLoadThunkInModule ( void * moduleBase,
const char * dllName,
const char * funcName )
70{
71 auto imports = DataDirectoryFromModuleBase<PIMAGE_DELAYLOAD_DESCRIPTOR>(moduleBase, IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT);
72 for (; imports->DllNameRVA; ++imports)
73 {
74 if (_stricmp(RVA2VA<LPCSTR>(moduleBase, imports->DllNameRVA), dllName) != 0)
75 continue;
76
77 auto impName = RVA2VA<PIMAGE_THUNK_DATA>(moduleBase, imports->ImportNameTableRVA);
78 auto impAddr = RVA2VA<PIMAGE_THUNK_DATA>(moduleBase, imports->ImportAddressTableRVA);
79 return FindAddressByName(moduleBase, impName, impAddr, funcName);
80 }
81 return nullptr;
82}
constexpr T DataDirectoryFromModuleBase(void *moduleBase, size_t entryID)
Definition IatHook.hpp:20
PIMAGE_THUNK_DATA FindAddressByName(void *moduleBase, PIMAGE_THUNK_DATA impName, PIMAGE_THUNK_DATA impAddr, const char *funcName)
Definition IatHook.hpp:28

References DataDirectoryFromModuleBase(), FindAddressByName(), and RVA2VA().

Referenced by FixDarkScrollBar().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FindDelayLoadThunkInModule() [2/2]

PIMAGE_THUNK_DATA FindDelayLoadThunkInModule ( void * moduleBase,
const char * dllName,
uint16_t ordinal )
85{
86 auto imports = DataDirectoryFromModuleBase<PIMAGE_DELAYLOAD_DESCRIPTOR>(moduleBase, IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT);
87 for (; imports->DllNameRVA; ++imports)
88 {
89 if (_stricmp(RVA2VA<LPCSTR>(moduleBase, imports->DllNameRVA), dllName) != 0)
90 continue;
91
92 auto impName = RVA2VA<PIMAGE_THUNK_DATA>(moduleBase, imports->ImportNameTableRVA);
93 auto impAddr = RVA2VA<PIMAGE_THUNK_DATA>(moduleBase, imports->ImportAddressTableRVA);
94 return FindAddressByOrdinal(moduleBase, impName, impAddr, ordinal);
95 }
96 return nullptr;
97}
PIMAGE_THUNK_DATA FindAddressByOrdinal(void *moduleBase, PIMAGE_THUNK_DATA impName, PIMAGE_THUNK_DATA impAddr, uint16_t ordinal)
Definition IatHook.hpp:43

References DataDirectoryFromModuleBase(), FindAddressByOrdinal(), and RVA2VA().

Here is the call graph for this function:

◆ FindIatThunkInModule()

PIMAGE_THUNK_DATA FindIatThunkInModule ( void * moduleBase,
const char * dllName,
const char * funcName )
55{
56 auto imports = DataDirectoryFromModuleBase<PIMAGE_IMPORT_DESCRIPTOR>(moduleBase, IMAGE_DIRECTORY_ENTRY_IMPORT);
57 for (; imports->Name; ++imports)
58 {
59 if (_stricmp(RVA2VA<LPCSTR>(moduleBase, imports->Name), dllName) != 0)
60 continue;
61
62 auto origThunk = RVA2VA<PIMAGE_THUNK_DATA>(moduleBase, imports->OriginalFirstThunk);
63 auto thunk = RVA2VA<PIMAGE_THUNK_DATA>(moduleBase, imports->FirstThunk);
64 return FindAddressByName(moduleBase, origThunk, thunk, funcName);
65 }
66 return nullptr;
67}

References DataDirectoryFromModuleBase(), FindAddressByName(), and RVA2VA().

Here is the call graph for this function:

◆ RVA2VA()

template<typename T, typename T1, typename T2>
T RVA2VA ( T1 base,
T2 rva )
constexpr
15{
16 return reinterpret_cast<T>(reinterpret_cast<ULONG_PTR>(base) + rva);
17}

Referenced by DataDirectoryFromModuleBase(), FindDelayLoadThunkInModule(), FindDelayLoadThunkInModule(), and FindIatThunkInModule().

Here is the caller graph for this function: