FsRtlPrepareMdlWriteDev 函式 (ntifs.h)

FsRtlPrepareMdlWriteDev 例程會傳回記憶體描述元清單的連結清單, (MDLs) 指向指定的快取檔案數據範圍,以將數據直接寫入快取。

語法

BOOLEAN FsRtlPrepareMdlWriteDev(
  [in]             PFILE_OBJECT     FileObject,
  [in]             PLARGE_INTEGER   FileOffset,
  [in]             ULONG            Length,
  [in]             ULONG            LockKey,
  [out]            PMDL             *MdlChain,
  [out]            PIO_STATUS_BLOCK IoStatus,
  [ in, optional ] PDEVICE_OBJECT   DeviceObject
);

參數

[in] FileObject

檔案物件的指標。

[in] FileOffset

值的指標,指定保留數據的快取內的起始位元組位移。

[in] Length

要從快取讀取之數據的位元組長度。

[in] LockKey

值,與要鎖定的位元組範圍相關聯。 如果鎖定的範圍重疊另一個已經鎖定為非例外鎖定的範圍,或要讀取的範圍是另一個已經以獨佔方式鎖定之範圍的子範圍,則此參數中的值必須是該非例外鎖定的索引鍵。 鎖定必須由呼叫線程的父進程保留。 否則,此參數不會有任何作用。

[out] MdlChain

輸出時,記憶體描述項連結清單的指標會 (MDL) 指向快取數據內的位元組範圍。

[out] IoStatus

輸出上IO_STATUS_BLOCK結構的指標,其中包含傳輸的狀態。 如果作業成功, IoStatus.Status 會設定為 STATUS_SUCCESS。 否則,它會設定為適當的NTSTATUS錯誤碼。 IoStatus.Information 會設定為例程成功鎖定的實際位元組數目。

[ in, optional ] DeviceObject

開啟檔案之裝置物件的指標。

傳回值

如果作業成功, FsRtlPrepareMdlWriteDev 例程會傳回 TRUE ,如果作業失敗則傳回 FALSE

備註

FsRtlPrepareMdlWriteDev 類似於 FsRtlCopyWrite,但 FsRtlPrepareMdlWriteDev 不會將數據複製到快取。 相反地,呼叫端將覆寫的實體頁面會鎖定在記憶體中, 而 FsRtlPrepareMdlWriteDev 會傳回一或多個記憶體描述元清單 (MDL) 指向指定位元組範圍。 鎖定的頁面會保持鎖定,直到呼叫端呼叫 FsRtlMdlWriteCompleteDev 為止。

MDL 指向的頁面會鎖定在記憶體中,但不會對應到系統空間。 呼叫端可以呼叫 MmGetSystemAddressForMdlSafe 來執行此對應。

即使 FsRtlPrepareMdlWriteDev 的呼叫失敗,可能已配置一或多個 MDL。 呼叫端可以檢查 IoStatus.Information 的值,以判斷是否已發生此問題。 如果有,呼叫端必須呼叫 FsRtlMdlWriteCompleteDev 以釋放配置的 MDL。

規格需求

需求
目標平台 Universal
標頭 ntifs.h (包含 Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <= APC_LEVEL

另請參閱

FsRtlMdlWriteCompleteDev

FsRtlCopyWrite

MmGetSystemAddressForMdlSafe