Compartir a través de


Conjunto de reglas RequestProcessing (KMDF)

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

En esta sección

Tema Descripción

ChangeQueueState

La regla ChangeQueueState especifica que el controlador WDF no intenta cambiar el estado de la cola de subprocesos simultáneos o no llama al estado cambiando los DDIs uno después de otro desde dentro del mismo subproceso. Las funciones de devolución de llamada que cambian el estado de la cola son WdfIoQueueStopSynchronously,WdfIoQueuePurge,WdfIoQueuePurgeSynchronously, WdfIoQueueDrain, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurge y WdfIoQueueStopAndPurgeSynchronously. Si se llama a estos DDIs cuando un cambio de estado de cola ya está en curso, hará que un equipo se bloquee o deje de responder.

CompleteCanceledReq

La regla CompleteCanceledReq especifica que si la solicitud ya se ha cancelado, la solicitud ya no es válida y el controlador no debe completarla. Aunque el controlador desmarca una solicitud que se marcó previamente como cancelable, debe comprobar que la solicitud aún no se ha cancelado. Si el controlador no realiza esta comprobación, es posible que el controlador complete una solicitud que se haya liberado.

DoubleCompletion

La regla DoubleCompletion especifica que los controladores no deben completar una solicitud de E/S dos veces. No se debe llamar a los métodos siguientes dos veces en una fila para la misma solicitud: WdfRequestComplete, WdfRequestCompleteWithInformation, WdfRequestCompleteWithPriorityBoost.

DoubleCompletionLocal

La regla DoubleCompletionLocal especifica que los controladores no deben completar una solicitud de E/S dos veces.

EvtIoStopCancel

La regla EvtIoStopCancel especifica que dentro de la función de devolución de llamada EvtIoStop , el controlador llama a uno de los métodos siguientes para las solicitudes de E/S que no se pueden cancelar.

EvtIoStopCompleteOrStopAck

La regla EvtIoStopCompleteOrStopAck especifica que dentro de la función de devolución de llamada EvtIoStop , el controlador llama a uno de los métodos siguientes para cada solicitud de E/S presentada por el marco. Si esto no se hace, el controlador podría impedir que el sistema entre en otro estado de potencia inferior.

EvtSurpriseRemoveNoSuspendQueue

La regla EvtSurpriseRemoveNoSuspendQueue especifica que los controladores de WDF no deben purgar, detener o purgar la cola de la función de devolución de llamada EvtDeviceSurpriseRemoval , sino que se deben usar funciones de devolución de llamada de E/S autoadministradas. La función de devolución de llamada EvtDeviceSurpriseRemoval no está sincronizada con la ruta de alimentación.

FileObjectConfigured

La regla FileObjectConfigured especifica que una llamada al método WdfRequestGetFileObject está precedida por una llamada a WdfDeviceInitSetFileObjectConfig.

InternalIoctlReqs

La regla InternalIoctlReqs especifica que las solicitudes IOCTL internas no se pasan a interfaces de controlador de dispositivo (DDIs) de envío de solicitudes KMDF inapropiadas.

InvalidReqAccess

La regla InvalidReqAccess especifica que no se tiene acceso a las solicitudes una vez completadas o canceladas. Esta regla puede superponerse con otras reglas, como las reglas que comprueban la finalización doble o las reglas que comprueban si hay solicitudes se han marcado como cancelables dos veces.

InvalidReqAccessLocal

La regla InvalidReqAccessLocal especifica que no se tiene acceso a las solicitudes creadas localmente una vez completadas o canceladas. Esta regla puede superponerse con otras reglas, como las reglas que comprueban la finalización doble o las reglas que comprueban si hay solicitudes se han marcado como cancelables dos veces.

IoctlReqs

La regla IoctlReqs especifica que las solicitudes IOCTL no deben pasarse a una solicitud KMDF inapropiada ni enviar interfaces de controlador de dispositivo (DDIs).

MarkCancOnCancReqLocal

La regla MarkCancOnCancReqLocal especifica que el método WdfRequestMarkCancelable no se puede llamar dos veces consecutivas en la misma solicitud de E/S.

NoIoQueuePurgeSynchronously

