筛选器驱动程序的 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。

显示读取请求的传统 I O 路径的图像。

显示读取请求的绕过 I O 路径的图像。

BypassIO 的 DDI 更改和添加

添加了以下与筛选器驱动程序相关的 DDI 以提供 BypassIO 支持:

此外,以下 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_ENABLEFS_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 对卸载读/写操作没有影响。