BypassIO per i driver di filtro

Informazioni su BypassIO

A partire da Windows 11, BypassIO è stato aggiunto come percorso di I/O ottimizzato per la lettura dai file. L'obiettivo di questo percorso è ridurre il sovraccarico della CPU delle operazioni di lettura, che consente di soddisfare le richieste di I/O di caricamento ed esecuzione di giochi di nuova generazione in Windows. BypassIO fa parte dell'infrastruttura per supportare DirectStorage in Windows.

È importante che i minifiltri implementino il supporto per BypassIO e che l'opzione BypassIO venga abilitata il più possibile. Senza il supporto dei filtri, le prestazioni del gioco sono ridotte, con conseguente scarsa esperienza di gioco per gli utenti finali.

Saranno disponibili applicazioni più ampie oltre ai giochi nelle versioni future di Windows.

BypassIO è un concetto per handle. Quando viene richiesto BypassIO, si tratta di un handle di file esplicito. BypassIO non ha alcun impatto su altri handle per tale file.

FSCTL_MANAGE_BYPASS_IO e un IOCTL_STORAGE_MANAGE_BYPASS_IO equivalente sono stati aggiunti come parte di questa infrastruttura. I minifiltri elaborano FSCTL_MANAGE_BYPASS_IO, mentre IOCTL_STORAGE_MANAGE_BYPASS_IO viene inviato dai file system agli stack di volume/archiviazione. Questi codici di controllo sono progettati per essere indipendenti: restituiscono entrambi l'identità del driver che non ha superato la richiesta BypassIO e il motivo del veto.

Questa pagina fornisce informazioni sull'architettura tra i filtri e gli stack di archiviazione del file system e informazioni su come implementare BypassIO in un driver minifilter. Vedere BypassIO per i driver di archiviazione per informazioni BypassIO specifiche per i driver di archiviazione.

Ambito del supporto bypassIO

A partire da Windows 11, BypassIO è supportato come segue:

  • Solo nei sistemi client Windows. Il supporto del sistema server verrà aggiunto in una versione futura.

  • Solo nei dispositivi di archiviazione NVMe. Il supporto per altre tecnologie di archiviazione verrà aggiunto in una versione futura.

  • Solo nel file system NTFS. Il supporto per altri file system verrà aggiunto in una versione futura.

  • Sono supportate solo le letture non memorizzate nella cache. Il supporto per le scritture non memorizzate nella cache verrà aggiunto in una versione futura.

  • Supportato solo nei file (non supportato in handle di directory o volumi).

Funzionamento di BypassIO

Quando NtReadFile viene chiamato su un FileHandle abilitato per BypassIO, l'operazione in genere non scorre attraverso lo stack di I/O tradizionale, che attraversa l'intero stack del file system, lo stack di volumi e lo stack di archiviazione. L'operazione passa invece direttamente dal gestore di I/O al file system (NTFS), quindi al driver disk (classpnp) e quindi al driver StorNVMe. Con un FileHandle completamente abilitato per BypassIO:

  • Tutti i filtri del file system vengono ignorati.
  • Tutti i filtri dello stack di volumi vengono ignorati.
  • Tutti i filtri dello stack di archiviazione e i driver sopra il driver del disco e tra i driver StorNVMe e disco vengono ignorati.

Negli scenari in cui lo stack di filtri del file system supporta BypassIO, ma il volume e/o lo stack di archiviazione non lo ignorano, le operazioni di I/O ignorano lo stack di filtri ma vengono comunque inviate tramite il volume e/o lo stack di archiviazione. Questo livello di supporto è noto come BypassIO parziale.

Immagine che mostra il percorso I O tradizionale per una richiesta di lettura.

Immagine che mostra il percorso Bypass I O per una richiesta di lettura.

Modifiche e aggiunte DDI per BypassIO

Sono state aggiunte le DDI seguenti relative ai driver di filtro per fornire supporto BypassIO:

Inoltre, le DDI seguenti sono state modificate per supportare BypassIO:

  • Alla struttura FSRTL_ADVANCED_FCB_HEADER è stato aggiunto un campo BypassIoOpenCount. Il file system usa questo campo per mantenere un conteggio di FileObject univoci in un flusso in cui è attualmente abilitato BypassIO. L'aggiunta di questo campo aumenta le dimensioni della struttura. La versione della struttura da usare a partire da Windows 11 è FSRTL_FCB_HEADER_V4.

Impatto di altre operazioni sugli handle abilitati per BypassIO

L'abilitazione di BypassIO in un handle non influisce su altri handle. Tuttavia, altre operazioni su un handle abilitato per BypassIO influiscono sull'uso di BypassIO, ad esempio negli scenari seguenti:

  • Se l'oggetto Handle A è aperto a un file in cui BypassIO è abilitato e funzionante e qualcuno (ad esempio, un altro thread o processo) apre Handle B per eseguire operazioni di I/O memorizzate nella cache o mappate alla memoria, bypassIO viene temporaneamente sospeso sull'handle A fino alla chiusura dell'handle B. Il sistema usa invece il percorso di I/O tradizionale per garantire che i dati non aggiornati non si verifichino. Il sistema continua a usare il percorso di I/O tradizionale su tale handle fino a quando non vengono eliminate tutte le sezioni dati e le mappe della cache, quindi i filtri devono chiudere il file dell'handle per poter riprendere BypassIO.

  • Se un file abilitato per BypassIO è contrassegnato come sparse, tutte le operazioni BypassIO iniziano a usare il percorso di I/O tradizionale.

  • La defragging di un file abilitato per BypassIO fa sì che tutte le operazioni BypassIO usino il percorso di I/O tradizionale. Al termine della defragging, il sistema torna al percorso BypassIO su tale handle.

Implementazione del supporto bypassIO nei minifiltri

Aggiornare i file INF o MANIFEST

A partire da Windows 11, gli sviluppatori di filtri devono aggiungere SUPPORTED_FS_FEATURES_BYPASS_IO a SupportedFeatures nei file INF o MANIFEST del driver. È possibile digitare fltmc instances in un prompt dei comandi con privilegi elevati per visualizzare i valori "SprtFtrs" per tutti i filtri attivi.

Nota

Un filtro che non può mai supportare BypassIO deve comunque aggiungere SUPPORTED_FS_FEATURES_BYPASS_IO allo stato SupportedFeatures e quindi impostare il veto in modo appropriato all'interno del filtro, specificando il motivo.

I minifiltri sono incoraggiati a ridurre al minimo il più possibile il veto bypassIO.

Se un minifiltro si collega a un volume in cui è abilitato BypassIO, ma tale minifilter non ha aggiornato l'impostazione SupportedFeatures in modo da includere SUPPORTED_FS_FEATURES_BYPASS_IO, tutte le operazioni BypassIO su tale volume vengono immediatamente bloccate, eseguendo il fallback al percorso di I/O tradizionale, con conseguente riduzione delle prestazioni del gioco.

I minifiltri che non filtrano IRP_MJ_READ o IRP_MJ_WRITE vengono acconsentiti automaticamente al supporto bypassIO, come se fossero stati aggiunti SUPPORTED_FS_FEATURES_BYPASS_IO in SupportedFeatures.

Le operazioni di FS_BPIO_OP_ENABLE e FS_BPIO_OP_QUERY hanno esito negativo in uno stack se è presente un minifiltro collegato che non ha acconconsenso esplicito.

Implementare il supporto per le richieste BypassIO

I minifiltri devono aggiungere il supporto per le richieste BypassIO, che vengono inviate tramite il codice di controllo FSCTL_MANAGE_BYPASS_IO . Per informazioni dettagliate, vedere Supporto delle operazioni BypassIO .

Determinazione del funzionamento di BypassIO

È stato aggiunto un comando fsutil che genera un FSCTL_MANAGE_BYPASS_IO specificando l'operazione di FS_BPIO_OP_QUERY . I risultati visualizzati identificano il primo driver che impedisce BypassIO e il motivo per cui.

> fsutil bypassIo state /v <path>

Dove <percorso> può essere un volume, una directory o un nome file specifico e /v è un flag dettagliato facoltativo.

In questo primo esempio, si supponga che il minifilter WOF non abbia accondito esplicitamente a BypassIO. L'esecuzione del comando fsutil bypassIo state c:\ restituisce l'output seguente:

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.

In questo secondo esempio, l'esecuzione fsutil bypassIO state /v c:\ in un sistema in cui BitLocker è abilitato genera l'output seguente:

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

Comportamento specifico di NTFS

BypassIO può essere abilitato in un file residente NTFS; Tuttavia, il file accetta il percorso di I/O tradizionale purché sia residente. Se si verifica una scrittura nel file in modo che non venga impostato come rientro, il sistema passa all'uso del percorso BypassIO.

La compressione NTFS non può essere abilitata in un file attivo BypassIO.

La crittografia NTFS può essere abilitata in un file attivo BypassIO. BypassIO è sospeso.

BypassIO non ha alcun impatto sulle operazioni di lettura/scrittura di offload.