次の方法で共有


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