ReactOS 0.4.16-dev-2522-g97cc325
delayimp.c File Reference
#include <stdarg.h>
#include <windef.h>
#include <winbase.h>
#include <delayimp.h>
Include dependency graph for delayimp.c:

Go to the source code of this file.

Functions

FORCEINLINE unsigned IndexFromPImgThunkData (PCImgThunkData pData, PCImgThunkData pBase)
 
FORCEINLINE PVOID PFromRva (RVA rva)
 
FARPROC WINAPI __delayLoadHelper2 (PCImgDelayDescr pidd, PImgThunkData pIATEntry)
 

Variables

PfnDliHook __pfnDliNotifyHook2
 Custom delay-loading hooks for loading the Setup DLLs from a suitable path.
 
PfnDliHook __pfnDliFailureHook2
 
const IMAGE_DOS_HEADER __ImageBase
 

Function Documentation

◆ __delayLoadHelper2()

FARPROC WINAPI __delayLoadHelper2 ( PCImgDelayDescr  pidd,
PImgThunkData  pIATEntry 
)

Definition at line 45 of file delayimp.c.

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);
62 dli.dlp.fImportByName = !IMAGE_SNAP_BY_ORDINAL(pINT[index].u1.Ordinal);
63 if (dli.dlp.fImportByName)
64 {
65 /* u1.AddressOfData points to a IMAGE_IMPORT_BY_NAME struct */
66 PIMAGE_IMPORT_BY_NAME piibn = PFromRva((RVA)pINT[index].u1.AddressOfData);
67 dli.dlp.szProcName = (LPCSTR)&piibn->Name;
68 }
69 else
70 {
71 dli.dlp.dwOrdinal = IMAGE_ORDINAL(pINT[index].u1.Ordinal);
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}
#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
FORCEINLINE unsigned IndexFromPImgThunkData(PCImgThunkData pData, PCImgThunkData pBase)
Definition: delayimp.c:27
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
#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
uint32_t ULONG_PTR
Definition: typedefs.h:65
HANDLE HMODULE
Definition: typedefs.h:77
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define ERROR_PROC_NOT_FOUND
Definition: winerror.h:321
const char * LPCSTR
Definition: xmlstorage.h:183

◆ IndexFromPImgThunkData()

FORCEINLINE unsigned IndexFromPImgThunkData ( PCImgThunkData  pData,
PCImgThunkData  pBase 
)

Definition at line 27 of file delayimp.c.

28{
29 return pData - pBase;
30}
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830

Referenced by __delayLoadHelper2().

◆ PFromRva()

FORCEINLINE PVOID PFromRva ( RVA  rva)

Definition at line 36 of file delayimp.c.

37{
38 return (PVOID)(((ULONG_PTR)(rva)) + ((ULONG_PTR)&__ImageBase));
39}
const IMAGE_DOS_HEADER __ImageBase

Referenced by __delayLoadHelper2().

Variable Documentation

◆ __ImageBase

const IMAGE_DOS_HEADER __ImageBase
extern

Referenced by PFromRva().

◆ __pfnDliFailureHook2

PfnDliHook __pfnDliFailureHook2
extern

Definition at line 2964 of file reactos.c.

Referenced by __delayLoadHelper2().

◆ __pfnDliNotifyHook2

PfnDliHook __pfnDliNotifyHook2
extern

Custom delay-loading hooks for loading the Setup DLLs from a suitable path.

Definition at line 2963 of file reactos.c.

Referenced by __delayLoadHelper2().