C28168

advertencia C28168: la función dispatch no tiene una anotación _Dispatch_type_ que coincida con esta entrada de tabla de distribución.

Esta advertencia admite el comprobador de controladores estáticos comprobando que cada función asignada a la tabla de distribución se anota con una o varias anotaciones _Dispatch_type_ que indican los tipos de operaciones de envío realizadas por esa función. La herramienta Análisis de código notifica este error cuando las anotaciones de la función no coinciden con la ranura de entrada de la tabla de distribución.

Este defecto se puede corregir agregando una anotación _Dispatch_type_ a la función o corrigiendo la entrada de la tabla de distribución que se está usando.

Ejemplo

En el ejemplo de código siguiente se genera esta advertencia.

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

En el ejemplo de código siguiente se evita esta advertencia.

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

Comentarios

En algunas circunstancias, es posible que tenga que suprimir esta advertencia. Hay algunos controladores, por ejemplo, controladores de filtro, que pueden registrar rutinas de envío dentro de un bucle, después de que hayan registrado otros directamente.

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

En este ejemplo, la función DispatchPassIrp se declara correctamente con las siguientes anotaciones:

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

En esta situación, la herramienta análisis de código notifica este error:

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.

Este uso de un bucle en la tabla de distribución es común en algunos controladores de filtro. En esta situación, se puede omitir el mensaje de error, ya que se trata de una limitación del análisis estático. La herramienta Análisis de código notifica este error cuando las anotaciones de la función no coinciden con la ranura de entrada de la tabla de distribución. En este caso, la herramienta Análisis de código informa de una asignación no válida (que se deshaga más adelante). Sin embargo, no hay ninguna manera de que una herramienta estática sepa que un estado no válido se deshacerá más adelante. Si sabe que va a realizar asignaciones de esta manera y corregirlas más adelante, puede suprimir la advertencia.