FltWriteFileEx 函数 (fltkernel.h)
FltWriteFileEx 用于将数据写入打开的文件、流或设备。 此函数扩展 FltWriteFile,以允许选择性地使用 MDL 来写入数据,而不是映射的缓冲区地址。
语法
NTSTATUS FLTAPI FltWriteFileEx(
[in] PFLT_INSTANCE InitiatingInstance,
[in] PFILE_OBJECT FileObject,
[in, optional] PLARGE_INTEGER ByteOffset,
[in] ULONG Length,
[in] PVOID Buffer,
[in] FLT_IO_OPERATION_FLAGS Flags,
[out, optional] PULONG BytesWritten,
[in, optional] PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine,
[in, optional] PVOID CallbackContext,
[in, optional] PULONG Key,
[in, optional] PMDL Mdl
);
参数
[in] InitiatingInstance
要将作发送到的微型筛选器驱动程序实例的不透明实例指针。 实例必须附加到文件所在的卷。 此参数是必需的,不能为 NULL。
[in] FileObject
指向要写入数据的文件的 FILE_OBJECT 的指针。 此文件对象当前必须处于打开状态。 当文件对象尚未打开或不再打开(例如,在预创建或清理后回调例程中),调用 FltWriteFileEx 会导致系统在已检查的生成中断言。 此参数是必需的,不能为 NULL。
[in, optional] ByteOffset
指向调用方分配的变量的指针,该变量指定要在其中开始读取作的文件中的起始字节偏移量。
如果指定了 ByteOffset,则无论文件对象的 CurrentByteOffset 字段的当前值如何,都会在该偏移量处执行 I/O。
- 如果文件已为同步 I/O 打开(FO_SYNCHRONOUS_IO是在文件对象的 标志 字段中设置的),则调用方可以设置 ByteOffset->LowPart 若要FILE_USE_FILE_POINTER_POSITION和 ByteOffset->HighPart,-1 在文件对象的 currentByteOffset 字段中执行 I/O。 如果未为同步 I/O 打开文件,则使用FILE_USE_FILE_POINTER_POSITION是错误的。
- 调用方可以将 ByteOffset->LowPart 设置为 FILE_WRITE_TO_END_OF_FILE,ByteOffset->HighPart 设置为 -1 以在文件末尾启动写入(即执行追加写入)。
如果未指定 ByteOffset:
- 如果未为同步 I/O 打开文件,则这是一个错误。
- 否则,I/O 在文件的 CurrentByteOffset执行。
如果为同步 I/O 打开文件对象,除非调用方传递FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET标志,否则 CurrentByteOffset 字段将更新。
- 注意:在这种情况下,文件系统仍会更新 currentByteOffset 。 筛选器管理器保存 CurrentByteOffset 值,然后再将 I/O 向下发送堆栈,并在 I/O 返回时还原它。 从 FltWriteFileEx(和较高海拔的筛选器)调用方的角度来看,CurrrentByteOffset 不会更新。 但是调用方下方的筛选器在其读/写后回调中看到更新的 CurrentByteOffset 值。
如果未为同步 I/O 打开文件对象,则无论 ByteOffset 参数的状态如何,CurrentByteOffset 字段不会更新。
如果 FileObject 指向的文件对象为异步 I/O 打开,则此参数是必需的,不能为 NULL。
FltWriteFileEx 不支持FILE_WRITE_TO_END_OF_FILE标志。
[in] Length
Buffer 参数指向的缓冲区的大小(以字节为单位)。 如果在 Mdl中提供了 MDL,则 长度 是 MDL 描述的数据的大小。
[in] Buffer
指向包含要写入文件的数据的缓冲区的指针。 如果为非缓存 I/O 打开文件,则必须根据基础存储设备的对齐要求对齐此缓冲区。 微型筛选器驱动程序可以通过调用 FltAllocatePoolAlignedWithTag来分配此类对齐的缓冲区。
如果在 Mdl中提供了 MDL,则 缓冲区 必须为 NULL。
[in] Flags
指定要执行的写入作类型的标志的位掩码。
旗 | 意义 |
---|---|
FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET | 微型筛选器驱动程序可以设置此标志以指定 FltWriteFileEx 不会更新文件对象的 CurrentByteOffset 字段。 |
FLTFL_IO_OPERATION_NON_CACHED | 微型筛选器驱动程序可以设置此标志以指定非缓存写入,即使文件对象未使用FILE_NO_INTERMEDIATE_BUFFERING打开也是如此。 |
FLTFL_IO_OPERATION_PAGING | 微型筛选器驱动程序可以设置此标志来指定分页写入。 |
FLTFL_IO_OPERATION_SYNCHRONOUS_PAGING | 微型筛选器驱动程序可以设置此标志来指定同步分页 I/O 写入。 设置此标志的微型筛选器驱动程序还必须设置FLTFL_IO_OPERATION_PAGING标志。 此标志从 Windows Vista 开始可用。 |
[out, optional] BytesWritten
指向调用方分配的变量的指针,该变量接收写入到文件的字节数。 如果 CallbackRoutine 不为 NULL,则忽略此参数。 否则,此参数是可选的,可以为 NULL。
[in, optional] CallbackRoutine
指向写入作完成后要调用的 PFLT_COMPLETED_ASYNC_IO_CALLBACK类型回调例程的指针。 此参数是可选的,可以是 NULL。
[in, optional] CallbackContext
CallbackRoutine(如果存在)中传递给例程的上下文指针。 此参数是可选的,可以是 NULL。 如果 CallbackRoutine 为 NULL,则忽略此参数。
[in, optional] Key
与文件对象锁关联的可选键。
[in, optional] Mdl
描述要写入的数据的可选 MDL。 如果在 缓冲区中提供了缓冲区,则 Mdl 必须为 NULL。
返回值
FltWriteFileEx 返回文件系统返回的 NTSTATUS 值。
言论
微型筛选器驱动程序调用 FltWriteFileEx 将数据写入打开的文件。
FltWriteFileEx 会导致写入请求发送到附加到启动实例和文件系统下方的微型筛选器驱动程序实例。 上面附加的指定实例和实例不会收到写入请求。
FltWriteFileEx 如果以下任一项为 true,则执行非缓存 I/O:
调用方在 标志 参数中设置FLTFL_IO_OPERATION_NON_CACHED标志。
文件对象已为非缓存 I/O 打开。 通常,通过在上述调用中指定 FILE_NO_INTERMEDIATE_BUFFERING****CreateOptions 标志来执行此作,FltCreateFile、FltCreateFileEx或 ZwCreateFile。
非缓存 I/O 对传递给 FltWriteFileEx 的参数值施加以下限制:
Buffer 参数指向的缓冲区必须符合基础存储设备的对齐要求。 若要分配此类对齐的缓冲区,请调用 FltAllocatePoolAlignedWithTag。
ByteOffset 参数指向的字节偏移量必须是卷扇区大小的非负倍数。
Length 参数中指定的长度必须是卷扇区大小的非负倍数。
如果 CallbackRoutine 参数的值不为 NULL,则异步执行写入作。
如果 CallbackRoutine 参数的值为 NULL,则将同步执行写入作。 也就是说,FltWriteFileEx 在返回前等待写入作完成。 即使 FileObject 指向的文件对象已为异步 I/O 打开,也是如此。
如果多个线程针对同一文件对象调用 FltWriteFileEx,并且文件对象已为同步 I/O 打开,则筛选器管理器不会尝试对文件序列化 I/O。 在这方面,FltWriteFileEx 不同于 ZwWriteFile。
Mdl 参数在微筛选器已有 MDL 可用时提供为方便。 直接使用 MDL,可以避免为 缓冲区 映射地址的其他步骤。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 8 |
目标平台 | 普遍 |
标头 | fltkernel.h (包括 Fltkernel.h) |
库 | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | PASSIVE_LEVEL |