Uso di Driver Verifier per identificare i problemi relativi ai driver Windows per gli utenti esperti

Lo strumento Driver Verifier è incluso in ogni versione di Windows a partire da Windows 2000. Viene usato per rilevare e risolvere molti problemi del driver che sono noti per causare danneggiamento del sistema, errori o altri comportamenti imprevedibili. Questo articolo descrive come usare Driver Verifier per isolare e risolvere i problemi di un driver nel sistema.

Si applica a: Windows Server 2012 Foundation, Windows Server 2012 Essentials, Windows Server 2012 Standard, Windows Server 2012 Datacenter
Numero KB originale: 244617

Funzionalità di Driver Verifier

Per usare Driver Verifier, eseguire Verifier.exe e quindi riavviare il computer. Non è necessario apportare altre modifiche per iniziare ad analizzare i driver nel sistema. L'account utente richiede privilegi di amministratore per eseguire Verifier.exe.

Driver Verifier può controllare molti aspetti diversi del comportamento di un driver. Queste funzionalità sono raggruppate in opzioni o impostazioni abilitate dall'uso di flag. I termini opzioni, impostazioni e flag sono in genere intercambiabili nella documentazione di Driver Verifier. Rappresentano concetti simili.

Per informazioni dettagliate su ogni flag, vedere Opzioni e classi di regole di Driver Verifier.

Opzioni standard

Le opzioni seguenti rappresentano insieme le regole che tutti i driver nel sistema non devono violare. Queste opzioni vengono abilitate quando si sceglie di abilitare le impostazioni standard nella GUI di Driver Verifier oppure si specifica l'opzione /standard quando si configura Driver Verifier usando la riga di comando.

Controlli automatici

Questi controlli vengono sempre eseguiti su un driver che viene verificato, indipendentemente da quali opzioni sono state selezionate.

Esempi di controlli automatici:

  • Controlli IRQL
    • IRQL generato ,ovvero l'IRQL corrente è minore dell'IRQL di destinazione.
    • IRQL abbassato (il che significa che l'IRQL corrente è maggiore dell'IRQL di destinazione).
  • SpinLocks:
    • Doppia versione di un blocco di rotazione.
    • Le acquisizioni o le versioni del blocco di selezione vengono eseguite nel file IRQL appropriato.
  • Allocazioni di memoria:
    • Le allocazioni/gratuite del pool di paging vengono effettuate nel file IRQL corretto (APC_LEVEL o versioni successive).
    • Le allocazioni/free del pool non di paging vengono effettuate nel file IRQL corretto (DISPATCH_LEVEL o versioni successive).
    • Non vengono specificati valori casuali (non inizializzati) per queste API (Application Programming Interface).
    • Le allocazioni liberate non puntano agli oggetti timer attivi.
  • Controllo dello scaricamento del driver:
    • Verifica che il driver non disponga di operazioni in sospeso durante lo scaricamento, ad esempio DPC in sospeso o thread di lavoro.
  • Altri comportamenti del driver:
    • Passaggio non corretto degli stack di thread.
    • Tentativo di chiamare KeWaitXxx in IRQL >= DISPATCH_LEVEL.
    • Dereferenziazione di un oggetto che ha già un numero di riferimenti pari a 0.

Pool speciale

Quando questa opzione è attiva, Driver Verifier alloca la maggior parte delle richieste di memoria del driver da un pool speciale. Questo pool speciale viene monitorato per i sovraccarichi di memoria, i sottoesempi di memoria e la memoria a cui si accede dopo che è stato liberato.

Forza controllo IRQL

Quando questa opzione è attiva, Driver Verifier esercita un'estrema pressione sulla memoria del driver invalidando il codice paginabile. Se il driver tenta di accedere alla memoria di paging nell'IRQL errato o tenendo premuto un blocco di spin, Driver Verifier rileva questo comportamento.

Rilevamento pool

Quando questa opzione è attiva, Driver Verifier verifica se il driver ha liberato tutte le allocazioni di memoria quando viene scaricato. Rivela perdite di memoria.

Verifica I/O

Quando questa opzione è attiva, Driver Verifier alloca i provider di servizi di integrazione del driver da un pool speciale e monitora la gestione di I/O del driver. Rileva l'uso non valido o incoerente delle routine di I/O.

Quando I/O Verifier è abilitato:

  • Tutti i provider di servizi di integrazione allocati tramite IoAllocateIrp vengono allocati da un pool speciale, se disponibile.
  • I controlli vengono eseguiti in IoCallDriver, IoCompleteRequest e IoFreeIrp per intercettare i messaggi di errore del driver.
  • Tutti gli errori di I/O Verifier verificano il bug con il codice DRIVER_VERIFIER_IOMANAGER_VIOLATION (0xC9).

Nota

In Windows 7 e versioni successive del sistema operativo Windows, tutte le funzionalità della verifica I/O avanzata sono incluse come parte della verifica I/O e non è più disponibile né necessario selezionare l'opzione Verifica I/O avanzata in Gestione verifica driver o dalla riga di comando.

Rilevamento deadlock

Quando questa opzione è attiva, Driver Verifier monitora l'uso da parte del driver di blocchi di rotazione, mutex e mutex veloci. Rileva se il codice del driver può causare un deadlock a un certo punto.

Verifica I/O avanzata

Quando questa opzione è attiva, Driver Verifier monitora le chiamate di diverse routine di I/O Manager ed esegue test di stress degli IRP PnP, degli IRP di alimentazione e degli IRP WMI.

Nota

In Windows 7 e versioni successive, tutte le funzionalità della verifica I/O avanzata sono incluse come parte della verifica I/O. Questa opzione non è più disponibile o necessaria in Gestione verifica driver o da una riga di comando.

Verifica DMA

Quando questa opzione è attiva, Driver Verifier monitora l'uso delle routine DMA da parte del driver. Rileva l'uso non corretto di buffer DMA, adattatori e registri mappa.

Controlli di protezione

Quando questa opzione è attiva, Driver Verifier cerca errori comuni che possono causare vulnerabilità di sicurezza, ad esempio un riferimento agli indirizzi in modalità utente per routine in modalità kernel.

Controlli vari

Quando questa opzione è attiva, Driver Verifier cerca le cause comuni di arresto anomalo del driver, ad esempio la gestione errata della memoria liberata.

Controllo di conformità DDI

Quando questa opzione è attiva, Driver Verifier applica un set di regole DDI (Device Driver Interface) che verificano la corretta interazione tra un driver e l'interfaccia del kernel del sistema operativo.

L'opzione di controllo della conformità DDI viene implementata usando una libreria in modalità kernel, denominata VerifierExt.sys. Se viene rilevata una violazione di una delle regole di controllo di conformità DDI, VerifierExt.sys sarà il modulo che ha richiesto il controllo dei bug di sistema.

Opzioni aggiuntive

Queste opzioni sono progettate per il test di uno scenario specifico o sono opzioni che inseriranno errori o ritardi in determinate routine DDI per simulare condizioni di stress estreme.

Requisiti di Driver Verifier

L'unico requisito è che sia necessario installare Windows Server 2012. È possibile abilitare Driver Verifier nelle versioni retail e checked di Windows. Se è installato Norton Antivirus, non abilitare il rilevamento deadlock di Driver Verifier.

Abilitare Driver Verifier

È possibile abilitare Driver Verifier usando Verifier.exe. Verifier.exe è incluso in ogni copia di Windows. Viene installato automaticamente nella cartella System32. Verifier.exe dispone sia di interfacce della riga di comando che dell'interfaccia grafica dell'interfaccia utente, quindi è possibile specificare i driver e i livelli appropriati di verifica. È anche possibile visualizzare le statistiche di Driver Verifier in tempo reale. Per altre informazioni, vedere la sezione Driver Verifier Manager (Verifier.exe).

Violazioni di Verifica driver di debug

Se Driver Verifier rileva una violazione, il comportamento standard consiste nel controllare il sistema in modo da fornire la maggior parte delle informazioni possibili sul debug del problema. Un sistema connesso a un debugger si arresterà dopo che si è verificato un controllo dei bug.

Tutte le violazioni di Driver Verifier comportano controlli dei bug, quelli più comuni (anche se non necessariamente tutti) sono:

  • 0xC1: SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION
  • 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION
  • 0xC6: DRIVER_CAUGHT_MODIFYING_FREED_POOL
  • 0xC9: DRIVER_VERIFIER_IOMANAGER_VIOLATION
  • 0xD6: DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION
  • 0xE6: DRIVER_VERIFIER_DMA_VIOLATION

!analyze -v è il comando migliore da usare quando si avvia una nuova sessione di debug. Questo comando restituirà informazioni utili e tenterà di individuare il driver di errore.

Estensioni del debugger specifiche di Driver Verifier:

  • !verifier eseguirà il dump delle statistiche di Driver Verifier acquisite. !verifier -? mostrerà tutte le opzioni disponibili.
  • !deadlock esegue il dump di informazioni correlate a blocchi o oggetti rilevati dal rilevamento deadlock. !deadlock -? mostrerà tutte le opzioni disponibili.
  • !iovirp [address] eseguirà il dump delle informazioni relative a un IRP rilevato da I/O Verifier.
  • !ruleinfo [RuleID] eseguirà il dump delle informazioni relative alla regola di controllo di conformità DDI violata (RuleID è sempre il primo argomento del controllo di bug, tutti gli ID regola di controllo di conformità DDI sono nel formato 0x200nn).

Driver Verifier e driver grafici

I driver grafici in modalità kernel Windows, ad esempio le DLL del driver di stampa e di visualizzazione, non possono chiamare direttamente il punto di ingresso del pool. Le allocazioni di pool vengono eseguite indirettamente usando callback DDI (Device Driver Interface) grafica per Win32k.sys. Ad esempio, EngAllocMem è il callback chiamato da un driver di grafica per allocare in modo esplicito la memoria del pool. Anche altri callback specializzati, ad esempio EngCreatePalette ed EngCreateBitmap, restituiscono memoria del pool.

Per fornire gli stessi test automatizzati per i driver di grafica, il supporto per alcune funzioni di Driver Verifier è incorporato in Win32k.sys. Poiché i driver di grafica sono più limitati rispetto ad altri driver in modalità kernel, richiedono solo un subset della funzionalità Driver Verifier. In particolare, il controllo IRQL e la verifica di I/O non sono necessari. Le altre funzionalità, ovvero l'uso di pool speciali, errori casuali delle allocazioni del pool e rilevamento del pool, sono supportate in vari gradi nei diversi callback DDI grafici.

Gli errori casuali sono supportati per le funzioni di callback DDI di grafica seguenti:

  • EngAllocMem
  • EngAllocUserMem
  • EngCreateBitmap
  • EngCreateDeviceSurface
  • EngCreateDeviceBitmap
  • EngCreatePalette
  • EngCreateClip
  • EngCreatePath
  • EngCreateWnd
  • EngCreateDriverObj
  • BRUSHOBJ_pvAllocRbrush
  • CLIPOBJ_ppoGetPath

Inoltre, per EngAllocMem è supportato l'uso di un rilevamento speciale del pool e del pool.

L'abilitazione di Driver Verifier per i driver grafici è identica agli altri driver. Per altre informazioni, vedere la sezione Abilita Driver Verifier . I flag non supportati, ad esempio il controllo IRQL, vengono ignorati. Inoltre, è possibile usare il !gdikdx.verifier comando kernel-debugger per esaminare lo stato corrente di Driver Verifier e le tracce del pool per i driver grafici.

Nota

È consigliabile usare solo l'impostazione errore di allocazione casuale per il test di affidabilità. L'uso di questa impostazione può causare il rendering dei messaggi di errore, pertanto non è consigliabile usare questa impostazione con i test di verifica per verificare la correttezza dell'implementazione del driver grafico, ad esempio confrontando l'output del driver grafico con un'immagine di riferimento.

Driver Verifier Manager (Verifier.exe)

Lo strumento Driver Verifier Manager (Verifier.exe) è il modo preferito per creare e modificare le impostazioni di Driver Verifier e raccogliere statistiche da Driver Verifier. Verifier.exe si trova nella cartella %WinDir%\System32 per ogni installazione di Windows.

Driver Verifier Manager è l'interfaccia utente grafica inclusa in Windows per configurare Driver Verifier. Avviare Gestione verifica driver usando verifier.exe senza altre opzioni della riga di comando. Ogni volta che vengono inclusi i commutatori, viene usata la versione basata sulla riga di comando dell'utilità.

Per informazioni sulla configurazione di Driver Verifier, eseguire verifier.exe /? da una finestra cmd amministratore.

Stato driver

La pagina delle proprietà Stato driver offre un'immagine dello stato corrente di Driver Verifier. È possibile visualizzare i driver rilevati dal verificatore. Lo stato può essere uno dei valori seguenti:

  • Caricato: il driver è attualmente caricato e verificato.
  • Scaricato: il driver non è attualmente caricato, ma è stato caricato almeno una volta dopo il riavvio del computer.
  • Mai caricato: il driver non è mai stato caricato. Questo stato può indicare che il file di immagine del driver è danneggiato o che è stato specificato un nome di driver mancante nel sistema.

Selezionare l'intestazione dell'elenco per ordinare l'elenco in base ai nomi o allo stato dei driver. Nell'area superiore destra della finestra di dialogo è possibile visualizzare i tipi correnti della verifica in vigore. Lo stato dei driver viene aggiornato automaticamente se non si passa alla modalità di aggiornamento manuale. È possibile modificare la frequenza di aggiornamento usando i pulsanti di opzione nell'area inferiore sinistra della finestra di dialogo. Per forzare un aggiornamento dello stato, selezionare Aggiorna ora.

Se si abilita il flag Pool speciale e meno del 95% delle allocazioni del pool è andato al pool speciale, in questa pagina viene visualizzato un messaggio di avviso. Significa che è necessario selezionare un set più piccolo di driver da verificare o aggiungere più memoria fisica al computer per ottenere una migliore copertura della verifica delle allocazioni del pool.

Contatori globali

Questa pagina delle proprietà mostra il valore corrente di alcuni contatori gestiti da Driver Verifier. Un valore zero per un contatore può indicare che il flag Driver Verifier associato non è abilitato. Ad esempio, un valore pari a 0 per il contatore Altro/Errori indica che il flag di simulazione risorse basso non è abilitato. È possibile monitorare l'attività del verificatore perché i valori dei contatori vengono aggiornati automaticamente per impostazione predefinita. È possibile modificare la frequenza di aggiornamento, passare all'aggiornamento manuale o forzare un aggiornamento usando il gruppo di controlli nell'area inferiore sinistra della finestra di dialogo.

Rilevamento pool

Questa pagina delle proprietà mostra altre statistiche raccolte da Driver Verifier. Tutti i contatori visualizzati in questa pagina sono correlati al flag Di rilevamento pool del verificatore. La maggior parte di essi sono contatori per driver, ad esempio allocazioni correnti, byte allocati correnti e così via. È necessario selezionare un nome driver nella casella della combinazione superiore per visualizzare i contatori per tale driver specifico.

Impostazioni

È possibile usare questa pagina per creare e modificare le impostazioni di Driver Verifier. Le impostazioni vengono salvate nel Registro di sistema ed è necessario riavviare il computer per rendere effettive le impostazioni. È possibile usare l'elenco per visualizzare i driver attualmente installati. Ogni driver può trovarsi in uno degli stati seguenti:

  • Verifica abilitata: il driver è attualmente verificato.
  • Verifica disabilitata: il driver non è attualmente verificato.
  • Verify Enabled (Reboot Needed): il driver viene verificato solo dopo il riavvio successivo.
  • Verifica disabilitata (riavvio necessario): il driver è attualmente verificato, ma non viene verificato dopo il riavvio successivo.

È possibile selezionare uno o più driver dall'elenco e cambiare lo stato usando i due pulsanti sotto l'elenco. È anche possibile fare clic con il pulsante destro del mouse sul nome di un driver per visualizzare il menu di scelta rapida, che consente di eseguire l'attivazione/disattivazione dello stato.

Nella parte inferiore della finestra di dialogo è possibile specificare altri driver (separati da spazi) che si desidera verificare dopo il riavvio successivo. In genere si usa questo controllo di modifica quando si vuole installare un nuovo driver non già caricato.

Se il gruppo di pulsanti di opzione nella parte superiore dell'elenco è impostato su Verifica tutti i driver, l'elenco e i pulsanti Verifica e Non verificare e il controllo di modifica non sono disponibili. Significa che dopo il riavvio successivo, vengono verificati tutti i driver nel sistema.

È possibile impostare il tipo di verifica usando le caselle di controllo nell'area superiore destra della finestra di dialogo. È possibile abilitare la verifica I/O al livello 1 o al livello 2. La verifica di livello 2 è più avanzata del livello 1.

Salvare qualsiasi modifica alle impostazioni selezionando Applica. In questa pagina sono presenti altri due pulsanti:

  • Impostazioni preferite: seleziona alcune impostazioni di uso comune (con tutti i driver verificati).
  • Reimposta tutto: cancella tutte le impostazioni di Driver Verifier in modo che non vengano verificati driver.

Dopo aver selezionato Applica, è necessario riavviare il computer per rendere effettive le modifiche.

Impostazioni volatili

È possibile utilizzare questa pagina delle proprietà per modificare immediatamente i flag di Verifica driver. È possibile attivare o disattivare solo lo stato di alcuni flag di Driver Verifier. E non è possibile modificare l'elenco dei driver che vengono verificati. Dopo aver modificato lo stato di alcune caselle di controllo, selezionare Applica per rendere effettive le modifiche. Le modifiche diventano effettive immediatamente. E durano fino a quando non si apportano modifiche aggiuntive o fino a quando non si riavvia il computer.

Interfaccia della riga di comando

È anche possibile eseguire Verifier.exe da una riga di comando (per altre informazioni, digitare verifier.exe /? al prompt dei comandi). È possibile usare più commutatori nella riga di comando, ad esempio:

Verifier.exe /flags 0x209BB /driver MyDriver1.sys MyFilterDriver1.sys

L'elenco seguente mostra i flag della riga di comando più usati:

Configurare le opzioni (flag)

  • verifier.exe valore /flags

    Value è un numero esadecimale (è necessario un prefisso 0x ) che rappresenta il valore collettivo dei flag da abilitare. Il valore per ogni flag viene visualizzato nell'output verifier /? .

    Flag standard:

    0x00000000: Controlli automatici
    0x00000001: Pool speciale
    0x00000002: Forza il controllo IRQL
    0x00000008: Rilevamento pool
    0x00000010: Verifica I/O
    0x00000020: Rilevamento deadlock
    0x00000080: controllo DMA
    0x00000100: Controlli di sicurezza
    0x00000800: Controlli vari
    0x00020000: controllo di conformità DDI

    Altri flag:

    0x00000004: Simulazione casuale di risorse basse
    0x00000040: Verifica I/O avanzata (solo Vista)
    0x00000200: Forzare le richieste di I/O in sospeso
    0x00000400: Registrazione IRP
    0x00002000: controllo MDL invariante per lo stack
    0x00004000: controllo MDL invariante per driver0x00008000: fuzzing dei ritardi del framework di alimentazione

    Ad esempio, per abilitare solo i controlli Pool speciale, Verifica I/O e Varie:

    verifier.exe /flags 0x811
    

    Per abilitare tutte le impostazioni standard (ad esempio funziona):

    verifier.exe /standard
    
    verifier.exe /flags 0x209BB
    
  • Configurare i driver per la verifica

    verifier.exe /driver driver1.sys [driver2.sys driver3.sys ...]
    

    Questo comando specifica il driver o i driver specifici da verificare. Specificare driver aggiuntivi in un elenco delimitato da spazi.

    verifier.exe /all
    

    Questo comando verifica tutti i driver nel sistema.

  • Configurare usando la modalità volatile

    verifier.exe /volatile /flags *value /adddriver MyDriver1.sys*
    

    Questo comando modifica immediatamente i flag di verifica e aggiunge MyDriver1.sys per la verifica.

  • Eseguire query sulle statistiche di Verifica corrente

    verifier /query
    

    Eseguire il dump dello stato corrente di Driver Verifier e dei contatori nell'output standard.

  • Eseguire query sulle impostazioni correnti di Verifier

    verifier /querysettings
    

    Eseguire il dump delle impostazioni correnti di Driver Verifier nell'output standard.

  • Deselezionare le impostazioni di Verifica

    verifier.exe /reset
    

    Questo comando cancella tutte le impostazioni correnti di Driver Verifier.

Informazioni aggiuntive per gli sviluppatori di driver

Le sezioni seguenti descrivono altri dettagli sulle impostazioni di verifica dei driver che potrebbero interessare gli sviluppatori di driver. Queste impostazioni non sono in genere richieste dai professionisti IT.

Importante

In questa sezione, metodo o attività viene illustrata la procedura per modificare il Registro di sistema. Poiché l'errata modifica del Registro di sistema può causare seri problemi, Di conseguenza, attenersi scrupolosamente alla procedura indicata. Per una maggiore protezione, eseguire il backup del Registro di sistema prima di modificarlo. In questo modo sarà possibile ripristinare il Registro di sistema se si verifica un problema. Per ulteriori informazioni su come eseguire backup e ripristino del Registro di sistema, vedere Backup e ripristino del Registro di sistema in Windows.

Per abilitare Driver Verifier modificando il Registro di sistema, seguire questa procedura:

  1. Avviare Editor del Registro di sistema (Regedt32).

  2. Individuare la seguente chiave del Registro di sistema:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers

  3. Modificare la REG_SZ chiave.

Impostare la REG_SZ chiave sui nomi senza distinzione tra maiuscole e minuscole dei driver da testare. È possibile specificare più driver, ma usare solo un driver. In questo modo, è possibile assicurarsi che le risorse di sistema disponibili non siano esaurite prematuramente. L'esaurimento prematuro delle risorse non causa problemi di affidabilità del sistema, ma può causare il bypass di alcuni controlli del driver.

L'elenco seguente mostra esempi di valori per la REG_SZ chiave:

  • Ntfs.sys
  • Win32k.sys ftdisk.sys
  • *.sys

È possibile specificare il livello di verifica del driver nella chiave del Registro di sistema seguente:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDriverLevel

Il valore della chiave è una DWORD che rappresenta la raccolta di tutti i flag abilitati.