Compartir a través de


Conjunto de reglas irpProcessing (WDM)

Use estas reglas para comprobar que el controlador procesa correctamente los paquetes de solicitud de E/S (IRP).

En esta sección

Tema Descripción

CompleteRequest

La regla CompleteRequest comprueba que no se llama a la rutina IoCompleteRequest después de que se ejecute una rutina de finalización y que no devuelva STATUS_MORE_PROCESSING_REQUIRED.

CompleteRequestStatusCheck

La regla CompleteRequestStatusCheck comprueba que el valor de estado de E/S del IRP coincide con el valor de estado devuelto por el controlador inferior.

CompletionRoutineRegistered

La regla CompletionRoutineRegistered especifica que si la rutina de envío registra una rutina de IoCompletion mediante IoSetCompletionRoutineEx, la rutina de distribución debe llamar a IoCallDriver o PoCallDriver.

DoubleCompletion

La regla DoubleCompletion (WDM) especifica que el controlador no debe llamar a la rutina IoCompleteRequest dos veces para el mismo IRP.

IoReuseIrp

La regla IoReuseIrp especifica que un controlador debe usar IoReuseIrp solo en irP asignados previamente con IoAllocateIrp.

IoReuseIrp2

La regla IoReuseIrp2 especifica que un controlador debe usar IoReuseIrp solo en irP asignados anteriormente dentro del controlador.

IoSetCompletionExCompleteIrp

La regla IoSetCompletionExCompleteIrp especifica que la rutina IoSetCompletionRoutineEx devuelve un valor NTSTATUS. El controlador debe comprobar este valor para determinar si la rutina de IoCompletion se registró correctamente antes de llamar a IoCallDriver o PoCallDriver y si Se produce un error en IoSetCompletionRoutineEx , el IRP debe completarse y la rutina de envío debe devolverse.

IoSetCompletionRoutineExCheck

La regla IoSetCompletionRoutineExCheck especifica que la rutina IoSetCompletionRoutineEx devuelve un valor NTSTATUS. El controlador debe comprobar este valor para determinar si la rutina de IoCompletion se registró correctamente antes de llamar a IoCallDriver o PoCallDriver.

IoSetCompletionRoutineExCheckDeviceObject

La regla IoSetCompletionRoutineExCheckDeviceObject especifica que si el objeto de dispositivo actual no se pasa a IoSetCompletionRoutineEx y el objeto de dispositivo inferior es , esto puede provocar una condición de carrera en la que se podría descargar el objeto de dispositivo actual aunque la rutina de finalización no se haya ejecutado.

IoSetCompletionRoutineNonPnpDriver

La regla IoSetCompletionRoutineNonPnpDriver especifica que los controladores que no son controladores PnP deben usar IoSetCompletionRoutineEx no IoSetCompletionRoutineRoutine.

IrpCancelField

La regla IrpCancelField especifica que el controlador comprueba el valor del miembro Irp-Cancel> al establecer una rutina de cancelación en un IRP que tiene el lápiz.

IrpProcessingComplete

La regla IrpProcessingComplete especifica que si una rutina de distribución devuelve STATUS_SUCCESS, el IRP debe haber sido completado por el propio controlador o por un controlador de nivel inferior.

LowerDriverReturn

La regla LowerDriverReturn especifica que después de usar PoCallDriver o IoCallDriver para llamar a un controlador inferior, el controlador guarda el estado devuelto de la llamada y pasa el estado devuelto que recibió a la rutina de envío.

SignalEventInCompletion

La regla SignalEventInCompletion especifica que, al procesar un IRP asincrónico, el controlador debe llamar a KeSetEvent en la rutina de finalización cuando se establece la marca Irp-PendingReturned>.

SignalEventInCompletion2

La regla SignalEventInCompletion2 especifica que, al procesar un IRP asincrónico, el controlador debe llamar a KeSetEvent en la rutina de finalización cuando se establece la marca Irp-PendingReturned>.

SignalEventInCompletion3

La regla SignalEventInCompletion3 especifica que, al procesar un IRP asincrónico, el controlador debe llamar a KeSetEvent en la rutina de finalización cuando se establece la marca Irp-PendingReturned>.

StartIoCancel

La regla StartIoCancel especifica que el controlador no debe llamar a IoSetStartIoAttributes con el parámetro NonCancelable establecido en FALSE antes de llamar a IoSetCancelRoutine con una rutina Cancel que no sea NULL.

StartIoRecursion

La regla StartIoRecursion especifica que si la rutina StartIo de un controlador incluye una llamada a IoStartNextPacket, el controlador primero debe llamar a IoSetStartIoAttributes con el atributo DeferredStartIo establecido en TRUE. De lo contrario, la recursividad infinita puede dar lugar.

PnpRemove

La regla PnpRemove especifica que el controlador no puede completar IRP_MN_SURPRISE_REMOVAL, IRP_MN_CANCEL_REMOVE_DEVICE, IRP_MN_CANCEL_STOP_DEVICE o solicitudes de IRP_MN_REMOVE_DEVICE con un error.

PnpSurpriseRemove

La regla PnpSurpriseRemove especifica que el controlador no llama a IoDeleteDevice o IoDetachDevice mientras procesa una solicitud de IRP_MN_SURPRISE_REMOVAL .

PowerDownAllocate

La regla PowerDownAllocate especifica que un controlador FDO y FIDO no deben asignar memoria al procesar una solicitud de IRP_MN_SET_POWER para una transición SystemPowerState que va de s0 a [S1... S5].

PowerDownFail

La regla PowerDownFail especifica que un controlador FDO o FIDO no debe producir un error en una solicitud de IRP_MN_SET_POWER cuando el dispositivo se apaga. Esta regla solo se aplica a los controladores FDO y FIDO.

PowerIrpDDIs

La regla PowerIrpDDIs especifica que cuando un controlador está procesando un sistema o un dispositivo IRP_MJ_POWER con IRP_MN_SET_POWER, no debe llamar a DDIs que solo se pueda llamar en PASSIVE_LEVEL.

PowerUpFail

La regla PowerUpFail especifica que un controlador FDO o FIDO no debe producir un error en una solicitud de IRP_MN_SET_POWER cuando el dispositivo está encendido.

PnpIrpCompletion

La regla PnpIrpCompletion comprueba que un controlador de FDO pasa IRP PnP al controlador inferior.

WmiComplete

La regla WmiComplete especifica que al procesar un IRP secundario de WMI, el controlador llama a IoCompleteRequest antes de volver de la rutina DispatchSystemControl .

WmiForward

La regla WmiForward especifica que el controlador debe reenviar irP menores de WMI cuando se requiera el reenvío.

Para seleccionar el conjunto de reglas IrpProcessing

  1. Seleccione el proyecto de controlador (.vcxProj) en Microsoft Visual Studio. En el menú Controlador , haga clic en Iniciar comprobador de controladores estáticos....

  2. Haga clic en la pestaña Reglas . En Conjuntos de reglas, seleccione IrpProcessing.

    Para seleccionar el conjunto de reglas predeterminado en una ventana del símbolo del sistema para desarrolladores de Visual Studio, especifique IrpProcessing.sdv con la opción /check . Por ejemplo:

    msbuild /t:sdv /p:Inputs="/check:IrpProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    Para obtener más información, consulte Uso del comprobador de controladores estáticos para buscar defectos en controladores y comandos comprobadores de controladores estáticos (MSBuild).