次の方法で共有


FsRtlPrepareMdlWriteEx 関数 (ntifs.h)

FsRtlPrepareMdlWriteEx ルーチンは、キャッシュされたファイル データの指定範囲を指すメモリ記述子リスト (MDL) のリンクされたリストを返して、キャッシュにデータを直接書き込みます。 書き込みのキャッシュ サポートが利用できない場合、ルーチンは IRP ベースの MDL 書き込み操作に戻ります。

構文

NTSTATUS FsRtlPrepareMdlWriteEx(
  [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) のリンクされたリストへのポインター。

[out] IoStatus

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

戻り値

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

リターン コード 説明
STATUS_INSUFFICIENT_RESOURCES
IRP ベースの書き込み用の IRP を割り当てませんでした。

注釈

ファイル システムで高速 I/O を使用できる場合、 FsRtlPrepareMdlWriteEx ルーチンは通常の IRP 書き込みメカニズムをバイパスし、呼び出し元がファイル キャッシュにデータを直接書き込むのに使用できるメモリ記述子リスト (MDL) のリンクされたリストを返します。 バッファーに格納されたデータをキャッシュにコピーする代わりに、呼び出し元が上書きする物理ページはメモリ内でロックされ、直接書き込むことができます。 FsRtlPrepareMdlWriteEx は、指定されたバイト範囲を指す 1 つ以上のメモリ記述子リスト (MDL) を返します。

高速 I/O が有効になっていない場合、 FsRtlPrepareMdlWriteEx は同期 IRP ベースの MDL 書き込み準備を生成し、要求から割り当てられた MDL を返します。

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

FsRtlPrepareMdlWriteEx の各呼び出しの後に CcMdlWriteComplete の呼び出しが続く必要があります。

要件

要件
対象プラットフォーム ユニバーサル
Header ntifs.h (Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL PASSIVE_LEVEL

こちらもご覧ください

CcMdlWriteComplete

CcPrepareMdlWrite

MmGetSystemAddressForMdlSafe