FsRtlPrepareMdlWriteEx 函式 (ntifs.h)
FsRtlPrepareMdlWriteEx 例程會傳回記憶體描述元清單的連結清單(MDLs),指向指定的快取檔案數據範圍,以將數據直接寫入快取。 如果寫入的快取支持無法使用,例程會還原為以 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
在輸出中,指向快取數據內位元組範圍的記憶體描述元清單連結清單指標。
[out] IoStatus
輸出中 IO_STATUS_BLOCK 結構的指標,其中包含傳輸的狀態。 如果作業成功,IoStatus.Status 設定為 STATUS_SUCCESS。 否則,它會設定為適當的 NTSTATUS 錯誤碼。 IoStatus.Information 設定為例程成功鎖定的實際位元組數目。
傳回值
FsRtlPrepareMdlWriteEx 會傳回 STATUS_SUCCESS 或適當的 NTSTATUS 值,例如下列其中一項:
傳回碼 | 描述 |
---|---|
|
無法配置 IRP 型寫入的 IRP。 |
言論
如果文件系統可以使用快速 I/O,FsRtlPrepareMdlWriteEx 例程會略過一般的 IRP 寫入機制,並傳回呼叫端可用來將數據直接寫入檔案快取的記憶體描述元清單連結清單 (MDL)。 呼叫端將會覆寫的實體頁面不會將數據緩衝處理的數據複製到快取中,而是鎖定在記憶體中,而且可以直接寫入。 FsRtlPrepareMdlWriteEx 會傳回指向指定位元組範圍的一或多個記憶體描述元清單 (MDLs)。
如果未啟用快速 I/O,FsRtlPrepareMdlWriteEx 會產生同步 IRP 型 MDL 寫入準備,並傳回從要求配置的 MDL。
MDL 指向的頁面會鎖定在記憶體中,但不會在系統空間中對應。 呼叫者可以呼叫 MmGetSystemAddressForMdlSafe來執行此對應。
FsRtlPrepareMdlWriteEx 的每個呼叫都必須接著呼叫 CcMdlWriteComplete。
要求
要求 | 價值 |
---|---|
目標平臺 | 普遍 |
標頭 | ntifs.h (include Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |