Points d’entrée en double pour un type de rôle de fonction
Pour la plupart des types de rôles de fonction, SDV suppose que le pilote a, au maximum, une fonction de rappel pour chaque point d’entrée. Toutefois, certains types de rôles de fonction peuvent avoir plusieurs fonctions de rappel d’événement associées. Par exemple, un pilote KMDF peut avoir plusieurs fonctions de rappel EvtTimerFunc ou EvtDpcFunc (qui utilisent les annotations de type de rôle EVT_WDF_TIMER et EVT_WDF_DPC). Dans ce cas, SDV ajoute un entier au type de fonction dans Sdv-map.h. Par exemple, si votre pilote a deux fonctions de rappel DPC, SDV les mappe à fun_WDF_DPC_1 et fun_WDF_DPC_2.
Si un pilote dépasse le nombre maximal de fonctions de rappel pour un type de rôle, SDV affiche le message suivant.
Static Driver Verifier found more than one entry point for '[role type]'
Si un type de rôle de fonction a plus de points d’entrée que SDV prend en charge, il n’y a pas nécessairement de problème avec le pilote. Toutefois, pour obtenir des résultats de vérification précis, vous devez modifier le fichier Sdv.-map.h pour supprimer les entrées en double.
Par exemple, le fichier Sdv-map.h suivant montre qu’il existe deux fonctions CompletionRoutine qui ont été annotées à l’aide du type de rôle EVT_WDF_REQUEST_COMPLETION_ROUTINE. Dans le fichier Sdv-map.h, SDV définit EvtRequestReadCompletionRoutine et EvtRequestWriteCompletionRoutine comme fun_WDF_REQUEST_COMPLETION_ROUTINE.
//Approved=false
#define fun_WDF_DRIVER_DEVICE_ADD OsrFxEvtDeviceAdd
#define fun_WDF_IO_QUEUE_IO_READ OsrFxEvtIoRead
#define fun_WDF_IO_QUEUE_IO_STOP OsrFxEvtIoStop
#define fun_WDF_DEVICE_D0_EXIT OsrFxEvtDeviceD0Exit
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
#define fun_WDF_OBJECT_CONTEXT_CLEANUP OsrFxEvtDriverContextCleanup
#define fun_WDF_DEVICE_D0_ENTRY OsrFxEvtDeviceD0Entry
#define fun_WDF_DEVICE_PREPARE_HARDWARE OsrFxEvtDevicePrepareHardware
#define fun_WDF_IO_QUEUE_IO_WRITE OsrFxEvtIoWrite
#define fun_WDF_IO_QUEUE_IO_DEVICE_CONTROL OsrFxEvtIoDeviceControl
Pour supprimer la duplication, commentez la deuxième routine d’achèvement (remplacez la #d dans #define par deux délimiteurs de commentaires (//). Ensuite, définissez Approved=true et exécutez une vérification.
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
//efine fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
Une fois que vous avez affiché les résultats de la vérification avec la routine d’achèvement unique, modifiez à nouveau le fichier Sdv-map.h, mais cette fois commentez la routine d’achèvement qui vient d’être vérifiée et supprimez le commentaire (remplacez par //#d) de la routine d’achèvement qui n’a pas été vérifiée. Réexécutez ensuite SDV.
Types de rôles de fonction qui prennent en charge plusieurs points d’entrée
Certains types de rôles de fonction prennent en charge plusieurs entrées. Lorsque le nombre d’entrées dépasse la valeur maximale prise en charge, SDV les signale également comme entrées en double. Vous pouvez traiter ces entrées supplémentaires de la même façon que vous gérez les entrées en double, en commentant sélectivement les instructions #define pour les routines de rappel dans le fichier Sdv-map.h et en effectuant des vérifications distinctes. Par exemple, si votre pilote a huit fonctions de rappel DPC (qui utilisent le type de rôle EVT_WDF_DPC), vous pouvez effectuer les opérations suivantes :
Modifiez Sdv-map.h et commentez les instructions define pour fun_WDF_DPC_5 via fun_WDF_DPC_8.
Exécutez SDV sur le pilote.
Modifiez ensuite de nouveau Sdv-map.h pour définir fun_WDF_DPC_5 via fun_WDF_DPC_8 et commentez les instructions define pour fun_WDF_DPC_1 via fun_WDF_DPC_4.
Exécutez SDV sur le pilote.
Consultez Annotations KMDF du vérificateur de pilote statique pour obtenir la liste des types de rôles de fonction pouvant avoir plusieurs fonctions de rappel. La liste indique le nombre maximal de fonctions de rappel que SDV prend en charge pour ces types de rôles.