Regla UsbKmdfIrqlExplicit (kmdf)
La regla UsbKmdfIrqlExplicit comprueba que se llama a los DDIS de KMDF en el nivel IRQL correcto. Esta regla se aplica a todas las funciones EvtIoCallback.
Si el controlador llamó a la función WdfIoQueueCreate con la estructura WDF_OBJECT_ATTRIBUTES y el objeto de dispositivo pasado a esta DDI se creó con los atributos predeterminados (WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE o VOID WDF_OBJECT_ATTRIBUTES_INIT), es posible que tenga que modificar el controlador de una de las maneras siguientes para que el Comprobador de controladores estáticos no notifique un defecto relacionado con esta regla:
Establezca explícitamente los atributos de dispositivo en WdfExecutionLevelPassive o WdfExecutionLevelDispatch cambiando el código de controlador para establecer los atributos mediante una llamada a una función que usa la estructura WDF_OBJECT_ATTRIBUTES como parámetro.
Asuma o asafirme explícitamente para analizar que WdfExecutionLevelPassive o WdfExecutionLevelDispatch se establece en los atributos del dispositivo mediante la macro __analysis_assume . Este es un ejemplo: __analysis_assume(deviceAttributes.ExecutionLevel==WdfExecutionLevelPassive)
Si el controlador procesa algunas E/STL en PASSIVE_LEVEL y otras en DISPATCH_LEVEL, es posible que tenga que excluir las ICTL que se procesan en DISPATCH_LEVEL de la comprobación. Puede usar __analysis_assume para hacerlo. Este es un ejemplo: __analysis_assume(IoControlCode != IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE), donde IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE se procesa en DISPATCH_LEVEL en el controlador EvtIoDeviceControlCallback.
Modelo de controlador: KMDF
Cómo probar
En tiempo de compilación |
---|
Ejecute el comprobador de controladores estáticos y especifique la regla UsbKmdfIrqlExplicit . Usa los pasos siguientes para ejecutar un análisis de tu código:
Para obtener más información, vea Usar comprobador de controladores estáticos para buscar defectos en controladores. |
Se aplica a
WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDeviceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDeviceGetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously