Règle UsbKmdfIrqlExplicit (kmdf)
La règle UsbKmdfIrqlExplicit vérifie que les DDIS KMDF sont appelées au niveau IRQL correct. Cette règle s’applique à toutes les fonctions EvtIoCallback.
Si votre pilote a appelé la fonction WdfIoQueueCreate avec le struct WDF_OBJECT_ATTRIBUTES et que l’objet d’appareil passé dans ce DDI a été créé à l’aide des attributs par défaut (WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE ou VOID WDF_OBJECT_ATTRIBUTES_INIT), vous devrez peut-être modifier votre pilote de l’une des manières suivantes afin que Static Driver Verifier ne signale pas de défaut lié à cette règle :
Définissez explicitement les attributs de l’appareil sur WdfExecutionLevelPassive ou WdfExecutionLevelDispatch en modifiant le code du pilote pour définir les attributs en appelant une fonction qui utilise le struct WDF_OBJECT_ATTRIBUTES comme paramètre.
Suppose/affirme explicitement, à des fins d’analyse, que WdfExecutionLevelPassive ou WdfExecutionLevelDispatch est défini dans les attributs de l’appareil à l’aide de la macro __analysis_assume . Voici un exemple : __analysis_assume(deviceAttributes.ExecutionLevel==WdfExecutionLevelPassive)
Si votre pilote traite certaines IOCTL au PASSIVE_LEVEL et d’autres à DISPATCH_LEVEL, vous devrez peut-être exclure les IOCTL qui sont traitées à DISPATCH_LEVEL de la vérification. Vous pouvez utiliser __analysis_assume pour ce faire. Voici un exemple : __analysis_assume(IoControlCode != IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE), où IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE est traité à DISPATCH_LEVEL dans le pilote EvtIoDeviceControlCallback.
Modèle de pilote : KMDF
Comment tester
Au moment de la compilation |
---|
Exécutez Static Driver Verifier et spécifiez la règle UsbKmdfIrqlExplicit . Utilisez les étapes suivantes pour exécuter l’analyse de votre code :
Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes. |
S’applique à
WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceNumberUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously