__pfnDliNotifyHook, __pfnDliFailureHook
delayimp.h:インデックス への移動
ヘッダーファイル
delayimp.h
カテゴリ
遅延ロードフック通知ルーチン
プロトタイプ
typedef FARPROC (WINAPI *DelayedLoadHook)(dliNotification dliNotify,
DelayLoadInfo * pdli);
説明
遅延ロードメカニズムには,実行時に遅延ロード DLL の動作を変更できるように 2 つのフックが用意されています。遅延ロード処理を変更するには,上の関数宣言を使用し,これを 2 つのフックに割り当てて,独自のフック関数を記述します。
DelayLoadProc 構造体
typedef struct DelayLoadProc
{
BOOL fImportByName;
union
{
LPCSTR szProcName;
DWORD dwOrdinal;
};
} DelayLoadProc;
ImgDelayDescr 構造体
typedef struct ImgDelayDescr
{
DWORD grAttrs; /* 属性 */
LPCSTR szName; /* DLL 名へのポインタ */
HMODULE hmod; /* モジュールハンドルのアドレス */
IMAGE_THUNK_DATA * pIAT; /* IAT のアドレス */
IMAGE_THUNK_DATA * pINT; /* INT のアドレス */
IMAGE_THUNK_DATA * pBoundIAT; /* バインドされた IAT(オプション)のアドレス */
IMAGE_THUNK_DATA * pUnloadIAT; /* 元の IAT のコピー(オプション)の
コピーのアドレス */
DWORD dwTimeStamp; /* バインドされていない場合は 0。 */
/* それ以外の場合は,(以前のバインド)にバインドされた DLL の
日付/時刻スタンプ */
} ImgDelayDescr;
DelayLoadInfo 構造体
typedef struct DelayLoadInfo
{
DWORD cb; /* 構造体のサイズ */
const ImgDelayDescr * pidd; /* 元の形式のデータ(すべてのデータを
含む) */
FARPROC * ppfn; /* ロードする関数のアドレスを指す
ポインタ */
LPCSTR szDll; /* DLL の名前 */
DelayLoadProc dlp; /* プロシージャの名前または序数 */
HMODULE hmodCur; /* ロードしたライブラリの hInstance
*/
FARPROC pfnCur; /* 実際も呼び出される
関数 */
DWORD dwLastError;/* 受け取ったエラー(エラー通知が
ある場合) */
} DelayLoadInfo, *PDelayLoadInfo;
遅延ロードインポートフック通知
次の構造体は,フック通知イベント用に定義された列挙型です。
typedef enum
{
dliNoteStartProcessing, /* ヘルパーのバイパスまたは通知だけに使用されます */
dliNotePreLoadLibrary, /* LoadLibrary の直前に呼び出され, */
/* 新しい HMODULE の戻り値で上書きできます */
dliNotePreGetProcAddress, /* GetProcAddress の直前に呼び出され,*/
/* 新しい FARPROC の戻り値で上書きできます */
dliFailLoadLibrary, /* ライブラリのロードに失敗しました。 */
/* 有効な HMODULE を返すことで修復します。 */
dliFailGetProcAddress, /* プロシージャアドレスの取得に失敗しました。*/
/* 有効な FARPROC を返すことで修復します。 */
dliNoteEndProcessing, /* すべての処理が完了した後で呼び出されます。 */
/* longjmp(),throw(),RaiseException */
/* 以外に,この時点で実行できる
バイパスはありません。 */
} dliNotification;
フックポインタ
「通知フック」は,遅延ロードヘルパーを呼び出すたびに呼び出されます。これにより,すべての呼び出しをフックし,遅延ロードヘルパーを完全にスキップできます。
extern DelayedLoadHook _EXPDATA __pfnDliNotifyHook;
dliNotify ==
{
dliNoteStartProcessing |
dliNotePreLoadLibrary |
dliNotePreGetProcAddress |
dliNoteEndProcessing
}
メモ: 「失敗した」フックは次のフックに割り当てられます。
extern DelayedLoadHook _EXPDATA __pfnDliFailureHook;
このフックは,次の通知フラグを使って呼び出されます。
dliNotify ==
{
dliFailLoadLibrary |
dliFailGetProcAddress
}
この通知イベントが遅延ロード処理中のいつ発生するかについては,delayhlp.c を参照してください。