ReactOS 0.4.16-dev-2522-g97cc325
delayimp.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS delayimport Library
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Implementation of delayimport library
5 * COPYRIGHT: Copyright 2009 Timo Kreuzer <timo.kreuzer@reactos.org>
6 * Copyright 2016 Mark Jansen
7 */
8
9#include <stdarg.h>
10#include <windef.h>
11#include <winbase.h>
12#include <delayimp.h>
13
14/**** Linker magic: provide default (NULL) pointers in separate
15 **** compilation units (pfnDliNotifyHook2.c and pfnDliFailureHook2.c),
16 **** so as to allow the user to override these ****/
17
18/* The actual symbols we use */
21
22
23/**** Helper functions to convert from RVA to address ****/
24
26unsigned
28{
29 return pData - pBase;
30}
31
32extern const IMAGE_DOS_HEADER __ImageBase;
33
37{
38 return (PVOID)(((ULONG_PTR)(rva)) + ((ULONG_PTR)&__ImageBase));
39}
40
41
42/**** load helper ****/
43
46{
47 DelayLoadInfo dli = {0};
48 int index;
49 PImgThunkData pIAT;
50 PImgThunkData pINT;
51 HMODULE *phMod;
52
53 pIAT = PFromRva(pidd->rvaIAT);
54 pINT = PFromRva(pidd->rvaINT);
55 phMod = PFromRva(pidd->rvaHmod);
56 index = IndexFromPImgThunkData(pIATEntry, pIAT);
57
58 dli.cb = sizeof(dli);
59 dli.pidd = pidd;
60 dli.ppfn = (FARPROC*)&pIAT[index].u1.Function;
61 dli.szDll = PFromRva(pidd->rvaDLLName);
63 if (dli.dlp.fImportByName)
64 {
65 /* u1.AddressOfData points to a IMAGE_IMPORT_BY_NAME struct */
67 dli.dlp.szProcName = (LPCSTR)&piibn->Name;
68 }
69 else
70 {
72 }
73
75 {
77 if (dli.pfnCur)
78 {
79 pIAT[index].u1.Function = (DWORD_PTR)dli.pfnCur;
82
83 return dli.pfnCur;
84 }
85 }
86
87 dli.hmodCur = *phMod;
88
89 if (dli.hmodCur == NULL)
90 {
93 if (dli.hmodCur == NULL)
94 {
95 dli.hmodCur = LoadLibraryA(dli.szDll);
96 if (dli.hmodCur == NULL)
97 {
101
102 if (dli.hmodCur == NULL)
103 {
104 ULONG_PTR args[] = { (ULONG_PTR)&dli };
106
107 /* If we survive the exception, we are expected to use pfnCur directly.. */
108 return dli.pfnCur;
109 }
110 }
111 }
112 *phMod = dli.hmodCur;
113 }
114
116
119 if (dli.pfnCur == NULL)
120 {
121 /* dli.dlp.szProcName might also contain the ordinal */
123 if (dli.pfnCur == NULL)
124 {
128
129 if (dli.pfnCur == NULL)
130 {
131 ULONG_PTR args[] = { (ULONG_PTR)&dli };
133 }
134
135 //return NULL;
136 }
137 }
138
139 pIAT[index].u1.Function = (DWORD_PTR)dli.pfnCur;
141
144
145 return dli.pfnCur;
146}
147
#define index(s, c)
Definition: various.h:29
PfnDliHook __pfnDliFailureHook2
Definition: reactos.c:2964
PfnDliHook __pfnDliNotifyHook2
Custom delay-loading hooks for loading the Setup DLLs from a suitable path.
Definition: reactos.c:2963
const IMAGE_DOS_HEADER __ImageBase
FORCEINLINE unsigned IndexFromPImgThunkData(PCImgThunkData pData, PCImgThunkData pBase)
Definition: delayimp.c:27
FARPROC WINAPI __delayLoadHelper2(PCImgDelayDescr pidd, PImgThunkData pIATEntry)
Definition: delayimp.c:45
FORCEINLINE PVOID PFromRva(RVA rva)
Definition: delayimp.c:36
#define VcppException(sev, err)
Definition: delayimp.cpp:38
@ dliNoteEndProcessing
Definition: delayimp.h:39
@ dliFailLoadLib
Definition: delayimp.h:37
@ dliNotePreGetProcAddress
Definition: delayimp.h:36
@ dliNotePreLoadLibrary
Definition: delayimp.h:35
@ dliFailGetProc
Definition: delayimp.h:38
@ dliStartProcessing
Definition: delayimp.h:34
FARPROC(WINAPI * PfnDliHook)(unsigned, PDelayLoadInfo)
Definition: delayimp.h:77
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define ERROR_MOD_NOT_FOUND
Definition: compat.h:104
int(* FARPROC)()
Definition: compat.h:36
DWORD RVA
Definition: compat.h:1262
#define GetProcAddress(x, y)
Definition: compat.h:753
VOID WINAPI RaiseException(_In_ DWORD dwExceptionCode, _In_ DWORD dwExceptionFlags, _In_ DWORD nNumberOfArguments, _In_opt_ const ULONG_PTR *lpArguments)
Definition: except.c:700
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
#define ULONG_PTR
Definition: config.h:101
GLuint index
Definition: glext.h:6031
GLdouble u1
Definition: glext.h:8308
if(dx< 0)
Definition: linetemp.h:194
#define ERROR_SEVERITY_ERROR
Definition: ntbasedef.h:608
#define IMAGE_SNAP_BY_ORDINAL(Ordinal)
Definition: ntimage.h:567
#define IMAGE_ORDINAL(Ordinal)
Definition: pedump.c:337
PCImgDelayDescr pidd
Definition: delayimp.h:68
HMODULE hmodCur
Definition: delayimp.h:72
DWORD cb
Definition: delayimp.h:67
FARPROC pfnCur
Definition: delayimp.h:73
LPCSTR szDll
Definition: delayimp.h:70
DelayLoadProc dlp
Definition: delayimp.h:71
FARPROC * ppfn
Definition: delayimp.h:69
DWORD dwLastError
Definition: delayimp.h:74
BOOL fImportByName
Definition: delayimp.h:57
DWORD dwOrdinal
Definition: delayimp.h:61
LPCSTR szProcName
Definition: delayimp.h:60
RVA rvaDLLName
Definition: delayimp.h:45
union _IMAGE_THUNK_DATA32::@2315 u1
Definition: match.c:390
#define DWORD_PTR
Definition: treelist.c:76
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint32_t ULONG_PTR
Definition: typedefs.h:65
HANDLE HMODULE
Definition: typedefs.h:77
#define FORCEINLINE
Definition: wdftypes.h:67
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WINAPI
Definition: msvc.h:6
#define ERROR_PROC_NOT_FOUND
Definition: winerror.h:321
const char * LPCSTR
Definition: xmlstorage.h:183