Sdílet prostřednictvím


Sada pravidel „RequestProcessing“ (KMDF)

Pomocí těchto pravidel ověřte, že ovladač správně dokončí nebo zruší pakety požadavků na vstupně-výstupní operace (IRP).

V této části

Téma Popis

ChangeQueueState

Pravidlo ChangeQueueState určuje, že se ovladač WDF nepokusí změnit stav fronty ze souběžných vláken ani nevolá DDI měnící stav postupně z jednoho vlákna. Funkce zpětného volání změny stavu fronty jsou WdfIoQueueStop, WdfIoQueueStopSynchronously, WdfIoQueuePurge, WdfIoQueuePurgeSynchronously, WdfIoQueueDrain, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurge a WdfIoQueueStopAndPurgeSynchronously. Pokud jsou tyto DDI volány, když již probíhá změna stavu fronty, může to způsobit chybové ukončení počítače nebo jeho nereagování.

CompleteCanceledReq

Pravidlo CompleteCanceledReq určuje, že pokud již byl požadavek zrušen, požadavek již není platný a ovladač by ho neměl dokončit. Při znovu označení žádosti, která byla dříve označena jako zrušitelná, musí ovladač zkontrolovat, že žádost ještě nebyla zrušena. Pokud ovladač tuto kontrolu neprovede, může ovladač dokončit žádost, která byla uvolněna.

DoubleCompletion

Pravidlo DoubleCompletion určuje, že ovladače nesmí dokončit vstupně-výstupní požadavek dvakrát. Následující metody by neměly být volána dvakrát v řádku pro stejný požadavek: WdfRequestComplete, WdfRequestCompleteWithInformation, WdfRequestCompleteWithPriorityBoost.

DoubleCompletionLocal

Pravidlo DoubleCompletionLocal určuje, že ovladače nesmí dokončit vstupně-výstupní požadavek dvakrát.

EvtIoStopCancel

Pravidlo EvtIoStopCancel určuje, že v rámci funkce zpětného volání EvtIoStop ovladač volá jednu z následujících metod pro vstupně-výstupní požadavky, které nelze zrušit.

EvtIoStopCompleteOrStopAck

Pravidlo EvtIoStopCompleteOrStopAck určuje, že v rámci funkce zpětného volání EvtIoStop ovladač volá jednu z následujících metod pro každý vstupně-výstupní požadavek, který je prezentován rozhraním. Pokud to neuděláte, ovladač může systému zablokovat vstup do jiného nižšího stavu napájení.

EvtSurpriseRemoveNoSuspendQueue

Pravidlo EvtSurpriseRemoveNoSuspendQueue určuje, že ovladače WDF by neměly vypustit, zastavit nebo vyprázdnit frontu pomocí funkce zpětného volání EvtDeviceSurpriseRemoval. Místo toho by se měly používat zpětné volací funkce V/V, které jsou řízeny samostatně. Funkce zpětného volání EvtDeviceSurpriseRemoval není synchronizovaná s cestou vypínání.

KonfigurovánSouborovýObjekt

Pravidlo FileObjectConfigured určuje, že volání metody WdfRequestGetFileObject předchází volání WdfDeviceInitSetFileObjectConfig.

InternalIoctlReqs

Pravidlo InternalIoctlReqs určuje, že interní požadavky IOCTL nejsou předány nevhodným rozhraním pro odesílání požadavků ovladačů zařízení (DDI) používaných KMDF.

InvalidReqAccess

Pravidlo InvalidReqAccess určuje, že po dokončení nebo zrušení nebudou požadavky přístupné. Toto pravidlo se může překrývat s jinými pravidly, jako jsou pravidla, která kontrolují dvojité dokončení, nebo pravidla, která kontrolují požadavky označené dvakrát jako stornovatelné.

InvalidReqAccessLocal

Pravidlo InvalidReqAccessLocal určuje, že po dokončení nebo zrušení nejsou místně vytvořené požadavky přístupné. Toto pravidlo se může překrývat s jinými pravidly, například s pravidly, která kontrolují dvojí dokončení, nebo s pravidly, která kontrolují, zda nebyly požadavky dvakrát označeny jako zrušitelné.

IoctlReqs

Pravidlo IoctlReqs určuje, že požadavky IOCTL nesmí být předány nevhodným požadavkům KMDF nebo odesílat rozhraní ovladačů zařízení (DDI).

MarkCancOnCancReqLocal

Pravidlo MarkCancOnCancReqLocal určuje, že metoda WdfRequestMarkCancelable nemůže být volána dvakrát po sobě na stejném V/V požadavku.

NoIoQueuePurgeSynchronously

