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 チェーンで正常にロックダウンされた実際のバイト数に設定されます。
戻り値
なし
解説
CcPrepareMdlWrite は CcCopyWrite に似ていますが、キャッシュされたファイルにデータがコピーされないことを除きます。 代わりに、システム キャッシュで上書きされる物理ページはメモリにロックされ、 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 |