Поделиться через


Правило 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