BypassIO per i driver di filtro
Informazioni su BypassIO
La funzionalità BypassIO offre un percorso di I/O ottimizzato per la lettura da file. L'obiettivo di questo percorso è ridurre il sovraccarico della CPU per le 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. È disponibile a partire da Windows 11.
È importante che i minifiltri implementino il supporto per BypassIO e che il bypassIO sia abilitato 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 al gioco nelle versioni future di Windows.There will be broad application uses beyond gaming in future Windows release.
BypassIO è un concetto per handle. Quando viene richiesto BypassIO, è per un handle di file esplicito. BypassIO non ha alcun effetto 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. Il processo minifiltri 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: entrambi restituiscono 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 del file system e gli stack di archiviazione e informazioni su come implementare BypassIO in un driver minifiltro. 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 viene chiamato NtReadFile in un FileHandle abilitato per BypassIO, l'operazione in genere non passa attraverso lo stack di I/O tradizionale, che attraversa l'intero stack di 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 del disco (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:
- Leggere I/O ignorare lo stack di filtri.
- Le operazioni di I/O di lettura vengono comunque inviate tramite il volume e/o lo stack di archiviazione.
Questo livello di supporto è noto come BypassIO parziale.
Modifiche e aggiunte DDI per BypassIO
Sono state aggiunte le DDI seguenti relative ai driver di filtro per fornire il supporto BypassIO:
- Funzione FltVetoBypassIo
- enumeratore FS_BPIO_INFLAGS
- struttura FS_BPIO_INFO
- struttura FS_BPIO_INPUT
- enumeratore FS_BPIO_OPERATIONS
- enumeratore FS_BPIO_OUTFLAGS
- struttura FS_BPIO_OUTPUT
- struttura FS_BPIO_RESULTS
- codice di controllo FSCTL_MANAGE_BYPASS_IO
- Funzione FsRtlGetBypassIoOpenCount
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 oggetti 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.
Effetto 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 si dispone di Handle A aperto in un file in cui BypassIO è abilitato e funzionante e un utente (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 sospeso temporaneamente 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 di dati e le mappe della cache. Di conseguenza, i filtri devono chiudere il file dell'handle prima che BypassIO possa riprendere.
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 deframmentazione, 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 minifiltro non ha aggiornato l'impostazione SupportedFeatures per 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 accodati 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 acconsente esplicitamente.
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
Un comando fsutil aggiunto 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.
> 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 minifiltro WOF non abbia acconsentito 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 restituisce 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 sia rientrata, 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 influisce sulle operazioni di lettura/scrittura di offload.