27 #include "precompiled.h"
39 #if MSC_VERSION && MSC_VERSION >= 1700
41 # undef FACILITY_VISUALCPP
43 #define FACILITY_VISUALCPP ((LONG)0x6d)
44 #define VcppException(sev,status) ((sev) | (FACILITY_VISUALCPP<<16) | status)
120 notify_list = notify;
129 if(strncasecmp(pdli->
szDll, n->dll_name, strlen(n->dll_name)) == 0)
163 #pragma intrinsic(strlen,memcmp,memcpy)
170 return (
unsigned) (pitdCur - pitdBase);
195 while (pitd->u1.Function) {
214 void*
operator new(
size_t cb) { return ::LocalAlloc(LPTR, cb); }
215 void operator delete(
void* pv) { ::LocalFree(pv); }
221 while (*ppui && *ppui !=
this)
222 ppui = &((*ppui)->puiNext);
253 static inline PIMAGE_NT_HEADERS
WINAPI
255 return PIMAGE_NT_HEADERS(PBYTE(hmod) + PIMAGE_DOS_HEADER(hmod)->e_lfanew);
260 memcpy(pitdDst, pitdSrc,
CountOfImports(pitdDst) *
sizeof IMAGE_THUNK_DATA);
265 return pinh->FileHeader.TimeDateStamp;
270 return UINT_PTR(hmod) == pinh->OptionalHeader.ImageBase;
282 PFromRva<HMODULE*>(pidd->
rvaHmod),
283 PFromRva<PImgThunkData>(pidd->
rvaIAT),
284 PFromRva<PCImgThunkData>(pidd->
rvaINT),
297 PDelayLoadInfo rgpdli[1] = { &dli };
298 RaiseException(
VcppException(ERROR_SEVERITY_ERROR, ERROR_INVALID_PARAMETER), 0, 1, PULONG_PTR(rgpdli));
302 HMODULE hmod = *idd.phmod;
309 const unsigned iINT = iIAT;
313 dli.dlp.fImportByName = !IMAGE_SNAP_BY_ORDINAL(pitd->u1.Ordinal);
315 if (dli.dlp.fImportByName)
316 dli.dlp.szProcName =
LPCSTR(PFromRva<PIMAGE_IMPORT_BY_NAME>(
RVA(UINT_PTR(pitd->u1.AddressOfData)))->Name);
318 dli.dlp.dwOrdinal =
DWORD(IMAGE_ORDINAL(pitd->u1.Ordinal));
323 FARPROC pfnRet = NULL;
339 hmod = ::LoadLibraryA(dli.szDll);
342 dli.dwLastError = ::GetLastError();
352 PDelayLoadInfo rgpdli[1] = { &dli };
354 RaiseException(
VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND),
355 0, 1, PULONG_PTR(rgpdli));
369 HMODULE hmodT = HMODULE(InterlockedExchangePointer((PVOID *) idd.phmod, PVOID(hmod)));
372 if (pidd->rvaUnloadIAT) {
389 if (pidd->rvaBoundIAT && pidd->dwTimeStamp) {
394 if (pinh->Signature == IMAGE_NT_SIGNATURE &&
401 pfnRet = FARPROC(UINT_PTR(idd.pBoundIAT[iIAT].u1.Function));
403 goto SetEntryHookBypass;
408 pfnRet = ::GetProcAddress(hmod, dli.dlp.szProcName);
412 dli.dwLastError = ::GetLastError();
420 PDelayLoadInfo rgpdli[1] = { &dli };
422 RaiseException(
VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND),
423 0, 1, PULONG_PTR(rgpdli));
434 *ppfnIATEntry = pfnRet;
452 while((pui = __puiHead) != 0)
456 HMODULE* phmod = PFromRva<HMODULE*>(pidd->
rvaHmod);
457 HMODULE hmod = *phmod;
460 PFromRva<PImgThunkData>(pidd->
rvaIAT),
static PIMAGE_NT_HEADERS WINAPI PinhFromImageBase(HMODULE hmod)
FARPROC WINAPI __delayLoadHelper2(PCImgDelayDescr pidd, FARPROC *ppfnIATEntry)
ULI(PCImgDelayDescr pidd_)
const IMAGE_THUNK_DATA * PCImgThunkData
IMAGE_THUNK_DATA * PImgThunkData
EXTERN_C PfnDliHook __pfnDliNotifyHook2
static Status wdll_Shutdown()
struct DelayLoadProc DelayLoadProc
unsigned CountOfImports(PCImgThunkData pitdBase)
struct UnloadInfo UnloadInfo
const InternalImgDelayDescr * PCIIDD
unsigned IndexFromPImgThunkData(PCImgThunkData pitdCur, PCImgThunkData pitdBase)
static void WINAPI OverlayIAT(PImgThunkData pitdDst, PCImgThunkData pitdSrc)
#define WINIT_REGISTER_LATE_SHUTDOWN2(func)
struct DelayLoadInfo DelayLoadInfo
i64 Status
Error handling system.
static FARPROC WINAPI notify_hook(unsigned dliNotify, PDelayLoadInfo pdli)
static WdllLoadNotify * notify_list
InternalImgDelayDescr * PIIDD
void wdll_add_notify(WdllLoadNotify *notify)
const ImgDelayDescr * PCImgDelayDescr
PCImgThunkData pUnloadIAT
EXTERN_C PfnDliHook __pfnDliFailureHook2
static DWORD WINAPI TimeStampOfImage(PIMAGE_NT_HEADERS pinh)
static void UnloadAllDlls()
struct ImgDelayDescr * PImgDelayDescr
#define VcppException(sev, status)
FARPROC(WINAPI * PfnDliHook)(unsigned dliNotify, PDelayLoadInfo pdli)
struct UnloadInfo * PUnloadInfo
static bool WINAPI FLoadedAtPreferredAddress(PIMAGE_NT_HEADERS pinh, HMODULE hmod)
const IMAGE_DOS_HEADER __ImageBase
struct DelayLoadInfo * PDelayLoadInfo
struct ImgDelayDescr ImgDelayDescr