Правило UsbKmdfIrqlExplicit (kmdf)

Правило UsbKmdfIrqlExplicit проверяет, вызываются ли DDIs KMDF на правильном уровне IRQL. Это правило применяется ко всем функциям EvtIoCallback.

Если драйвер вызвал функцию WdfIoQueueCreate со структурой WDF_OBJECT_ATTRIBUTES и объект устройства, переданный в этот DDI, был создан с помощью атрибутов по умолчанию (WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE или VOID WDF_OBJECT_ATTRIBUTES_INIT), возможно, потребуется изменить драйвер одним из следующих способов, чтобы средство проверки статических драйверов не сообщало о дефекте, связанном с этим правилом:

Явно задайте для атрибутов устройства значение WdfExecutionLevelPassive или WdfExecutionLevelDispatch, изменив код драйвера, чтобы задать атрибуты, вызвав функцию, которая использует структуру WDF_OBJECT_ATTRIBUTES в качестве параметра.

Явным образом предположить или утвердить для анализа, что WdfExecutionLevelPassive или WdfExecutionLevelDispatch задан в атрибутах устройства с помощью макроса __analysis_assume . Ниже приведен пример: __analysis_assume(deviceAttributes.ExecutionLevel==WdfExecutionLevelPassive)

Если драйвер обрабатывает некоторые ioCTL на PASSIVE_LEVEL, а другие — на DISPATCH_LEVEL, может потребоваться исключить из проверки ioCTL, которые обрабатываются на DISPATCH_LEVEL. Для этого можно использовать __analysis_assume . Ниже приведен пример: __analysis_assume(IoControlCode != IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE), где IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE обрабатывается на DISPATCH_LEVEL в драйвере EvtIoDeviceControlCallback.

Модель драйвера: KMDF

Как тестировать

Во время компиляции

Запустите Static Driver Verifier и укажите правило UsbKmdfIrqlExplicit .

Выполните следующие действия, чтобы выполнить анализ кода.
  1. Подготовьте код (используйте объявления типов ролей).
  2. Запустите средство проверки статических драйверов.
  3. Просмотр и анализ результатов.

Дополнительные сведения см. в разделе Использование средства проверки статических драйверов для поиска дефектов в драйверах.

Применяется к

WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceNumber WdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadhronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously