Share via


FltLockUserBuffer 関数 (fltkernel.h)

FltLockUserBuffer ルーチンは、特定の I/O 操作のユーザー バッファーをロックします。

構文

NTSTATUS FLTAPI FltLockUserBuffer(
  [in] PFLT_CALLBACK_DATA CallbackData
);

パラメーター

[in] CallbackData

I/O 操作の FLT_CALLBACK_DATA コールバック データ構造へのポインター。

戻り値

FltLockUserBuffer は 、ユーザー バッファーを正常にロックした場合 (または FltLockUserBuffer の以前の呼び出しによってバッファーが既にロックされている場合) にSTATUS_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 は、コールバック データ パラメーター構造体 (FLT_PARAMETERS) の MdlAddress (または OutputMdlAddress) メンバーを、ロックされたページの MDL を指すように設定します。 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 によって割り当てられます。

コールバック データ パラメーター構造にユーザー バッファーが含まれている場合、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 ベースの操作に対して呼び出すことができます。

要件

要件
対象プラットフォーム ユニバーサル
Header fltkernel.h (Fltkernel.h を含む)
Library 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

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 用)

FltDecodeParameters

MmGetSystemAddressForMdlSafe

MmProbeAndLockPages

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK