Partilhar via


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:
  1. Prepare seu código (use declarações de tipo de função).
  2. Execute o Verificador de Driver Estático.
  3. Exiba e analise os resultados.

Para obter mais informações, consulte Usando o verificador de driver estático para localizar defeitos em drivers.

Aplica-se a

WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously