Uso di Static Driver Verifier (Verifica driver statico) per trovare i difetti nei driver di Windows
Static Driver Verifier (SDV) usa un set di regole di interfaccia e un modello del sistema operativo per determinare se il driver interagisce correttamente con il sistema operativo Windows. SDV rileva i difetti nel codice del driver che potrebbero puntare a potenziali bug nei driver.
SDV può analizzare i driver in modalità kernel conformi a uno dei modelli di driver seguenti: WDM, KMDF, NDIS o Storport. Per altre informazioni, vedere Driver supportati e Determinare se Static Driver Verifier supporta il driver o la libreria. Inoltre, SDV offre supporto limitato (un set di regole con restrizioni gravemente incentrato su errori generali, ad esempio dereferenziazioni Null) per i driver che non seguono i modelli di driver precedenti.
Importante
SDV non è più supportato e SDV non è disponibile nelle versioni WDK o EWDK di Windows 24H2. Non è disponibile in WDK più recente rispetto alla build 26017 e non è incluso in Windows 24H2 RTM WDK.
SDV può comunque essere usato scaricando Windows 11 versione 22H2 EWDK (rilasciata il 24 ottobre 2023) con gli strumenti di compilazione di Visual Studio 17.1.5 da Scaricare Windows Driver Kit (WDK) . È consigliabile usare enterprise WDK per eseguire SDV. L'uso di versioni precedenti del WDK standard in combinazione con le versioni recenti di Visual Studio non è consigliato, in quanto ciò genererà probabilmente errori di analisi.
In futuro, CodeQL sarà lo strumento di analisi statico principale per i driver. CodeQL offre un linguaggio di query potente che considera il codice come database su cui eseguire query, semplificando la scrittura di query per comportamenti, modelli e altro ancora specifici.
Per altre informazioni sull'uso di CodeQL, vedere CodeQL e il test del logo degli strumenti statici.
Preparazione del codice sorgente
Per preparare il codice per l'analisi, seguire questa procedura.
Dichiarare le funzioni fornite dal driver usando i tipi di ruolo funzione
SDV richiede che le funzioni vengano dichiarate tramite dichiarazioni di tipo di ruolo della funzione. Ad esempio, una routine DriverEntry deve essere dichiarata usando il tipo di ruolo della funzione DRIVER_INITIALIZE:
DRIVER_INITIALIZE DriverEntry;
Dopo la dichiarazione, si implementa (o si definisce) la routine di callback come indicato di seguito:
/ // Driver initialization routine // NTSTATUS DriverEntry( _In_ struct _DRIVER_OBJECT *DriverObject, _In_ PUNICODE_STRING RegistryPath ) { // Function body }
Ogni modello di driver supportato include un set di tipi di ruolo funzione per le funzioni di callback del driver e le routine dispatch. Questi tipi di ruolo funzione vengono dichiarati nei file di intestazione WDK. Ecco ad esempio il prototipo di funzione per il tipo di ruolo DRIVER_INITIALIZE visualizzato in Wdm.h.
/ // Define driver initialization routine type. // _Function_class_(DRIVER_INITIALIZE) _IRQL_requires_same_ typedef NTSTATUS DRIVER_INITIALIZE ( _In_ struct _DRIVER_OBJECT *DriverObject, _In_ PUNICODE_STRING RegistryPath ); typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
Poiché i tipi di ruolo della funzione sono già definiti nei file di intestazione WDK, è sufficiente dichiarare le funzioni di callback come di tale tipo. In questo caso, si dichiara DriverEntry come di tipo DRIVER_INITIALIZE. Per un elenco completo dei tipi di ruolo funzione per i modelli di driver, vedere Uso delle dichiarazioni del tipo di ruolo funzione.
Eseguire l'analisi del codice per C/C++
Per determinare se il codice sorgente è preparato, eseguire lo strumento Analisi codice in Visual Studio. Lo strumento Di analisi del codice verifica la presenza di dichiarazioni del tipo di ruolo della funzione, che richiede SDV. Lo strumento di analisi del codice consente di identificare le dichiarazioni di funzione che potrebbero non essere state rilevate o avvisare quando i parametri della definizione della funzione non corrispondono a quelli nel tipo di ruolo della funzione.
- Aprire il progetto driver in Visual Studio.
- Scegliere Esegui analisi del codice nella soluzione dal menu Compila.
I risultati vengono visualizzati nella finestra Analisi codice. Correggere eventuali dichiarazioni di funzione che potrebbero non essere state rilevate. È anche possibile configurare lo strumento di analisi del codice in modo che venga eseguito ogni volta che si compila la soluzione.
La tabella seguente mostra alcuni avvisi che lo strumento di analisi del codice potrebbe trovare nel codice del driver. Per eseguire Static Driver Verifier, il driver deve essere privo di questi difetti.
Analisi del codice per avviso C/C++ Descrizione C28101 Il modulo Drivers ha dedotto che la funzione corrente è una <funzione di tipo> funzione C28022 La classe di funzione (es) in questa funzione non corrisponde alla classe della funzione (es) nel typedef usato per definirlo. C28023 La funzione assegnata o passata deve avere un'annotazione _Function_class_ per almeno una delle classi C28024 Il puntatore a funzione assegnato a viene annotato con la classe funzione, che non è contenuta nell'elenco di classi di funzione. C28169 La funzione <> dispatch non dispone di annotazioni _Dispatch_type_ C28208 La firma della funzione non corrisponde alle dichiarazioni di funzione
Esecuzione del verificatore di driver statici
Aprire il file del progetto driver (con estensione vcxProj) in Visual Studio. Dal menu Driver fare clic su Launch Static Driver Verifier...(Avvia verifica driver statico...).
Verrà aperta l'applicazione Static Driver Verifier, in cui è possibile controllare, configurare e pianificare l'esecuzione di un'analisi del driver statico.
Se il driver include una libreria, fare clic sulla scheda Librerie e fare clic su Aggiungi libreria per aggiungere la libreria.
Passare alla directory del codice sorgente della libreria e selezionare il file di progetto (con estensione vcxProj). Aggiungere tutte le librerie incluse dal driver. Le librerie devono essere aggiunte prima che SDV analizzi il driver. Quando si avvia un'analisi del driver, SDV analizza anche le librerie che non sono state elaborate. Dopo l'elaborazione di una libreria, viene archiviata nella cache SDV globale. Per altre informazioni, vedere Elaborazione di librerie in Static Driver Verifier
Controllare le impostazioni di configurazione per Static Driver Verifier. Fare clic sulla scheda Configura.
Configurazione progetto La configurazione del progetto mostra le impostazioni di configurazione e piattaforma selezionate in Visual Studio.
Risorse Nella maggior parte dei casi, è possibile usare le impostazioni predefinite. Se SDV segnala timeout, GiveUp o Spaceout, è possibile provare a modificare queste impostazioni. Per altre informazioni, vedere Raccomandazioni per la risoluzione dei problemi relativi a Static Driver Verifier.
Pianifica Consente di selezionare un'ora di inizio per l'inizio della verifica. L'impostazione predefinita consiste nell'avviare l'analisi immediatamente dopo aver fatto clic su Avvia nella scheda Principale . A seconda delle dimensioni del driver e della relativa complessità, l'analisi statica può richiedere molto tempo per l'esecuzione. È possibile pianificare l'analisi per iniziare quando è più conveniente per l'utente; ad esempio, alla fine del giorno.
Nota
Assicurarsi di controllare il piano di risparmio energia del computer per assicurarsi che il computer non entri in stato di sospensione durante l'analisi.
Fare clic sulla scheda Regole per selezionare le regole di utilizzo dell'API driver da verificare all'avvio dell'analisi.
Static Driver Verifier rileva il tipo di driver che si sta analizzando (WDF, WDM, NDIS o Storport) e seleziona il set predefinito di regole per il tipo di driver. Se è la prima volta che si esegue SDV nel driver, è necessario eseguire il set di regole predefinito.
Per informazioni sulle regole, vedere Regole di conformità DDI.
Avviare l'analisi statica. Fare clic sulla scheda Principale e quindi su Avvia. Quando si fa clic su Avvia, viene visualizzato un messaggio per informare che l'analisi statica è pianificata e che l'analisi può richiedere molto tempo per l'esecuzione. Fare clic su OK per continuare. L'analisi inizia al momento della pianificazione.
Visualizzazione e analisi dei risultati
Man mano che l'analisi statica procede, SDV segnala lo stato dell'analisi. Al termine dell'analisi, SDV segnala i risultati e le statistiche. Se il driver non soddisfa una regola di utilizzo dell'API, il risultato viene segnalato come difetto.
Se si sono verificati problemi, SDV visualizza quelli nelle pagine Avvisi ed Errori . Nella pagina Proprietà driver vengono visualizzati i risultati dei test per determinate proprietà del driver. I test delle proprietà del driver vengono usati per identificare le funzionalità del driver per qualificare ulteriormente l'analisi. È possibile usare i risultati delle proprietà del driver per confermare le proprietà previste e le funzionalità supportate del driver.
Per visualizzare difetti specifici nel report di verifica driver statici, fare clic su Difetti nel riquadro Risultati . Verrà aperto il Visualizzatore tracce, che visualizza una traccia del percorso del codice alla violazione della regola. Per altre informazioni, vedere Interpretazione dei risultati del driver statico.
Nota
Static Driver Verifier mantiene i risultati e le impostazioni dall'analisi. Per cancellare i risultati, fare clic su Pulisci.
Risoluzione dei problemi relativi ai risultati del verificatore dei driver statici
Se SDV segnala che non sono stati rilevati difetti, controllare la scheda Principale per assicurarsi che i punti di ingresso vengano rilevati. Se il driver non dichiara funzioni usando i tipi di ruolo della funzione, SDV non sarà in grado di analizzare e individuare i difetti nel codice del driver. Per altre informazioni, vedere Uso delle dichiarazioni del tipo di ruolo della funzione.
Se SDV segnala timeout o non restituisce risultati utili, potrebbe essere necessario modificare alcune opzioni di configurazione SDV. Per altre informazioni su come risolvere i problemi relativi a SDV, vedere Raccomandazioni per la risoluzione dei problemi relativi al driver statico.
Argomenti correlati
Determinare se Static Driver Verifier supporta il driver o la libreria
Uso delle dichiarazioni dei tipi di ruolo della funzione