CcPrepareMdlWrite 関数 (ntifs.h)

CcPrepareMdlWrite ルーチンは、呼び出し元がファイルにデータを書き込むことができるように、キャッシュされたファイル メモリに直接アクセスできるようにします。

構文

void CcPrepareMdlWrite(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

パラメーター

[in] FileObject

キャッシュされたファイルのファイル オブジェクトへのポインター。

[in] FileOffset

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

[in] Length

システム キャッシュに書き込まれるデータの長さ (バイト単位)。

[out] MdlChain

データの書き込み先ページを記述する 1 つ以上のメモリ記述子リスト (MDL) のチェーン。

[out] IoStatus

IO_STATUS_BLOCK構造体へのポインター。 CcPrepareMdlWrite の呼び出しが成功した場合、IoStatus.Status は STATUS_SUCCESS に設定されます。 それ以外の場合は、適切な NTSTATUS エラー コードに設定されます。 IoStatus.Information は、MDL チェーンで正常にロックダウンされた実際のバイト数に設定されます。

戻り値

なし

解説

CcPrepareMdlWriteCcCopyWrite に似ていますが、キャッシュされたファイルにデータがコピーされないことを除きます。 代わりに、システム キャッシュで上書きされる物理ページはメモリにロックされ、 CcPrepareMdlWrite は、指定されたバイト範囲を記述する 1 つ以上のメモリ記述子リスト (MDL) を返します。 CcMdlWriteComplete または CcMdlWriteAbort が呼び出されるまで、これらのページはメモリ内でロックされたままになります。 したがって、CcPrepareMdlWrite の各呼び出しの後に、CcMdlWriteComplete または CcMdlWriteAbort を呼び出す必要があります。

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

CcPrepareMdlWrite の呼び出しが失敗した場合でも、1 つ以上の MDL が割り当てられている可能性があることに注意してください。 呼び出し元は IoStatus.Information の値を調べて、これが発生したかどうかを判断できます。 ある場合、呼び出し元は CcMdlWriteComplete を呼び出して、割り当てられた MDL を解放する必要があります。

エラーが発生した場合、 CcPrepareMdlWrite は特定のエラーの状態例外を発生させます。 たとえば、プール割り当てエラーが発生した場合、 CcPrepareMdlWrite はSTATUS_INSUFFICIENT_RESOURCES例外を発生させます。I/O エラーが発生した場合、 CcPrepareMdlWrite は I/O エラーの状態例外を発生させます。 そのため、エラーが発生した場合に制御を取得するには、ドライバーは、try-except または try-finally ステートメントで CcPrepareMdlWrite への呼び出しをラップする必要があります。

ファイルをキャッシュするには、 CcInitializeCacheMap を使用します

要件

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

こちらもご覧ください

CcCopyWrite

CcInitializeCacheMap

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl

IoBuildPartialMdl

MmGetMdlByteCount

MmGetMdlByteOffset

MmGetMdlPfnArray

MmGetMdlVirtualAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

MmInitializeMdl

MmMapLockedPages

MmPrepareMdlForReuse

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages