Regra UsbKmdfIrqlExplicit (kmdf)
A regra UsbKmdfIrqlExplicit verifica se os DDIs KMDF são chamados no nível IRQL correto. Essa regra se aplica a todas as funções EvtIoCallback.
Se o driver chamou a função WdfIoQueueCreate com o struct WDF_OBJECT_ATTRIBUTES e o objeto de dispositivo passado para essa DDI foi criado usando os atributos padrão (WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE ou VOID WDF_OBJECT_ATTRIBUTES_INIT), talvez seja necessário modificar o driver de uma das seguintes maneiras para que o Verificador de Driver Estático não relate um defeito relacionado a essa regra:
Defina os atributos do dispositivo explicitamente como WdfExecutionLevelPassive ou WdfExecutionLevelDispatch alterando o código do driver para definir os atributos chamando uma função que usa o struct WDF_OBJECT_ATTRIBUTES como parâmetro.
Suponha explicitamente/afirme para fins de análise que wdfExecutionLevelPassive ou WdfExecutionLevelDispatch está definido nos atributos do dispositivo usando a macro __analysis_assume . Veja um exemplo: __analysis_assume(deviceAttributes.ExecutionLevel==WdfExecutionLevelPassive)
Se o driver processar algumas IOCTLs em PASSIVE_LEVEL e outras em DISPATCH_LEVEL, talvez seja necessário excluir as IOCTLs processadas em DISPATCH_LEVEL da verificação. Você pode usar __analysis_assume para fazer isso. Aqui está um exemplo: __analysis_assume(IoControlCode != IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE), em que IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE é processado em DISPATCH_LEVEL no driver EvtIoDeviceControlCallback.
Modelo de driver: KMDF
Como testar
Em tempo de compilação |
---|
Execute o Verificador de Driver Estático e especifique a regra UsbKmdfIrqlExplicit . Use as seguintes etapas para executar uma análise do código:
Para obter mais informações, consulte Usando o verificador de driver estático para localizar defeitos em drivers. |
Aplica-se a
WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously