Partager via


C28168

avertissement C28168 : La fonction dispatch n’a pas d’annotation _Dispatch_type_ correspondant à cette entrée de table de répartition

Cet avertissement prend en charge Static Driver Verifier en vérifiant que chaque fonction affectée à la table de répartition est annotée avec une ou plusieurs annotations _Dispatch_type_ qui indiquent les types d’opérations de répartition effectuées par cette fonction. L’outil Analyse du code signale cette erreur lorsque les annotations sur la fonction ne correspondent pas à l’emplacement d’entrée de la table de répartition.

Ce défaut peut être corrigé en ajoutant une annotation _Dispatch_type_ à la fonction ou en corrigeant l’entrée de table de répartition utilisée.

Exemple

L’exemple de code suivant génère cet avertissement.

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

L’exemple de code suivant évite cet avertissement.

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

Commentaires

Dans certains cas, vous devrez peut-être supprimer cet avertissement. Il existe certains pilotes, par exemple les pilotes de filtre, qui peuvent inscrire des routines de distribution à l’intérieur d’une boucle, une fois qu’ils en ont inscrit d’autres directement.

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

Dans cet exemple, la fonction DispatchPassIrp est correctement déclarée avec les annotations suivantes :

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

Dans ce cas, l’outil Analyse du code signale cette erreur :

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.

Cette utilisation d’une boucle dans la table de répartition est courante dans certains pilotes de filtre. Dans ce cas, le message d’erreur peut être ignoré, car il s’agit d’une limitation de l’analyse statique. L’outil Analyse du code signale cette erreur lorsque les annotations sur la fonction ne correspondent pas à l’emplacement d’entrée de la table de répartition. Dans ce cas, l’outil Analyse du code signale une affectation non conforme (annulée ultérieurement). Toutefois, il n’existe aucun moyen pour un outil statique de savoir qu’un état illégal sera annulé ultérieurement. Si vous savez que vous effectuez des affectations de cette façon et que vous les corrigez ultérieurement, vous pouvez supprimer l’avertissement.