Verifica di I/O
Driver Verifier ha due livelli di verifica di I/O:
La verifica di I/O di livello 1 è sempre attiva ogni volta che viene selezionata la verifica di I/O.
La verifica di I/O di livello 2 è sempre attiva ogni volta che viene selezionata la verifica di I/O in Windows XP e versioni successive.
Vedi anche: Verifica di I/O avanzata in Windows 7 e versioni successive del sistema operativo Windows, la verifica di I/O avanzata viene attivata automaticamente quando si seleziona Verifica I/O. Non è disponibile o necessario selezionarlo come opzione separata.
Verifica I/O di livello 1
Quando la verifica di I/O di livello 1 è abilitata, tutti i runtime di integrazione ottenuti tramite IoAllocateIrp vengono allocati da un pool speciale e ne viene rilevato l'uso.
Inoltre, Driver Verifier verifica la presenza di chiamate di I/O non valide, tra cui:
Tenta di liberare un IRP il cui tipo non è IO_TYPE_IRP
Passa oggetti dispositivo non validi a IoCallDriver
Passa un IRP a IoCompleteRequest che contiene lo stato non valido o che ha ancora un set di routine di annullamento
Modifiche al runtime di integrazione in una chiamata alla routine dispatch del driver
Tenta di liberare un IRP che rimane associato a un thread
Passa un oggetto dispositivo a IoInitializeTimer che contiene già un timer inizializzato
Passa un buffer non valido a IoBuildAsynchronousFsdRequest o IoBuildDeviceIoControlRequest
Passa un blocco di stato di I/O a un IRP, quando questo blocco di stato di I/O viene allocato in uno stack con un rollforward troppo lontano
Passa un oggetto evento a un IRP, quando questo oggetto evento viene allocato in uno stack che non è stato eseguito il rollforward troppo lontano
Poiché il pool IRP speciale è di dimensioni limitate, la verifica di I/O è più efficace quando viene usata solo su un driver alla volta.
Gli errori del livello di verifica di I/O 1 causano il controllo dei bug 0xC9 essere rilasciati. Il primo parametro di questo controllo di bug indica quale violazione si è verificata. Per un elenco completo dei parametri, vedere Bug Check 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION).
Verifica I/O di livello 2
Gli errori di I/O Verification Level 2 vengono visualizzati in modi diversi: sullo schermo blu, in un file di dump di arresto anomalo del sistema e in un debugger del kernel.
Nella schermata blu questi errori vengono annotati dal messaggio ERRORE DI VERIFICA SISTEMA I/O e dalla stringa WDM DRIVER ERRORXXX, dove XXX è un codice di errore di I/O.
In un file di dump di arresto anomalo del sistema, la maggior parte di questi errori viene annotata dal messaggio BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) insieme al codice di errore di I/O. In questo caso, il codice di errore di I/O viene visualizzato come primo parametro del controllo dei bug 0xC9. Il resto è indicato dal messaggio Controllo bug 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION), insieme a un codice di errore del driver verifier. In questo caso, il codice di errore del driver Verifier viene visualizzato come primo parametro del controllo dei bug 0xC4.
In un debugger del kernel (KD o WinDbg), questi errori vengono annotati dal messaggio WDM DRIVER ERROR e da una stringa di testo descrittiva. Quando il debugger del kernel è attivo, è possibile ignorare gli errori di livello 2 e riprendere l'operazione di sistema. Questo non è possibile con altri controlli di bug.
La schermata blu, il file di dump di arresto anomalo del sistema e il debugger del kernel visualizzano anche informazioni aggiuntive. Per una descrizione completa della maggior parte dei messaggi di errore del livello di verifica I/O 2, vedere Controllo dei bug 0xC9. Per il resto, vedere Controllo bug 0xC4.
A partire da Window Vista, l'opzione Verifica I/O verifica verifica la presenza degli errori del driver seguenti:
Tempo necessario per completare e annullare i runtime di integrazione originati nelle applicazioni in modalità utente.
Rilascio di un blocco di rimozione non ancora acquisito.
Chiamata di IoReleaseRemoveLock o IoReleaseRemoveLockAndWait con un parametro tag diverso dal parametro tag usato nella chiamata IoAcquireRemoveLock corrispondente.
Chiamata di IoCallDriver con interrupt disabilitati.
Chiamata di IoCallDriver in IRQL maggiore di DISPATCH_LEVEL.
Restituzione da una routine di invio del driver con interrupt disabilitati.
Restituzione da una routine di invio del driver con un IRQL modificato.
Restituzione da una routine di invio del driver con LE API disabilitate. In questo caso, il driver potrebbe aver chiamato KeEnterCriticalRegion più volte rispetto a KeLeaveCriticalRegion, che è la causa principale per il controllo dei bug 0x20 (KERNEL_APC_PENDING_DURING_EXIT) e il controllo dei bug 0x1 (APC_INDEX_MISMATCH).
A partire da Windows 7, l'opzione Verifica I/O controlla la presenza degli errori del driver seguenti:
- Tenta di liberare i runtime di integrazione chiamando ExFreePool. Gli IRP devono essere liberati con IoFreeIrp.
È anche possibile usare questa opzione per rilevare un altro bug comune del driver, reinizializzando i blocchi di rimozione. Rimuovere le strutture di dati dei blocchi devono essere allocate all'interno delle estensioni del dispositivo. In questo modo, il gestore di I/O libera la memoria che contiene la struttura IO_REMOVE_LOCK solo quando l'oggetto dispositivo viene eliminato. Se il driver esegue i tre passaggi seguenti, è possibile che dopo il passaggio 2 un'applicazione o un driver contenga ancora un riferimento a Device1:
- Alloca la struttura IO_REMOVE_LOCK che corrisponde a Device1, ma esegue l'allocazione all'esterno dell'estensione di Device1.
- Chiama IoReleaseRemoveLockAndWait quando Device1 viene rimosso.
- Chiama IoInitializeRemoveLock per lo stesso blocco per riutilizzarlo come blocco di rimozione per Device2.
È possibile che dopo il passaggio 2 un'applicazione o un driver contenga ancora un riferimento a Device1. L'applicazione o il driver possono comunque inviare richieste a Device1, anche se questo dispositivo è stato rimosso. Pertanto, non è sicuro riutilizzare la stessa memoria di un nuovo blocco di rimozione fino a quando gestione I/O elimina Device1. La reinizializzazione dello stesso blocco mentre un altro thread sta tentando di acquisirlo può causare il danneggiamento del blocco, con risultati imprevedibili per il driver e l'intero sistema.
In Windows 7 e versioni successive del sistema operativo Windows, la verifica di I/O avanzata viene attivata automaticamente quando si seleziona Verifica I/O.
Attivazione di questa opzione
È possibile attivare la funzionalità di verifica di I/O per uno o più driver usando Gestione verifica driver o la riga di comando Verifier.exe. Per informazioni dettagliate, vedere Selezione delle opzioni di verifica driver.
Nella riga di comando.
Nella riga di comando, l'opzione Verifica I/O è rappresentata da Bit 4 (0x10).At the command line, the I/O Verification option is represented by Bit 4 (0x10). Per attivare la verifica di I/O, usare un valore flag di 0x10 o aggiungere 0x10 al valore del flag. Ad esempio:
verifier /flags 0x10 /driver MyDriver.sys
La funzionalità sarà attiva dopo l'avvio successivo.
È anche possibile attivare e disattivare la verifica di I/O senza riavviare il computer aggiungendo il parametro /volatile al comando. Ad esempio:
verifier /volatile /flags 0x10 /adddriver MyDriver.sys
Questa impostazione è effettiva immediatamente, ma viene persa quando si arresta o si riavvia il computer. Per informazioni dettagliate, vedere Uso delle impostazioni volatili.
La funzionalità di verifica di I/O è inclusa anche nelle impostazioni standard. Ad esempio:
verifier /standard /driver MyDriver.sys
Uso di Gestione verifica driver
- Selezionare Crea impostazioni personalizzate (per sviluppatori di codice) e quindi fare clic su Avanti.
- Selezionare Seleziona singole impostazioni da un elenco completo.
- Selezionare (controllare) Verifica di I/O.
La funzionalità di verifica di I/O è inclusa anche nelle impostazioni standard. Per usare questa funzionalità, in Gestione driver verifier fare clic su Crea impostazioni standard.