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;
|