コールバック関数RTL_RUN_ONCE_INIT_FN (ntddk.h)
RunOnceInitialization ルーチンは、1 回限りの初期化操作を実行します。
構文
RTL_RUN_ONCE_INIT_FN (
_Inout_ PRTL_RUN_ONCE RunOnce,
_Inout_opt_ PVOID Parameter,
_Inout_opt_ PVOID *Context
);
パラメーター
[in, out] RunOnce
ドライバーが以前にパラメーターとしてこの RunOnceInitialization ルーチンを呼び出した RtlRunOnceExecuteOnce ルーチンに渡した、RTL_RUN_ONCE 1 回限りの初期化構造体へのポインター。
[in, out] Parameter
この RunOnceInitialization ルーチンを呼び出した RtlRunOnceExecuteOnce ルーチンにドライバーが渡した Parameter 値。
[out] Context
ルーチンが初期化データを書き込む PVOID 変数へのポインター。
戻り値
RunOnceInitialization ルーチンは、成功を示す 0 以外の値を返し、失敗を示す 0 を返します。
注釈
ドライバーによって実装された RunOnceInitialization ルーチンは、ドライバー固有の初期化を実行し、 Context パラメーターが指すメモリの場所に初期化データを書き込みます。 ドライバーは 、RtlRunOnceExecuteOnce ルーチンを使用して、 RunOnceInitialization ルーチンを 1 回限り呼び出します。 オペレーティング システムは、RunOnce パラメーターの同じ値に対して RunOnceInitialization ルーチンが 2 回呼び出されないことを保証します。
Context パラメーターが指す場所にある下位ビットの数が少なく、オペレーティング システムで使用するために予約されています。 ドライバーの RunOnceInitialization ルーチンは、*Context に書き込む出力値で、これらの予約済みビットを 0 に設定する必要があります。 Ntddk.h で定義されているRTL_RUN_ONCE_CTX_RESERVED_BITS定数は、予約されている下位ビットの数を指定します。 現在、RTL_RUN_ONCE_CTX_RESERVED_BITS は 2 として定義されています。つまり、ドライバーは 、Context によって指される PVOID 値の 2 つの最下位ビットを 0 に設定する必要があります。
例
RunOnceInitialization コールバック ルーチンを定義するには、まず、定義するコールバック ルーチンの種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバーのコールバック関数型のセットが用意されています。 コールバック関数の種類を使用して関数を宣言すると、 ドライバーのコード分析、 静的ドライバー検証ツール (SDV)、およびその他の検証ツールでエラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。
たとえば、 という名前MyRunOnceInitialization
の RunOnceInitialization コールバック ルーチンを定義するには、次のコード例に示すように、RTL_RUN_ONCE_INIT_FN型を使用します。
RTL_RUN_ONCE_INIT_FN MyRunOnceInitialization;
次に、コールバック ルーチンを次のように実装します。
_Use_decl_annotations_
ULONG
MyRunOnceInitialization(
PRTL_RUN_ONCE RunOnce,
PVOID Parameter,
PVOID *Context
)
{
// Function body
}
RTL_RUN_ONCE_INIT_FN関数の種類は、Wdm.h ヘッダー ファイルで定義されています。 コード分析ツールの実行時にエラーをより正確に識別するには、必ず注釈を _Use_decl_annotations_
関数定義に追加してください。 注釈を _Use_decl_annotations_
使用すると、ヘッダー ファイル内のRTL_RUN_ONCE_INIT_FN関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「 WDM ドライバーの関数ロール型を使用して関数を宣言する」を参照してください。 の詳細 _Use_decl_annotations_
については、「 関数の動作に注釈を付ける」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | ドライバーは、Windows Vista 以降のバージョンの Windows でのみ RunOnceInitialization ルーチンを実装できます。 |
対象プラットフォーム | デスクトップ |
Header | ntddk.h (Ntddk.h、Ntifs.h を含む) |
IRQL | IRQL <= APC_LEVELで呼び出されます。 |