Compartilhar via


C28168

aviso C28168: a função dispatch não tem uma anotação _Dispatch_type_ correspondente a esta entrada de tabela de expedição

Esse aviso dá suporte ao Verificador de Driver Estático verificando se cada função atribuída à tabela de expedição é anotada com uma ou mais anotações _Dispatch_type_ que indicam os tipos de operações de expedição executadas por essa função. A ferramenta Análise de Código relata esse erro quando as anotações na função não correspondem ao slot de entrada da tabela de expedição.

Esse defeito pode ser corrigido adicionando uma anotação _Dispatch_type_ à função ou corrigindo a entrada da tabela de expedição que está sendo usada.

Exemplo

O exemplo de código a seguir gera esse aviso.

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

O exemplo de código a seguir evita esse aviso.

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

Comentários

Em algumas circunstâncias, talvez seja necessário suprimir esse aviso. Há alguns drivers, por exemplo, drivers de filtro, que podem registrar rotinas de expedição dentro de um loop, depois de terem registrado outros diretamente.

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;
    }

Neste exemplo, a função DispatchPassIrp é declarada corretamente com as seguintes anotações:

__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;

Nessa situação, a ferramenta análise de código relata este erro:

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.

Esse uso de um loop na tabela de expedição é comum em alguns drivers de filtro. Nessa situação, a mensagem de erro pode ser ignorada, pois essa é uma limitação da análise estática. A ferramenta Análise de Código relata esse erro quando as anotações na função não correspondem ao slot de entrada da tabela de expedição. Nesse caso, a ferramenta análise de código relata uma atribuição ilegal (que é desfeita posteriormente). No entanto, não há como uma ferramenta estática saber que um Estado ilegal será desfeito mais tarde. Se você souber que está fazendo uma tarefa dessa maneira e corrigi-las mais tarde, poderá suprimir o aviso.