ファイル システム フィルター ドライバーで ECP を使用して IRP_MJ_CREATE 操作を処理する
ファイル システム フィルター ドライバーで追加の作成パラメーター (ECP) を使用して、 IRP_MJ_CREATE 操作を処理できます。 ファイル システム フィルター ドライバーは、次のセクションのルーチンを呼び出して、 IRP_MJ_CREATE 操作の ECP を取得、設定 (追加)、確認、および削除できます。 ECP の発生元のオペレーティング システム領域を決定することもできます。
ECP の取得
IRP_MJ_CREATE 操作の ECP を取得するには:
FltGetEcpListFromCallbackData (または FsRtlGetEcpListFromIrp) を呼び出して、作成操作に関連付けられている ECP_LIST へのポインターを取得します。
次のいずれかの操作を実行します。
- FltGetNextExtraCreateParameter (または FsRtlGetNextExtraCreateParameter) を呼び出して、ECP リスト内の次の (または最初の) ECP コンテキスト構造へのポインターを取得します。
- FltFindExtraCreateParameter (または FsRtlFindExtraCreateParameter) を呼び出して、ECP リストで特定の型の ECP コンテキスト構造を検索します。 構造体が見つかった場合、どちらのルーチンも ECP コンテキスト構造体へのポインターを返します。
ECP の設定;
IRP_MJ_CREATE 操作の ECP を設定するには、ファイル システム フィルター ドライバーは次のいずれかを行います。
既存の ECP_LIST に ECP を設定します。
新しく作成した ECP_LIST に ECP を設定します。
既存の ECP_LIST での ECP の設定
作成操作に関連付けられている existing ECP_LIST で ECP を設定するには:
FltGetEcpListFromCallbackData (または FsRtlGetEcpListFromIrp) を呼び出して、作成操作に関連付けられている ECP_LIST へのポインターを取得します。
FltAllocateExtraCreateParameter (または FsRtlAllocateExtraCreateParameter) を呼び出して、ECP コンテキスト構造体にページ メモリ プールを割り当て、その構造体へのポインターを生成します。
FltInsertExtraCreateParameter (または FsRtlInsertExtraCreateParameter) を呼び出して、ECP コンテキスト構造体を ECP_LIST 構造体に挿入します。
新しく作成された ECP_LIST での ECP の設定
ECP_LIST が現在作成操作に関連付けられていない場合は、作成し、その中に ECP を設定する必要があります。
FltAllocateExtraCreateParameterList (または FsRtlAllocateExtraCreateParameterList) を呼び出して、 ECP_LIST 構造体のメモリを割り当てます。
FltAllocateExtraCreateParameter (または FsRtlAllocateExtraCreateParameter) を呼び出して、ECP コンテキスト構造体にページ メモリ プールを割り当て、その構造体へのポインターを生成します。
FltInsertExtraCreateParameter (または FsRtlInsertExtraCreateParameter) を呼び出して、ECP コンテキスト構造体を ECP_LIST に挿入します。
FltSetEcpListIntoCallbackData (または FsRtlSetEcpListIntoIrp) を呼び出して、ECP リストを作成操作にアタッチします。
ECP の削除
IRP_MJ_CREATE 操作の ECP を削除するには:
FltRemoveExtraCreateParameter (または FsRtlRemoveExtraCreateParameter) を呼び出して、ECP リストで ECP コンテキスト構造を検索します。 ECP コンテキスト構造が見つかった場合、ルーチンは ECP コンテキスト構造を ECP リストからデタッチします。
デタッチされた ECP コンテキスト構造体のメモリを解放するには、 FltFreeExtraCreateParameter (または FsRtlFreeExtraCreateParameter) を呼び出します。 次のいずれかの方法でメモリを割り当てた場合は、これらのルーチンを呼び出して ECP コンテキスト構造のメモリを解放できます。
- ページ メモリ プールを割り当てるために FltAllocateExtraCreateParameter (または FsRtlAllocateExtraCreateParameter) を呼び出しました
- FltAllocateExtraCreateParameterFromLookasideList (または FsRtlAllocateExtraCreateParameterFromLookasideList) を呼び出して、ルックアサイド リストからメモリ プールを割り当てた
ECP を確認済みとしてマークするか、受信確認状態を決定する
次のルーチンを呼び出して、ECP を確認済みとしてマークするか、または ECP が受信確認済みとしてマークされているかどうかを判断します。
FltAcknowledgeEcp (または FsRtlAcknowledgeEcp) を呼び出して、ECP コンテキスト構造を確認済みとしてマークします。 ECP は、ECP の検索、使用、処理、またはその他の条件としてマークできます。
FltIsEcpAcknowledged (または FsRtlIsEcpAcknowledged) を呼び出して、ECP コンテキスト構造が受信確認済みとしてマークされているかどうかを判断します。
起点モードの決定
FltIsEcpFromUserMode (または FsRtlIsEcpFromUserMode) を呼び出して、ECP コンテキスト構造がユーザー モードから発生したかどうかを判断します。 ファイル システム フィルター ドライバーは、ユーザー モードから発生した ECP コンテキスト構造の受け入れを拒否できます。
ルックアサイド リストを使用して ECP を割り当てる
ルックアサイド リスト から ECP を割り当て、ルックアサイド リスト と ECP を管理するには、次のルーチンを呼び出します。
FltInitExtraCreateParameterLookasideList (または FsRtlInitExtraCreateParameterLookasideList) を呼び出して、固定サイズの 1 つ以上の ECP コンテキスト構造の割り当てに使用されるページプールまたは非ページ プール ルックアサイド リストを初期化します。
FltDeleteExtraCreateParameterLookasideList (または FsRtlDeleteExtraCreateParameterLookasideList) を呼び出して、ルックアサイド リストを解放します。
FltAllocateExtraCreateParameterFromLookasideList (または FsRtlAllocateExtraCreateParameterFromLookasideList) を呼び出して、ECP コンテキスト構造のルックアサイド リストからメモリ プールを割り当て、その構造体へのポインターを生成します。
ECP コンテキスト構造体のメモリを解放するには、 FltFreeExtraCreateParameter (または FsRtlFreeExtraCreateParameter) を呼び出します。