筛选器驱动程序的 BypassIO
关于 BypassIO
从 Windows 11 开始,BypassIO 已添加为用于从文件读取的优化 I/O 路径。 此路径的目标是减少执行读取的 CPU 开销,这有助于满足在 Windows 上加载和运行下一代游戏的 I/O 要求。 BypassIO 是支持 Windows 上的 DirectStorage 的基础结构的一部分。
重要的是,微筛选器实现对 BypassIO 的支持,并尽可能多地启用 BypassIO。 如果没有筛选器支持,游戏性能会下降,导致最终用户的游戏体验不佳。
在将来的 Windows 版本中,除了游戏之外,还有更广泛的应用程序用途。
BypassIO 是按句柄的概念。 请求 BypassIO 时,它用于显式文件句柄。 BypassIO 对该文件的其他句柄没有影响。
FSCTL_MANAGE_BYPASS_IO 和等效 IOCTL_STORAGE_MANAGE_BYPASS_IO 已添加为此基础结构的一部分。 微筛选器 处理FSCTL_MANAGE_BYPASS_IO,而 IOCTL_STORAGE_MANAGE_BYPASS_IO 由文件系统发送到卷/存储堆栈。 这些控制代码设计为可诊断:它们都返回对 BypassIO 请求失败的驱动程序的标识,以及否决该代码的原因。
本页提供跨文件系统筛选器和存储堆栈的体系结构详细信息,以及如何在微筛选器驱动程序中实现 BypassIO 的信息。 有关特定于 存储驱动程序的 BypassIO 信息,请参阅有关存储驱动程序的 BypassIO。
BypassIO 支持的范围
从 Windows 11 开始,支持 BypassIO,如下所示:
仅在 Windows 客户端系统上。 将来的版本中将添加服务器系统支持。
仅在 NVMe 存储设备上。 将来的版本中将添加对其他存储技术的支持。
仅在 NTFS 文件系统上。 将来的版本中将添加对其他文件系统的支持。
仅支持非缓存读取。 将来的版本中将添加对非缓存写入的支持。
仅支持文件 (目录或卷句柄) 不支持。
BypassIO 的工作原理
在已启用 BypassIO 的 FileHandle 上调用 NtReadFile 时,操作通常不会流经传统的 I/O 堆栈,后者会遍历整个文件系统堆栈、卷堆栈和存储堆栈。 相反,操作直接从 I/O 管理器流向 (NTFS) 文件系统,然后流向磁盘 (classpnp) 驱动程序,然后流向 StorNVMe 驱动程序。 使用完全已启用 BypassIO 的 FileHandle:
- 跳过所有文件系统筛选器。
- 跳过所有卷堆栈筛选器。
- 将跳过磁盘驱动程序上方以及磁盘与 StorNVMe 驱动程序之间的所有存储堆栈筛选器和驱动程序。
在文件系统筛选器堆栈支持 BypassIO 但卷和/或存储堆栈不支持的情况下,读取 IO 会绕过筛选器堆栈,但仍通过卷和/或存储堆栈发送。 此级别的支持称为部分 BypassIO。
BypassIO 的 DDI 更改和添加
添加了以下与筛选器驱动程序相关的 DDI 以提供 BypassIO 支持:
- FltVetoBypassIo 函数
- FS_BPIO_INFLAGS 枚举器
- FS_BPIO_INFO 结构
- FS_BPIO_INPUT 结构
- FS_BPIO_OPERATIONS 枚举器
- FS_BPIO_OUTFLAGS 枚举器
- FS_BPIO_OUTPUT 结构
- FS_BPIO_RESULTS 结构
- FSCTL_MANAGE_BYPASS_IO 控制代码
- FsRtlGetBypassIoOpenCount 函数
此外,以下 DDI 已更改为支持 BypassIO:
- BypassIoOpenCount 字段已添加到 FSRTL_ADVANCED_FCB_HEADER 结构中。 文件系统使用此字段来维护当前已启用 BypassIO 的流中唯一 FileObject 的计数。 添加此字段会增加结构大小。 从 Windows 11 开始要使用的结构版本FSRTL_FCB_HEADER_V4。
其他操作对已启用 BypassIO 的句柄的影响
在句柄上启用 BypassIO 不会影响其他句柄。 但是,启用 BypassIO 的句柄上的其他操作会影响 BypassIO 的使用,例如在以下方案中:
如果“处理 A”打开了启用 BypassIO 并正常运行的文件,并且有人 (,例如,另一个线程或进程) 打开句柄 B 以执行缓存的 IO 或内存映射 IO,则在句柄 A 上暂时挂起 BypassIO,直到句柄 B 关闭。 系统改用传统的 I/O 路径来保证不会发生过时的数据。 系统将继续在该句柄上使用传统 I/O 路径,直到所有数据部分和缓存映射被拆掉,因此筛选器必须关闭句柄的文件才能恢复 BypassIO。
如果已启用 BypassIO 的文件标记为稀疏,则所有 BypassIO 操作都将开始使用传统的 I/O 路径。
对已启用 BypassIO 的文件进行解除会导致所有 BypassIO 操作使用传统的 I/O 路径。 完成分解后,系统将切换回该句柄上的 BypassIO 路径。
在微筛选器中实现 BypassIO 支持
更新 INF 或清单文件
从 Windows 11 开始,筛选器开发人员应将SUPPORTED_FS_FEATURES_BYPASS_IO添加到驱动程序的 INF 或 MANIFEST 文件中的 SupportedFeatures。 (可以在提升的命令提示符中键入 fltmc instances
,查看所有活动 filters 的“SprtFtrs”值。)
注意
永远不能支持 BypassIO 的筛选器仍应将 SUPPORTED_FS_FEATURES_BYPASS_IO 添加到其 SupportedFeatures 状态,然后在筛选器内适当否决,并指定原因。
建议微筛选器尽可能减少对 BypassIO 的否决。
如果微筛选器附加到启用了 BypassIO 的卷,但该微筛选器尚未更新其 SupportedFeatures 设置以包含 SUPPORTED_FS_FEATURES_BYPASS_IO,则会立即阻止该卷上的所有 BypassIO 操作,回退到传统的 I/O 路径,导致游戏性能下降。
不筛选IRP_MJ_READ或IRP_MJ_WRITE的微筛选器会自动选择加入 BypassIO 支持,就像他们在 SupportedFeatures 中添加了SUPPORTED_FS_FEATURES_BYPASS_IO一样。
如果存在未选择加入的附加微筛选器,则堆栈上的 FS_BPIO_OP_ENABLE 和 FS_BPIO_OP_QUERY 操作会失败。
实现对 BypassIO 请求的支持
微筛选器应添加对 BypassIO 请求的支持,这些请求通过 FSCTL_MANAGE_BYPASS_IO 控制代码发送。 有关详细信息 ,请参阅支持 BypassIO 操作 。
确定 BypassIO 是否正常工作
添加了一个 fsutil 命令,用于发出指定FS_BPIO_OP_QUERY操作FSCTL_MANAGE_BYPASS_IO。 显示的结果标识了阻止 BypassIO 的第一个驱动程序及其原因。
> fsutil bypassIo state /v <path>
其中 <路径> 可以是卷、目录或特定文件名, 而 /v 是可选的详细标志。
在第一个示例中,假设 WOF 微筛选器尚未选择加入 BypassIO。 执行命令 fsutil bypassIo state c:\
会生成以下输出:
BypassIo on "c:\" is not currently supported.
Status: 506 (At least one minifilter does not support bypass IO)
Driver: wof.sys
Reason: The specified minifilter does not support bypass IO.
在此第二个示例中,在启用了 BitLocker 的系统上执行 fsutil bypassIO state /v c:\
会导致以下输出:
BypassIo on "c:\" is partially supported
Volume stack bypass is disabled (fvevol.sys)
Status: 495 (The specified operation is not supported while encryption is enabled on the target object)
Reason: BitLocker Drive Encryption is enabled.
Storage Type: NVMe
Storage Driver: BypassIo compatible
Driver Name: stornvme.sys
特定于 NTFS 的行为
可以在 NTFS 驻留文件上启用 BypassIO;但是,文件采用传统的 I/O 路径,只要它是驻留的。 如果对文件进行写入,使其不显示,则系统会切换为使用 BypassIO 路径。
无法在 BypassIO 活动文件上启用 NTFS 压缩。
可以在 BypassIO 活动文件上启用 NTFS 加密。 BypassIO 已暂停。
BypassIO 对卸载读/写操作没有影响。