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