Condividi tramite


C28168

avviso C28168: la funzione dispatch non dispone di un'annotazione _Dispatch_type_ corrispondente a questa voce della tabella dispatch

Questo avviso supporta verifica driver statico verificando che ogni funzione assegnata nella tabella dispatch sia annotata con una o più annotazioni _Dispatch_type_ che indicano i tipi di operazioni di invio eseguite da tale funzione. Lo strumento Analisi codice segnala questo errore quando le annotazioni nella funzione non corrispondono allo slot di immissione della tabella dispatch.

Questo difetto può essere corretto aggiungendo un'annotazione _Dispatch_type_ alla funzione o correggendo la voce della tabella dispatch utilizzata.

Esempio di

Nell'esempio di codice seguente viene generato questo avviso.

DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...

Nell'esempio di codice seguente viene evitato questo avviso.

_Dispatch_type_(IRP_MJ_CREATE) DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...

commenti

In alcune circostanze, potrebbe essere necessario eliminare questo avviso. Esistono alcuni driver, ad esempio driver di filtro, che potrebbero registrare routine di invio all'interno di un ciclo, dopo aver registrato altri direttamente.

DriverObject->MajorFunction[IRP_MJ_CREATE]         = DispatchCreate;
DriverObject->MajorFunction[IRP_MJ_READ]           = DispatchRead;
for (Index = 0; Index <= IRP_MJ_MAXIMUM_FUNCTION; Index++)
    {
            DriverObject->MajorFunction[Index] = DispatchPassIrp;
    }

In questo esempio, la funzione DispatchPassIrp viene dichiarata correttamente con le annotazioni seguenti:

__drv_dispatchType(IRP_MJ_CREATE_NAMED_PIPE)
__drv_dispatchType(IRP_MJ_QUERY_INFORMATION)
// .... 
//  (additional dispatch type annotations) 
// ....
__drv_dispatchType(IRP_MJ_CREATE_NAMED_PIPE)
    DRIVER_DISPATCH DispatchPassIrp;

In questo caso, lo strumento di analisi del codice segnala questo errore:

The function 'DispatchPassIrp' does not have a _Dispatch_type_ annotation matching dispatch table position 'IRP_MJ_CREATE' (0x00):  This can be  corrected either by adding a _Dispatch_type_ annotation to the function declaration or correcting the dispatch table entry being used.

Questo uso di un ciclo nella tabella dispatch è comune in alcuni driver di filtro. In questo caso, il messaggio di errore può essere ignorato, poiché si tratta di una limitazione dell'analisi statica. Lo strumento Analisi codice segnala questo errore quando le annotazioni nella funzione non corrispondono allo slot di immissione della tabella dispatch. In questo caso, lo strumento di analisi del codice segnala un'assegnazione non valida (annullata in un secondo momento). Tuttavia, non è possibile che uno strumento statico sappia che uno stato non valido verrà annullato in un secondo momento. Se si è certi di effettuare un'assegnazione in questo modo e correggerli in un secondo momento, è possibile eliminare l'avviso.