__pfnDliNotifyHook, __pfnDliFailureHook

提供: RAD Studio
移動先: 案内検索

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 を参照してください。