FltLockUserBuffer 関数 (fltkernel.h)
FltLockUserBuffer ルーチンは、特定の I/O 操作のユーザー バッファーをロックします。
構文
NTSTATUS FLTAPI FltLockUserBuffer(
[in] PFLT_CALLBACK_DATA CallbackData
);
パラメーター
[in] CallbackData
I/O 操作の FLT_CALLBACK_DATA コールバック データ構造体へのポインター。
戻り値
FltLockUserBuffer は、ユーザー バッファーを正常にロックした場合 (または、以前の呼び出しによってバッファーが既にロックされている場合は、FltLockUserBufferSTATUS_SUCCESSを返します。それ以外の場合は、次のいずれかの適切な NTSTATUS 値を返します。
リターン コード |
形容 |
STATUS_INSUFFICIENT_RESOURCES |
FltLockUserBuffer プール割り当てエラーが発生しました。 これはエラー コードです。 |
STATUS_INVALID_PARAMETER |
無効なパラメーターが見つかりました。 たとえば、I/O 操作に MDL パラメーターがない、IRP_MJ_READまたは IRP_MJ_WRITE I/O 操作にIRP_MN_MDLのマイナー コードがあります。 これはエラー コードです。 |
最適なパフォーマンスを得るためのフィルター ドライバーは、絶対に必要でない限り、fltLockUserBuffer 呼び出さないでください。 パフォーマンスの低下は、FltLockUserBuffer 自体 理由ではなく、mmGetSystemAddressForMdlSafe への後続の呼び出しによって発生するパフォーマンスの低下のためです。詳細については、後の「解説」を参照してください。
ミニフィルター ドライバーは、FltLockUserBuffer 呼び出して、次のいずれかの I/O 操作に対してユーザー バッファーをロックできます。
- IRP_MJ_DEVICE_CONTROL
- IRP_MJ_DIRECTORY_CONTROL
- IRP_MJ_FILE_SYSTEM_CONTROL
- IRP_MJ_INTERNAL_DEVICE_CONTROL
- IRP_MJ_QUERY_EA
- IRP_MJ_QUERY_QUOTA
- IRP_MJ_QUERY_SECURITY
- IRP_MJ_READ (IRP_MN_MDLを除く)
- IRP_MJ_SET_EA
- IRP_MJ_SET_QUOTA
- IRP_MJ_WRITE (IRP_MN_MDLを除く)
FltLockUserBuffer は、I/O 操作の種類に基づいて、ロックされたバッファーに適用する適切なアクセス方法 (IoReadAccess、IoWriteAccess、または IoModifyAccess) を決定します。
FltLockUserBuffer 、ロックされたページの MDL を指すように、コールバック データ パラメーター構造体 (FLT_PARAMETERS) 内の MdlAddress (または outputMdlAddress) メンバーを設定します。 MDL がない場合は、FltLockUserBuffer 割り当てます。 (FltMgr は、ファイル システムが行う前に MDL を生成できないことに注意してください。そのため、FltLockUserBuffer は、IRP_MJ_READまたは IRP_MN_MDL でIRP_MJ_WRITEのSTATUS_INVALID_PARAMETERを返します)。
コールバック データ パラメーター構造体にシステム バッファー (Irp-AssociatedIrp.SystemBuffer) が含まれており、ユーザー バッファー (Irp-UserBuffer) が含まれていない場合、FltLockUserBuffer はシステム バッファーをロック 。 システム バッファーの MDL がない場合は、FltLockUserBuffer 1 つを割り当てます。
コールバック データ パラメーター構造体にユーザー バッファーが含まれている場合は、FltLockUserBufferプローブを し、ユーザー バッファー ロックします。
呼び出し元は、任意のプロセス コンテキストで実行できます。 FltLockUserBuffer 、適切なプロセス コンテキストでバッファーを自動的にロックします。
FltLockUserBuffer が操作前コールバック ルーチン (PFLT_PRE_OPERATION_CALLBACK) から呼び出され、MDL を割り当てる場合 、FltLockUserBuffer はコールバック データ構造 (FLT_CALLBACK_DATA) にFLTFL_CALLBACK_DATA_DIRTY フラグを設定して、I/O 操作が完了したときに I/O システムが MDL を解放するようにします。
システム ページ テーブル エントリ (PTEs) を節約するために、FltLockUserBuffer ロックされたページはマップされません。 FltLockUserBuffer呼び出した後、呼び出し元は mmGetSystemAddressForMdlSafeを呼び出し、コールバック データ パラメーター構造体の MdlAddress (または OutputMdlAddress) メンバーを Mdl パラメーターの値として渡して、このメモリを表すシステム バッファーを取得する必要があります。
コールバック データ構造が解放されると、ロックされたバッファーは自動的にロック解除され、MDL は解放されます。 呼び出し元は MDL を解放しないでください。I/O システムはこれを自動的に実行します。
FltLockUserBuffer 、高速 I/O および IRP ベースの操作のために呼び出すことができます。
必要条件
要件 |
価値 |
ターゲット プラットフォーム の |
万国 |
ヘッダー |
fltkernel.h (Fltkernel.h を含む) |
ライブラリ |
FltMgr.lib |
DLL |
Fltmgr.sys |
IRQL |
<= APC_LEVEL |
関連項目
FLT_CALLBACK_DATA
FLT_IS_FASTIO_OPERATION
FLT_IS_IRP_OPERATION
FLT_IS_SYSTEM_BUFFER
FLT_PARAMETERS
IRP_MJ_DEVICE_CONTROLとIRP_MJ_INTERNAL_DEVICE_CONTROLの FLT_PARAMETERS
IRP_MJ_DIRECTORY_CONTROLの FLT_PARAMETERS
IRP_MJ_FILE_SYSTEM_CONTROLの FLT_PARAMETERS
IRP_MJ_QUERY_EAの FLT_PARAMETERS
IRP_MJ_QUERY_QUOTAの FLT_PARAMETERS
IRP_MJ_QUERY_SECURITYの FLT_PARAMETERS
IRP_MJ_READの FLT_PARAMETERS
IRP_MJ_SET_EAの FLT_PARAMETERS
IRP_MJ_SET_QUOTAの FLT_PARAMETERS
IRP_MJ_WRITEの FLT_PARAMETERS
FltDecodeParameters の
MmGetSystemAddressForMdlSafe
MmProbeAndLockPages
PFLT_POST_OPERATION_CALLBACK
PFLT_PRE_OPERATION_CALLBACK