共用方式為


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。 此外,檔案系統必須執行下列動作:

  1. 針對可能執行快速 I/O 的每個檔案,檔案系統必須配置和初始化FSRTL_COMMON_FCB_HEADER結構。

    在大部分的文件系統中,這是藉由在檔案控制區塊 (FCB) 或用來維護開啟檔案狀態的可比較結構中包含FSRTL_COMMON_FCB_HEADER結構來完成。

    FSRTL_COMMON_FCB_HEADER結構的記憶體通常會從分頁集區配置。

  2. 對於執行快速 I/O 的每個檔案,檔案系統必須將檔案的任何檔案對象連結至FSRTL_COMMON_FCB_HEADER結構。 這是藉由將每個檔案物件的 FsContext 成員設定為指向這個結構,或設定為 FCB 或其他包含FSRTL_COMMON_FCB_HEADER結構的結構來完成。

  3. 快取檔案時,文件系統必須將檔案FSRTL_COMMON_FCB_HEADER結構的 IsFastIoPossible 成員設定為適當的值。 只要檔案保持快取狀態,就應該視需要更新此值。

    特別是文件系統應該將 IsFastIoPossible 成員FSRTL_COMMON_FCB_HEADER結構的成員設定為 FastIoIsQuestionable,只要快取檔案上有任何獨佔位元組範圍鎖定。

如果 Wait 為 TRUE,FsRtlCopyWrite 保證會複製數據並傳回 TRUE。 如果快取檔案的必要頁面已存在於記憶體中,則會立即複製數據,而且不會發生封鎖。 如果任何需要的頁面都不是常駐頁面,則呼叫端會進入等候狀態,直到所有必要頁面都已進入常駐狀態,而且可以複製數據。

如果 Wait 為 FALSE,FsRtlCopyWrite 會拒絕封鎖,如果無法取得檔案的主要資源,或快取檔案的必要頁面尚未存在於記憶體中,則會傳回 FALSE。

文件系統 FastIoCheckIfPossible 例程負責確保 fileOffset 定義的位元組範圍,Length 不包含呼叫端未傳遞適當 LockKey 值的任何獨佔鎖定位元組範圍。 如果文件系統使用 FsRtlXxxLockYyy 支援例程來管理位元組範圍鎖定,則可以呼叫 FsRtlFast CheckLockForWrite ,再呼叫 FsRtlCopyRead

若要快取檔案,請使用 CcInitializeCacheMap 例程。

要求

要求 價值
目標平臺 普遍
標頭 ntifs.h (include Ntifs.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIs(storport)PowerIrpDDis(wdm)

另請參閱

CcInitializeCacheMap

FsRtlCopyRead

FsRtlFastCheckLockForWrite