次の方法で共有


FsRtlMdlReadEx 関数 (ntifs.h)

FsRtlMdlReadEx ルーチンは、高速キャッシュ MDL 読み取りを実行します。 要求されたデータがキャッシュされていない場合、ルーチンは IRP ベースの MDL 読み取り操作に戻ります。

構文

NTSTATUS FsRtlMdlReadEx(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  ULONG            LockKey,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

パラメーター

[in] FileObject

ファイル オブジェクトへのポインター。

[in] FileOffset

データを保持するキャッシュ ファイル内の開始バイト オフセットを指定する変数へのポインター。

[in] Length

キャッシュから読み取るデータの長さ (バイト単位)。

[in] LockKey

ロックするバイト範囲に関連付けられている値。 ロックする範囲が、既に非決定的ロックでロックされている別の範囲と重複している場合、または読み取る範囲が、既に非決定的にロックされている別の範囲のサブ範囲である場合、このパラメーターの値は、その非決定的ロックのキーである必要があります。ロックは、呼び出し元スレッドの親プロセスによって保持されている必要があります。 それ以外の場合、このパラメーターは無効です。

[out] MdlChain

メモリ記述子リスト (MDL) のリンクされたリストへのポインターを受け取る変数のアドレス。 FsRtlMdlReadExへの呼び出しの前に、MdlChain を初期化して NULL する必要があります。

[out] IoStatus

出力時に転送の状態を格納する IO_STATUS_BLOCK 構造体へのポインター。 操作が成功した場合、IoStatus.Status は STATUS_SUCCESS に設定されます。 それ以外の場合は、適切な NTSTATUS エラー コードに設定されます。 IoStatus.Information は、ルーチンが正常にロックした実際のバイト数に設定されます。

戻り値

FsRtlMdlReadEx は、次のいずれかの STATUS_SUCCESS または適切な NTSTATUS 値を返します。

リターン コード 形容
STATUS_INSUFFICIENT_RESOURCES IRP ベースの読み取りの IRP を割り当てませんでした。

備考

ファイル システムから高速 I/O が使用可能な場合、FsRtlMdlReadEx ルーチンは通常の IRP 読み取りメカニズムをバイパスし、呼び出し元がキャッシュされたファイル データに直接アクセスするために使用できるメモリ記述子リスト (MDL) のリンクされたリストを返します。 この操作はデータをコピーまたはバッファーしないため、通常の読み取りよりもはるかに高速です。 高速 I/O が有効になっていない場合、FsRtlMdlReadEx は同期 IRP ベースの MDL 読み取りを生成し、要求から MDL を返します。

MDL によって記述されたページはメモリ内でロックされますが、システム空間にはマップされません。 呼び出し元は、mmGetSystemAddressForMdlSafe呼び出すことによって、このマッピングを実行できます。

CcMdlReadと同様に、FsRtlMdlReadEx ルーチンは、キャッシュされたファイル データを含むページをロックして、システムがこれらのページをページ ファイルにスワップしないようにします。 呼び出し元が ccMdlReadComplete ルーチン 呼び出すまで、ページはメモリ内でロックされたままです。

必要条件

要件 価値
サポートされる最小クライアント Windows 8
ターゲット プラットフォーム の 万国
ヘッダー ntifs.h (Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

関連項目

ccMdlRead を する

ccMdlReadComplete を する

IO_STATUS_BLOCK

MmGetSystemAddressForMdlSafe