La regla NoIoQueuePurgeSynchronously comprueba que los controladores de WDF no llaman a las funciones WdfIoQueueStopSynchronously, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurgeSynchronously o WdfIoQueuePurgeSynchronously desde las siguientes funciones de devolución de llamada del objeto de cola evtIO:

OutputBufferAPI

La regla OutputBufferAPI especifica que los DDIs correctos para la recuperación del búfer se usan en la función de devolución de llamada EvtIoWrite . Dentro de la función de devolución de llamada EvtIoWrite , no se puede llamar a las siguientes DDIs para la recuperación del búfer:

ReadReqs

La regla ReadReqs especifica que las solicitudes de lectura no se pasan a métodos KMDF inadecuados.

ReqCompletionRoutine

La regla ReqCompletionRoutine especifica que se debe establecer una rutina de finalización antes de enviar una solicitud a un destino de E/S.

ReqDelete

La regla ReqDelete especifica que las solicitudes creadas por el controlador no se pasan a las funciones WdfRequestCompleteXxx . En su lugar, la solicitud debe eliminarse tras la finalización.

ReqIsCancOnCancReq

La regla ReqIsCancOnCancReq especifica que solo se puede llamar al método WdfRequestIsCanceled en una solicitud que no está marcada como cancelable.

ReqMarkCancelableSend

La regla ReqMarkCancelableSend especifica que las solicitudes reenviadas por el controlador no se marcan como cancelables llamando a WdfRequestMarkCancelable.

RequestCompleted

La regla DeferredRequestCompleted especifica que, para un controlador que no sea de filtro, se debe completar cada solicitud presentada a la cola de E/S predeterminada del controlador, a menos que se aplaza o reenvíe la solicitud, o si se llama a WdfRequestStopAcknowledge .

RequestFormattedValid

La regla RequestFormattedValid especifica que el controlador da formato a todas las solicitudes, excepto una solicitud de WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET, antes de enviarlos a un destino de E/S.

RequestGetStatusValid

La regla RequestGetStatusValid que especifica que se debe llamar a WdfRequestGetStatus para una solicitud en una de las situaciones siguientes:

  • Cuando WdfRequestSend devuelve un error.
  • Cuando se ha enviado la solicitud con WDF_REQUEST_SEND_OPTION_SYNCHRONOUS.

RequestSendAndForgetNoFormatting

La regla RequestSendAndForgetNoFormatting comprueba que el controlador no da formato a una solicitud mediante las funciones de formato de destino de E/S antes de enviarlo a un destino de E/S con la opción de envío WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

RequestSendAndForgetNoFormatting2

La regla RequestSendAndForgetNoFormatting2 comprueba que el controlador no da formato a una solicitud mediante las funciones de formato de destino de E/S antes de enviarlo a un destino de E/S con la opción de envío WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

StopAckWithinEvtIoStop

La regla StopAckWithinEvtIoStop especifica que la función WdfRequestStopAcknowledge solo se llama desde dentro de la función de devolución de llamada EvtIoStop .

WdfIoQueueFindRequestFailed

La regla WdfIoQueueFindRequestFailed especifica que WdfIoQueueRetrieveFoundRequest o WdfObjectDereference solo se debe llamar después de que WdfIoQueueFindRequestFailed devuelva STATUS_SUCCESS.

WdfIoQueueRetrieveFoundRequest

La regla WdfIoQueueRetrieveFoundRequest especifica que se llama al método WdfIoQueueRetrieveFoundRequest solo después de llamar a WdfIoQueueFindRequest y se devuelve STATUS_SUCCESS y no se llama a WdfObjectDereference en la misma solicitud.

WdfIoQueueRetrieveNextRequest

La regla WdfIoQueueRetrieveNextRequest especifica que no se llama a WdfIoQueueRetrieveNextRequest después de llamar a WdfIoQueueFindRequest .

WriteReqs

La regla WriteReqs especifica que una solicitud de escritura no se pasa a métodos KMDF inadecuados.

Para seleccionar el conjunto de reglas RequestProcessing

  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 RequestProcessing.

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

    msbuild /t:sdv /p:Inputs="/check:RequestProcessing.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).