Condividi tramite


C28168

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

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

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

Esempio

L'esempio di codice seguente genera 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 i driver di filtro, che potrebbero registrare routine di invio all'interno di un ciclo, dopo aver registrato direttamente altri utenti.

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 questa situazione, lo strumento 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 questa situazione, il messaggio di errore può essere ignorato, poiché si tratta di una limitazione dell'analisi statica. Lo strumento Analisi del codice segnala questo errore quando le annotazioni nella funzione non corrispondono allo slot di immissione della tabella di invio. In questo caso, lo strumento analisi del codice segnala un'assegnazione illegale (annullata in un secondo momento). Tuttavia, non è possibile che uno strumento statico sappia che uno stato illegale verrà annullato in un secondo momento. Se si sa che si sta eseguendo un'assegnazione in questo modo e correggerli in un secondo momento, è possibile eliminare l'avviso.