131 lines
4.3 KiB
C
131 lines
4.3 KiB
C
|
//
|
||
|
// 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;
|