Uso di Static Driver Verifier 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 gravi incentrato su errori generali, ad esempio dereferenziazioni Null) per i driver che non seguono i modelli di driver precedenti.

Preparazione del codice sorgente

Usare la procedura seguente per preparare il codice per l'analisi.

  1. Dichiarare le funzioni fornite dal driver usando i tipi di ruolo funzione

    SDV richiede che le funzioni vengano dichiarate tramite dichiarazioni del 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, implementare (o definire) 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 di funzione vengono dichiarati nei file di intestazione WDK. Ad esempio, ecco 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 Using Function Role Type Declarations.

  2. 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 Analisi codice controlla la presenza di dichiarazioni del tipo di ruolo della funzione, richiesta da SDV. Lo strumento Analisi codice consente di identificare eventuali dichiarazioni di funzione che potrebbero essere state perse 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 l'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 di 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 di funzione, che non è contenuta nell'elenco delle classi di funzione.
    C28169 La funzione <> dispatch non ha alcuna annotazione _Dispatch_type_
    C28208 La firma della funzione non corrisponde alle dichiarazioni di funzione

Esecuzione del verifier del driver statico

  1. Aprire il file del progetto driver (con estensione vcxProj) in Visual Studio. Dal menu Driver fare clic su Launch Static Driver Verifier....From the Driver menu, click Launch Static Driver Verifier....

    Verrà aperta l'applicazione Static Driver Verifier, in cui è possibile controllare, configurare e pianificare quando il driver statico verifica esegue un'analisi.

  2. 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, questa viene archiviata nella cache SDV globale. Per altre informazioni, vedere Elaborazione di librerie in Static Driver Verifier

  3. Controllare le impostazioni di configurazione per Static Driver Verifier. Fare clic sulla scheda Configura.

    Configurazione del progetto Configurazione 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.

    Programma Selezionare un'ora di inizio per l'inizio della verifica. L'impostazione predefinita consiste nell'iniziare 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; 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.

  4. 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 questa è 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.

  5. Avviare l'analisi statica. Fare clic sulla scheda Principale e quindi su Avvia. Quando si fa clic su Start, viene visualizzato un messaggio per informare che l'analisi statica è pianificata e che l'analisi può richiedere molto tempo per l'esecuzione. Per continuare scegliere OK . L'analisi inizia all'ora pianificata.

Visualizzazione e analisi dei risultati

Durante l'analisi statica, 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 statico, fare clic su Difetti nel riquadro Risultati . Verrà aperto il Visualizzatore di traccia, 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 dell'analisi. Per cancellare i risultati, fare clic su Pulisci.

Risoluzione dei problemi relativi ai risultati del verifier del driver statico

Se SDV segnala che non sono stati trovati difetti, controllare la scheda Principale per assicurarsi che vengano rilevati punti di ingresso. Se il driver non dichiara le 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 Using Function Role Type Declarations.

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 di SDV, vedere Raccomandazioni per la risoluzione dei problemi relativi al driver statico verifier.

Determinare se Static Driver Verifier supporta il driver o la libreria

Uso delle dichiarazioni dei tipi di ruolo della funzione

Regole di verifica del driver statico

Strumento di analisi del codice