Правило 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 . Выполните следующие действия, чтобы выполнить анализ кода.
Дополнительные сведения см. в разделе Использование средства проверки статических драйверов для поиска дефектов в драйверах. |
Применяется к
WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceNumber WdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadhronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously