BypassIO para controladores de filtro

Acerca de BypassIO

A partir de Windows 11, BypassIO se agregó como una ruta de acceso de E/S optimizada para leer archivos. El objetivo de esta ruta de acceso es reducir la sobrecarga de CPU de realizar lecturas, lo que ayuda a satisfacer las demandas de E/S de carga y ejecución de juegos de próxima generación en Windows. BypassIO forma parte de la infraestructura para admitir DirectStorage en Windows.

Es importante que los minifiltros implementen compatibilidad con BypassIO y que mantenga BypassIO habilitado tanto como sea posible. Sin compatibilidad con filtros, el rendimiento del juego se degrada, lo que da lugar a una mala experiencia de juego para los usuarios finales.

Habrá usos más amplios de la aplicación más allá de los juegos en futuras versiones de Windows.

BypassIO es un concepto por controlador. Cuando se solicita BypassIO, es para un identificador de archivo explícito. BypassIO no afecta a otros identificadores de ese archivo.

FSCTL_MANAGE_BYPASS_IO y un IOCTL_STORAGE_MANAGE_BYPASS_IO equivalente se agregaron como parte de esta infraestructura. Los minifiltros procesan FSCTL_MANAGE_BYPASS_IO, mientras que los sistemas de archivos envían IOCTL_STORAGE_MANAGE_BYPASS_IO a las pilas de volumen o almacenamiento. Estos códigos de control están diseñados para ser diagnosticables: ambos devuelven la identidad del controlador que produjo un error en la solicitud BypassIO y el motivo de la vetación.

En esta página se proporcionan detalles de la arquitectura en los filtros del sistema de archivos y las pilas de almacenamiento, así como información sobre cómo implementar BypassIO en un controlador de minifiltro. Consulte BypassIO para controladores de almacenamiento para obtener información de BypassIO específica de los controladores de almacenamiento.

Ámbito de compatibilidad con BypassIO

A partir de Windows 11, BypassIO se admite de la siguiente manera:

  • Solo en los sistemas cliente de Windows. La compatibilidad con el sistema de servidor se agregará en una versión futura.

  • Solo en dispositivos de almacenamiento NVMe. La compatibilidad con otras tecnologías de almacenamiento se agregará en una versión futura.

  • Solo en el sistema de archivos NTFS. La compatibilidad con otros sistemas de archivos se agregará en una versión futura.

  • Solo se admiten las lecturas no almacenadas en caché. La compatibilidad con escrituras no almacenadas en caché se agregará en una versión futura.

  • Solo se admite en archivos (no se admiten en identificadores de directorio o volumen).

Funcionamiento de BypassIO

Cuando se llama a NtReadFile en un FileHandle habilitado para BypassIO, la operación normalmente no fluye a través de la pila de E/S tradicional, que atraviesa toda la pila del sistema de archivos, la pila de volúmenes y la pila de almacenamiento. En su lugar, la operación fluye directamente desde el administrador de E/S al sistema de archivos (NTFS), luego al controlador de disco (classpnp) y, a continuación, al controlador StorNVMe. Con un FileHandle totalmente habilitado para BypassIO:

  • Se omiten todos los filtros del sistema de archivos.
  • Se omiten todos los filtros de pila de volúmenes.
  • Se omiten todos los filtros y controladores de la pila de almacenamiento por encima del controlador de disco, y entre los controladores de Disco y StorNVMe.

En escenarios en los que la pila de filtros del sistema de archivos admite BypassIO, pero el volumen o la pila de almacenamiento no lo hacen, las E/S de lectura omiten la pila de filtros, pero todavía se envían a través del volumen o la pila de almacenamiento. Este nivel de compatibilidad se conoce como BypassIO parcial.

Imagen que muestra la ruta de acceso de E/S tradicional para una solicitud de lectura.

Imagen que muestra la ruta de acceso de omisión de E/S para una solicitud de lectura.

Cambios y adiciones de DDIs para BypassIO

Se agregaron los siguientes DDIs relevantes para filtrar controladores para proporcionar compatibilidad con BypassIO:

Además, se cambiaron las siguientes DDIs para admitir BypassIO:

  • Se agregó un campo BypassIoOpenCount a la estructura FSRTL_ADVANCED_FCB_HEADER . El sistema de archivos usa este campo para mantener un recuento de fileObjects únicos en una secuencia que actualmente tiene BypassIO habilitado. La adición de este campo aumenta el tamaño de la estructura. La versión de estructura que se va a usar a partir de Windows 11 es FSRTL_FCB_HEADER_V4.

Impacto de otras operaciones en identificadores habilitados para BypassIO

La habilitación de BypassIO en un identificador no afecta a otros identificadores. Sin embargo, otras operaciones en un identificador habilitado para BypassIO afectan al uso de BypassIO, como en los escenarios siguientes:

  • Si tiene Handle A open to a file on which BypassIO is enabled and function, and alguien (por ejemplo, another thread or process) opens Handle B to perform cached or memory mapped IO, then BypassIO is temporarily suspended on Handle A until Handle B is closed. En su lugar, el sistema usa la ruta de acceso de E/S tradicional para garantizar que no se produzcan datos obsoletos. El sistema sigue usando la ruta de acceso de E/S tradicional en ese identificador hasta que se descompongan todas las secciones de datos y los mapas de caché, por lo que los filtros deben cerrar el archivo del identificador para que BypassIO se reanude.

  • Si un archivo habilitado para BypassIO está marcado como disperso, todas las operaciones bypassIO comienzan a usar la ruta de acceso de E/S tradicional.

  • La defraing de un archivo habilitado para BypassIO hace que todas las operaciones bypassIO usen la ruta de acceso de E/S tradicional. Una vez completada la defragging, el sistema vuelve a la ruta de acceso BypassIO en ese identificador.

Implementación de la compatibilidad con BypassIO en minifiltros

Actualizar los archivos INF o MANIFEST

A partir de Windows 11, los desarrolladores de filtros deben agregar SUPPORTED_FS_FEATURES_BYPASS_IO a SupportedFeatures en los archivos INF o MANIFEST del controlador. (Puede escribir fltmc instances un símbolo del sistema con privilegios elevados para ver los valores de "SprtFtrs" para todos los filtros activos).

Nota

Un filtro que nunca puede admitir BypassIO todavía debe agregar SUPPORTED_FS_FEATURES_BYPASS_IO a su estado SupportedFeatures y, a continuación, vetar adecuadamente dentro del filtro, especificando el motivo.

Se recomienda que minifiltros minifiltros ministendido lo más posible.

Si un minifiltro se asocia a un volumen en el que se habilita BypassIO, pero ese minifiltro no ha actualizado su configuración SupportedFeatures para incluir SUPPORTED_FS_FEATURES_BYPASS_IO, todas las operaciones BypassIO en ese volumen se bloquean inmediatamente, volviendo a la ruta de acceso de E/S tradicional, lo que da lugar a un rendimiento degradado del juego.

Los minifiltros que no filtran IRP_MJ_READ o IRP_MJ_WRITE se opten automáticamente por la compatibilidad con BypassIO, como si hubieran agregado SUPPORTED_FS_FEATURES_BYPASS_IO en SupportedFeatures.

Las operaciones FS_BPIO_OP_ENABLE y FS_BPIO_OP_QUERY producen un error en una pila si hay un minifiltro adjunto que no ha optado por participar.

Implementación de compatibilidad con solicitudes BypassIO

Los minifiltros deben agregar compatibilidad con las solicitudes BypassIO, que se envían a través del código de control FSCTL_MANAGE_BYPASS_IO . Consulte Compatibilidad con operaciones bypassIO para obtener más información.

Determinar si BypassIO funciona

Se ha agregado un comando fsutil que emite un FSCTL_MANAGE_BYPASS_IO especificando la operación de FS_BPIO_OP_QUERY . Los resultados mostrados identifican el primer controlador que impide BypassIO y el motivo por el que.

> fsutil bypassIo state /v <path>

Donde <la ruta de acceso> puede ser un volumen, un directorio o un nombre de archivo específico, y /v es una marca detallada opcional.

En este primer ejemplo, supongamos que el minifiltro WOF no ha optado por BypassIO. La ejecución del comando fsutil bypassIo state c:\ da como resultado la siguiente salida:

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.

En este segundo ejemplo, la ejecución fsutil bypassIO state /v c:\ en un sistema en el que BitLocker está habilitado da como resultado la siguiente salida:

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

Comportamiento específico de NTFS

BypassIO se puede habilitar en un archivo residente NTFS; Sin embargo, el archivo toma la ruta de acceso de E/S tradicional siempre que sea residente. Si se produce una escritura en el archivo de tal forma que no seaident, el sistema cambia para usar la ruta de acceso bypassIO.

La compresión NTFS no se puede habilitar en un archivo activo BypassIO.

El cifrado NTFS se puede habilitar en un archivo activo BypassIO. BypassIO está en pausa.

BypassIO no afecta a las operaciones de lectura y escritura de descarga.