Dela via


RequestProcessing-regeluppsättning (KMDF)

Använd dessa regler för att säkerställa att din drivrutin fullbordar eller avbryter I/O-begärandepaket (IRP) korrekt.

I det här avsnittet

Ämne Beskrivning

ChangeQueueState

Regeln ChangeQueueState anger att WDF-drivrutinen inte försöker ändra tillståndet för kön från samtidiga trådar eller inte anropar tillståndsändring av DDIs en efter en från samma tråd. Kötillståndsförändrande återanropsfunktioner inkluderar WdfIoQueueStop, WdfIoQueueStopSynchronously, WdfIoQueuePurge, WdfIoQueuePurgeSynchronously, WdfIoQueueDrain, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurge och WdfIoQueueStopAndPurgeSynchronously. Om dessa DDI:er anropas när en kötillståndsändring redan pågår kommer en dator att krascha eller inte svara.

AvslutaAvböjdFörfrågan

CompleteCanceledReq-regeln anger att om begäran redan har avbrutits är begäran inte längre giltig och drivrutinen bör inte slutföra den. Medan drivrutinen avmarkerar en begäran som tidigare markerats som uppsägningsbar, måste den kontrollera att begäran inte redan har avbrutits. Om drivrutinen inte gör den här kontrollen kan drivrutinen slutföra en begäran som har frigjorts.

DoubleCompletion

DoubleCompletion-regeln anger att drivrutiner inte får slutföra en I/O-begäran två gånger. Följande metoder bör inte anropas två gånger i rad för samma begäran: WdfRequestComplete, WdfRequestCompleteWithInformation, WdfRequestCompleteWithPriorityBoost.

DoubleCompletionLocal

Regeln DoubleCompletionLocal anger att drivrutiner inte får slutföra en I/O-begäran två gånger.

EvtIoStopCancel

EvtIoStopCancel-regeln anger att drivrutinen anropar någon av följande metoder för I/O-begäranden som inte kan avbrytas i funktionen EvtIoStop callback.

EvtIoStopCompleteOrStopAck

EvtIoStopCompleteOrStopAck-regeln anger att drivrutinen anropar någon av följande metoder för varje I/O-begäran som presenteras av ramverket i funktionen EvtIoStop callback. Om detta inte görs kan drivrutinen blockera systemet från att ange ett annat lägre energitillstånd.

EvtSurpriseRemoveNoSuspendQueue

EvtSurpriseRemoveNoSuspendQueue-regeln anger att WDF-drivrutiner inte ska tömma, stoppa eller rensa kön från EvtDeviceSurpriseRemoval-återanropsfunktionen, i stället ska självhanterade I/O-återanropsfunktioner användas. Återanropsfunktionen EvtDeviceSurpriseRemoval synkroniseras inte med avstängningsvägen.

FileObjectConfigured

FileObjectConfigured-regeln anger att ett anrop till metoden WdfRequestGetFileObject föregås av ett anrop till WdfDeviceInitSetFileObjectConfig.

InternalIoctlReqs

InternalIoctlReqs-regeln anger att interna IOCTL-begäranden inte skickas till olämpliga KMDF-gränssnitt för att skicka enhetsdrivrutiner (DDI:er).

InvalidReqAccess

InvalidReqAccess-regeln anger att begäranden inte nås när de har slutförts eller avbrutits. Den här regeln kan överlappa med andra regler, till exempel regler som letar efter dubbla slutföranden, eller regler som kontrollerar om begäranden har markerats som avbokningsbara två gånger.

OgiltigBegäranOmLokalÅtkomst

Regeln InvalidReqAccessLocal anger att lokalt skapade begäranden inte nås när de har slutförts eller avbrutits. Den här regeln kan överlappa med andra regler, till exempel regler som kontrollerar om det finns dubbel slutförande, eller regler som kontrollerar om begäranden har markerats som avbrutna två gånger.

IoctlReqs

IoctlReqs-regeln anger att IOCTL-begäranden inte får skickas till olämplig KMDF-begäran eller skicka enhetsdrivrutinsgränssnitt (DDIs).

MarkCancOnCancReqLocal

MarkCancOnCancReqLocal-regeln anger att metoden WdfRequestMarkCancelable inte kan anropas två gånger i följd på samma I/O-begäran.

NoIoQueuePurgeSynchronously

NoIoQueuePurgeSynchronously-regeln verifierar att WDF-drivrutiner inte anropar WdfIoQueueStopSynchronously, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurgeSynchronously eller WdfIoQueuePurgeSynchronously från någon av följande händelseåteranropsfunktioner för EvtIO-köobjekt:

OutputBufferAPI

OutputBufferAPI-regeln anger att rätt DDI:er för bufferthämtning används i återanropsfunktionen EvtIoWrite. I återanropsfunktionen EvtIoWrite kan inte följande DDI:er anropas för bufferthämtning:

ReadReqs

ReadReqs-regeln anger att läsbegäranden inte skickas till olämpliga KMDF-metoder.

ReqCompletionRoutine

ReqCompletionRoutine-regeln anger att en slutföranderutin måste anges innan en begäran skickas till ett I/O-mål.

ReqDelete

ReqDelete-regeln anger att begäranden som skapats av drivrutinen inte skickas till WdfRequestCompleteXxx-funktioner. I stället bör begäran tas bort när den är klar.

ReqIsCancOnCancReq

ReqIsCancOnCancReq-regeln anger att metoden WdfRequestIsCanceled endast kan anropas på en begäran som inte har markerats som avbruten.

ReqMarkCancelableSend

ReqMarkCancelableSend-regeln anger att begäranden som vidarebefordras av drivrutinen inte markeras som avbrytbara genom att anropa WdfRequestMarkCancelable.

RequestCompleted

Regeln DeferredRequestCompleted anger att för en icke-filterdrivrutin måste varje begäran som presenteras för drivrutinens standard-I/O-kö slutföras, såvida inte begäran skjuts upp eller vidarebefordras, eller om WdfRequestStopAcknowledge anropas.

BegäranFormateradGodkänd

Regeln RequestFormattedValid anger att drivrutinen formaterar alla begäranden, förutom en WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET begäran, innan den skickar dem till ett I/O-mål.

RequestGetStatusValid

RequestGetStatusValid-regeln som anger att WdfRequestGetStatus ska anropas för en begäran i någon av följande situationer:

  • När WdfRequestSend returnerar fel.
  • När begäran har skickats med WDF_REQUEST_SEND_OPTION_SYNCHRONOUS.

RequestSendAndForgetNoFormatting

Regeln RequestSendAndForgetNoFormatting verifierar att drivrutinen inte formaterar en begäran med hjälp av I/O-målformateringsfunktionerna innan den skickas till ett I/O-mål med sändningsalternativet WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

RequestSendAndForgetNoFormatting2

RequestSendAndForgetNoFormatting2-regeln verifierar att drivrutinen inte formaterar en begäran med hjälp av I/O-målformateringsfunktionerna innan den skickas till ett I/O-mål med sändningsalternativet WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

StopAckWithinEvtIoStop

Regeln StopAckWithinEvtIoStop anger att funktionen WdfRequestStopAcknowledge endast anropas inifrån funktionen EvtIoStop callback.

WdfIoQueueFindRequestFailed

WdfIoQueueFindRequestFailed-regeln anger att WdfIoQueueRetrieveFoundRequest eller WdfObjectDereference endast ska anropas efter att WdfIoQueueFindRequestFailed returnerar STATUS_SUCCESS.

WdfIoQueueRetrieveFoundRequest

WdfIoQueueRetrieveFoundRequest-regeln anger att metoden WdfIoQueueRetrieveFoundRequest anropas först efter att WdfIoQueueFindRequest anropas och returneras STATUS_SUCCESS och ingen WdfObjectDereference anropas på samma begäran.

WdfIoQueueRetrieveNextRequest

WdfIoQueueRetrieveNextRequest-regeln anger att WdfIoQueueRetrieveNextRequest inte anropas efter att WdfIoQueueFindRequest anropats.

WriteReqs

WriteReqs-regeln anger att en skrivbegäran inte skickas till olämpliga KMDF-metoder.

Så här väljer du regeluppsättningen RequestProcessing

  1. Välj drivrutinsprojektet (.vcxProj) i Microsoft Visual Studio. På drivrutinsmenyn klickar du på Starta kontrollant för statisk drivrutin....

  2. Klicka på fliken Regler . Under Regeluppsättningar väljer du RequestProcessing.

    Om du vill välja standardregeluppsättningen från ett kommandotolkfönster för Visual Studio-utvecklare anger du RequestProcessing.sdv med alternativet /check . Till exempel:

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

    För mer information, se Användning av statisk drivrutinsverifierare för att hitta defekter i drivrutiner och Statisk drivrutinsverifierare-kommandon (MSBuild).