// // DelayImp.h // // Copyright (c) Microsoft Corporation. All rights reserved. // // Define structures and prototypes necessary for delay loading of imports // #pragma once #define _DELAY_IMP_VER 2 #if defined(__cplusplus) #define ExternC extern "C" #else #define ExternC extern #endif typedef IMAGE_THUNK_DATA * PImgThunkData; typedef const IMAGE_THUNK_DATA * PCImgThunkData; typedef DWORD RVA; typedef struct ImgDelayDescr { DWORD grAttrs; // attributes RVA rvaDLLName; // RVA to dll name RVA rvaHmod; // RVA of module handle RVA rvaIAT; // RVA of the IAT RVA rvaINT; // RVA of the INT RVA rvaBoundIAT; // RVA of the optional bound IAT RVA rvaUnloadIAT; // RVA of optional copy of original IAT DWORD dwTimeStamp; // 0 if not bound, // O.W. date/time stamp of DLL bound to (Old BIND) } ImgDelayDescr, * PImgDelayDescr; typedef const ImgDelayDescr * PCImgDelayDescr; enum DLAttr { // Delay Load Attributes dlattrRva = 0x1, // RVAs are used instead of pointers // Having this set indicates a VC7.0 // and above delay load descriptor. }; // // Delay load import hook notifications // enum { dliStartProcessing, // used to bypass or note helper only dliNoteStartProcessing = dliStartProcessing, dliNotePreLoadLibrary, // called just before LoadLibrary, can // override w/ new HMODULE return val dliNotePreGetProcAddress, // called just before GetProcAddress, can // override w/ new FARPROC return value dliFailLoadLib, // failed to load library, fix it by // returning a valid HMODULE dliFailGetProc, // failed to get proc address, fix it by // returning a valid FARPROC dliNoteEndProcessing, // called after all processing is done, no // no bypass possible at this point except // by longjmp()/throw()/RaiseException. }; typedef struct DelayLoadProc { BOOL fImportByName; union { LPCSTR szProcName; DWORD dwOrdinal; }; } DelayLoadProc; typedef struct DelayLoadInfo { DWORD cb; // size of structure PCImgDelayDescr pidd; // raw form of data (everything is there) FARPROC * ppfn; // points to address of function to load LPCSTR szDll; // name of dll DelayLoadProc dlp; // name or ordinal of procedure HMODULE hmodCur; // the hInstance of the library we have loaded FARPROC pfnCur; // the actual function that will be called DWORD dwLastError;// error received (if an error notification) } DelayLoadInfo, * PDelayLoadInfo; typedef FARPROC (WINAPI *PfnDliHook)( unsigned dliNotify, PDelayLoadInfo pdli ); // // Unload support // // routine definition; takes a pointer to a name to unload // ExternC BOOL WINAPI __FUnloadDelayLoadedDLL2(LPCSTR szDll); // // Snap load support // ExternC HRESULT WINAPI __HrLoadAllImportsForDll(LPCSTR szDll); // // Exception information // //#define FACILITY_VISUALCPP ((LONG)0x6d) now defined in winerror.h #define VcppException(sev,err) ((sev) | (FACILITY_VISUALCPP<<16) | err) // // Hook pointers // // The "notify hook" gets called for every call to the // delay load helper. This allows a user to hook every call and // skip the delay load helper entirely. // // dliNotify == { // dliStartProcessing | // dliNotePreLoadLibrary | // dliNotePreGetProc | // dliNoteEndProcessing} // on this call. // ExternC PfnDliHook __pfnDliNotifyHook2; // This is the failure hook, dliNotify = {dliFailLoadLib|dliFailGetProc} ExternC PfnDliHook __pfnDliFailureHook2;