FsRtlCopyWrite 函式 (ntifs.h)
FsRtlCopyWrite 例程會將數據從用戶緩衝區複製到快取的檔案。
語法
BOOLEAN FsRtlCopyWrite(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[in] BOOLEAN Wait,
[in] ULONG LockKey,
[in] PVOID Buffer,
[out] PIO_STATUS_BLOCK IoStatus,
[in] PDEVICE_OBJECT DeviceObject
);
參數
[in] FileObject
要寫入數據之快取檔案之檔案物件的指標。
[in] FileOffset
變數的指標,指定快取檔案內的起始位元組位移。
[in] Length
要寫入之數據的位元組長度。
[in] Wait
如果呼叫端可以放入等候狀態,請設定為 TRUE,直到複製所有數據為止,否則為 FALSE。
[in] LockKey
值,與要鎖定的位元組範圍相關聯。 如果鎖定的範圍重疊另一個已鎖定且具有非例外鎖定的範圍,或要讀取的範圍是另一個範圍子範圍,且尚未鎖定,此參數中的值必須是該非例外鎖定的索引鍵。鎖定必須由呼叫線程的父進程保留。 否則,此參數不會有任何作用。
[in] Buffer
要從中複製數據的緩衝區指標。
[out] IoStatus
呼叫端配置的結構的指標,可接收最終完成狀態和作業的相關信息。 如果成功複製數據,IoStatus.Status 包含STATUS_SUCCESS。 如果並非所有的數據都成功複製,IoStatus.Information 包含實際複製的位元組數目。
[in] DeviceObject
裝載磁碟區之裝置物件的指標,該磁碟區會保存檔案數據。
傳回值
如果複製要求已完成,FsRtlCopyWrite 會傳回 TRUE,否則為 FALSE。 請注意,TRUE 的傳回值不一定表示複製作業成功。
如果 FsRtlCopyWrite 傳回 FALSE,或如果 IoStatus 的內容 表示複製作業失敗,呼叫端必須配置寫入 IRP,而不是呼叫 FsRtlCopyWrite。
言論
支援檔案快取的文件系統開發人員應該考慮使用 FsRtlCopyWrite 做為文件系統處理快速 I/O 寫入要求的進入點,而不是實作檔系統特定的快速 I/O 寫入例程。 這需要文件系統的 DriverEntry 例程在文件系統驅動程式物件的FAST_IO_DISPATCH結構中,將 FastIoWrite 進入點設定為 FsRtlCopyWrite。 此外,檔案系統必須執行下列動作:
針對可能執行快速 I/O 的每個檔案,檔案系統必須配置和初始化FSRTL_COMMON_FCB_HEADER結構。
在大部分的文件系統中,這是藉由在檔案控制區塊 (FCB) 或用來維護開啟檔案狀態的可比較結構中包含FSRTL_COMMON_FCB_HEADER結構來完成。
FSRTL_COMMON_FCB_HEADER結構的記憶體通常會從分頁集區配置。
對於執行快速 I/O 的每個檔案,檔案系統必須將檔案的任何檔案對象連結至FSRTL_COMMON_FCB_HEADER結構。 這是藉由將每個檔案物件的 FsContext 成員設定為指向這個結構,或設定為 FCB 或其他包含FSRTL_COMMON_FCB_HEADER結構的結構來完成。
快取檔案時,文件系統必須將檔案FSRTL_COMMON_FCB_HEADER結構的 IsFastIoPossible 成員設定為適當的值。 只要檔案保持快取狀態,就應該視需要更新此值。
特別是文件系統應該將 IsFastIoPossible 成員FSRTL_COMMON_FCB_HEADER結構的成員設定為 FastIoIsQuestionable,只要快取檔案上有任何獨佔位元組範圍鎖定。
如果 Wait 為 TRUE,FsRtlCopyWrite 保證會複製數據並傳回 TRUE。 如果快取檔案的必要頁面已存在於記憶體中,則會立即複製數據,而且不會發生封鎖。 如果任何需要的頁面都不是常駐頁面,則呼叫端會進入等候狀態,直到所有必要頁面都已進入常駐狀態,而且可以複製數據。
如果 Wait 為 FALSE,FsRtlCopyWrite 會拒絕封鎖,如果無法取得檔案的主要資源,或快取檔案的必要頁面尚未存在於記憶體中,則會傳回 FALSE。
文件系統
若要快取檔案,請使用 CcInitializeCacheMap 例程。
要求
要求 | 價值 |
---|---|
目標平臺 | 普遍 |
標頭 | ntifs.h (include Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIs(storport),PowerIrpDDis(wdm) |