Pravidlo NoIoQueuePurgeSynchronously ověřuje, že ovladače WDF nevolají funkce WdfIoQueueStopSynchronously, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurgeSynchronously nebo WdfIoQueuePurgeSynchronously z následujících objektových funkcí zpětného volání události fronty EvtIO:

OutputBufferAPI

Pravidlo OutputBufferAPI určuje, že správné identifikátory DDI pro načítání vyrovnávací paměti se používají ve funkci zpětného volání EvtIoWrite . V rámci funkce zpětného volání EvtIoWrite nelze pro načtení obsahu vyrovnávací paměti volat následující DDIs:

ReadReqs

Pravidlo ReadReqs určuje, že požadavky na čtení nejsou předány nevhodným metodám KMDF.

ReqCompletionRoutine

Pravidlo ReqCompletionRoutine určuje, že rutina dokončení musí být nastavena před odesláním požadavku do V/V cíle.

ReqDelete

Pravidlo ReqDelete určuje, že žádosti vytvořené ovladačem nejsou předány funkcím WdfRequestCompleteXxx . Místo toho by se žádost měla po dokončení odstranit.

ReqIsCancOnCancReq

Pravidlo ReqIsCancOnCancReq určuje, že metodu WdfRequestIsCanceled lze volat pouze v požadavku, který není označen jako stornoovatelný.

ReqMarkCancelableSend

Pravidlo ReqMarkCancelableSend určuje, že požadavky předávané ovladačem nejsou označené jako stornoovatelné voláním WdfRequestMarkCancelable.

RequestCompleted

Pravidlo DeferredRequestCompleted určuje, že pro nefiltrovaný ovladač musí být každý požadavek předaný výchozí vstupně-výstupní frontě ovladače dokončen, pokud není žádost odložena nebo předána, nebo pokud je volána WdfRequestStopAcknowledge .

RequestFormattedValid

Pravidlo RequestFormattedValid určuje, že ovladač formátuje všechny požadavky s výjimkou požadavku WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET před jejich odesláním do V/V cíle.

RequestGetStatusValid

Pravidlo RequestGetStatusValid, které specifikuje, že funkce WdfRequestGetStatus by měla být volána pro požadavek v jedné z následujících situací:

  • Když WdfRequestSend vrátí chybu.
  • Po odeslání požadavku s WDF_REQUEST_SEND_OPTION_SYNCHRONOUS.

RequestSendAndForgetNoFormatting

Pravidlo RequestSendAndForgetNoFormatting ověřuje, že ovladač neformátuje požadavek pomocí funkcí formátování I/O cíle před odesláním do cíli I/O s možností odeslání WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

RequestSendAndForgetNoFormatting2

Pravidlo RequestSendAndForgetNoFormatting2 ověřuje, že ovladač neformátuje žádost pomocí funkce formátování vstupně-výstupního cíle před jejím odesláním do vstupně-výstupního cíle s možností WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

StopAckWithinEvtIoStop

Pravidlo StopAckWithinEvtIoStop určuje, že funkce WdfRequestStopAcknowledge je volána pouze z evtIoStop callback function.

WdfIoQueueFindRequestFailed

Pravidlo WdfIoQueueFindRequestFailed určuje, že WdfIoQueueRetrieveFoundRequest nebo WdfObjectDereference by mělo být volána pouze poté, co WdfIoQueueFindRequestFailed vrátí STATUS_SUCCESS.

WdfIoQueueRetrieveFoundRequest

Pravidlo WdfIoQueueRetrieveFoundRequest určuje, že WdfIoQueueRetrieveFoundRequest metoda je volána pouze poté, co WdfIoQueueFindRequest je volán a vrácen STATUS_SUCCESS a žádný WdfObjectDereference se volá na stejném požadavku.

WdfIoQueueRetrieveNextRequest

Pravidlo WdfIoQueueRetrieveNextRequest určuje, že WdfIoQueueRetrieveNextRequest není volán po zavolání WdfIoQueueFindRequest .

WriteReqs

Pravidlo WriteReqs určuje, že požadavek na zápis není předán nevhodným metodám KMDF.

Výběr sady pravidel RequestProcessing

  1. Vyberte projekt ovladače (.vcxProj) v aplikaci Microsoft Visual Studio. V nabídce Ovladač klepněte na Spustit statický ověřovatel ovladače....

  2. Klikněte na kartu Pravidla . V části Sady pravidel vyberte RequestProcessing.

    Pokud chcete vybrat výchozí sadu pravidel z okna příkazového řádku vývojáře sady Visual Studio, zadejte RequestProcessing.sdv s možností /check . Například:

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

    Další informace naleznete v tématu Použití statického ověřovače ovladačů k nalezení vad v ovladačích a příkazy MSBuild (Statický ověřovač ovladačů).