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结构。

    在大多数文件系统中,这是通过将FSRTL_COMMON_FCB_HEADER结构包含在文件控制块中, (FCB) 或类似结构来实现的,该结构用于维护打开的文件的状态。

    FSRTL_COMMON_FCB_HEADER 结构的存储通常从分页池中分配。

  2. 对于可能对其执行快速 I/O 的每个文件,文件系统必须将文件的任何文件对象链接到FSRTL_COMMON_FCB_HEADER结构。 为此,将每个文件对象的 FsContext 成员设置为指向此结构 (或指向 FCB 或包含 FSRTL_COMMON_FCB_HEADER 结构的其他结构) 。

  3. 缓存文件时,文件系统必须将文件的 FSRTL_COMMON_FCB_HEADER 结构的 IsFastIoPossible 成员设置为适当的值。 只要文件保持缓存状态,就应根据需要更新此值。

    具体而言,一旦缓存文件上存在任何独占字节范围锁定,文件系统应立即将 FSRTL_COMMON_FCB_HEADER 结构的 IsFastIoPossible 成员设置为 FastIoIsQuestionable

如果 Wait 为 TRUE,则保证 FsRtlCopyWrite 复制数据并返回 TRUE。 如果缓存文件的所需页已驻留在内存中,则会立即复制数据,并且不会发生阻塞。 如果任何所需的页面不是驻留页,调用方将进入等待状态,直到所有必需的页面都已驻留,并且可以复制数据。

如果 Wait 为 FALSE,则 FsRtlCopyWrite 将拒绝阻止,如果无法获取文件的main资源,或者缓存文件的所需页尚未驻留在内存中,FsRtlCopyWrite 将拒绝阻止并返回 FALSE。

文件系统的 FastIoCheckIfPossible 例程负责确保 FileOffsetLength 定义的字节范围不包括调用方未传递相应 LockKey 值的任何独占锁定的字节范围。 如果文件系统使用 FsRtlXxxLockYyy 支持例程来管理字节范围锁,则可以在调用 FsRtlCopyRead 之前通过从 FastIoCheckIfPossible 例程调用 FsRtlFastCheckLockForWrite 来完成此操作。

若要缓存文件,请使用 CcInitializeCacheMap 例程。

要求

要求
目标平台 通用
标头 ntifs.h (包括 Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) PowerIrpDDis (wdm)

另请参阅

CcInitializeCacheMap

FsRtlCopyRead

FsRtlFastCheckLockForWrite