Partager via


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 :
  1. Préparez votre code (utilisez les déclarations de type).
  2. Exécutez le vérificateur de pilote statique.
  3. Affichez et analysez les résultats.

Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes.

S’applique à

WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceNumberUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously