IrpProcessing Rule Set (WDM)

Verwenden Sie diese Regeln, um zu überprüfen, ob Ihr Treiber E/A-Anforderungspakete (IRP) ordnungsgemäß verarbeitet.

In diesem Abschnitt

Thema BESCHREIBUNG

CompleteRequest

Die CompleteRequest-Regel überprüft, ob die IoCompleteRequest-Routine nicht aufgerufen wird, nachdem eine Vervollständigungsroutine ausgeführt wurde, und dass sie keine STATUS_MORE_PROCESSING_REQUIRED zurückgibt.

CompleteRequestStatusCheck

Die CompleteRequestStatusCheck-Regel überprüft, ob der E/A-status-Wert in der IRP mit dem vom unteren Treiber zurückgegebenen status Wert übereinstimmt.

CompletionRoutineRegistered

Die CompletionRoutineRegistered-Regel gibt an, dass die Dispatchroutine danach IoCallDriver oder PoCallDriver aufrufen muss, wenn die Dispatchroutine Eine IoCompletion-Routine mithilfe von IoSetCompletionRoutineEx registriert.

DoubleCompletion

Die DoubleCompletion-Regel (WDM) gibt an, dass der Treiber die IoCompleteRequest-Routine nicht zweimal für dieselbe IRP aufrufen darf.

IoReuseIrp

Die IoReuseIrp-Regel gibt an, dass ein Treiber IoReuseIrp nur für IRPs verwenden soll, die er zuvor IoAllocateIrp zugeordnet hat.

IoReuseIrp2

Die IoReuseIrp2-Regel gibt an, dass ein Treiber IoReuseIrp nur für IRPs verwenden soll, die er zuvor im Treiber zugeordnet hat.

IoSetCompletionExCompleteIrp

Die IoSetCompletionExCompleteIrp-Regel gibt an, dass die IoSetCompletionRoutineEx-Routine einen NTSTATUS-Wert zurückgibt. Der Treiber muss diesen Wert überprüfen, um festzustellen, ob die IoCompletion-Routine vor dem Aufrufen von IoCallDriver oder PoCallDriver erfolgreich registriert wurde. Wenn IoSetCompletionRoutineEx fehlschlägt, sollte die IRP abgeschlossen sein, und die Dispatchroutine sollte zurückkehren.

IoSetCompletionRoutineExCheck

Die IoSetCompletionRoutineExCheck-Regel gibt an, dass die IoSetCompletionRoutineEx-Routine einen NTSTATUS-Wert zurückgibt. Der Treiber muss diesen Wert überprüfen, um festzustellen, ob die IoCompletion-Routine erfolgreich registriert wurde, bevor IoCallDriver oder PoCallDriver aufgerufen wird.

IoSetCompletionRoutineExCheckDeviceObject

Die IoSetCompletionRoutineExCheckDeviceObject-Regel gibt an, dass, wenn das aktuelle Geräteobjekt nicht an IoSetCompletionRoutineEx übergeben wird und das niedrigere Geräteobjekt ist, dies zu einer Racebedingung führen kann, bei der das aktuelle Geräteobjekt entladen werden kann, obwohl die Vervollständigungsroutine nicht ausgeführt wurde.

IoSetCompletionRoutineNonPnpDriver

Die IoSetCompletionRoutineNonPnpDriver-Regel gibt an, dass Treiber, die keine PnP-Treiber sind, IoSetCompletionRoutineEx und nicht IoSetCompletionRoutine verwenden sollten.

IrpCancelField

Die IrpCancelField-Regel gibt an, dass der Treiber den Wert des Irp-Cancel-Members> überprüft, wenn er eine Abbruchroutine für ein IRP festlegt, das er geschrieben hat.

IrpProcessingComplete

Die IrpProcessingComplete-Regel gibt an, dass die IRP entweder vom Treiber selbst oder von einem Treiber auf niedrigerer Ebene abgeschlossen worden sein muss, wenn eine Dispatchroutine STATUS_SUCCESS zurückgibt.

LowerDriverReturn

Die LowerDriverReturn-Regel gibt an, dass der Treiber nach der Verwendung von PoCallDriver oder IoCallDriver zum Aufrufen eines niedrigeren Treibers die Rückgabe status aus dem Anruf speichert und die zurückgegebene status an die Dispatchroutine übergibt.

SignalEventInCompletion

Die SignalEventInCompletion-Regel gibt an, dass der Treiber bei der Verarbeitung eines asynchronen IRP das KeSetEvent in der Vervollständigungsroutine aufrufen muss, wenn das Irp-PendingReturned-Flag> festgelegt ist.

SignalEventInCompletion2

Die SignalEventInCompletion2-Regel gibt an, dass der Treiber bei der Verarbeitung eines asynchronen IRP das KeSetEvent in der Vervollständigungsroutine aufrufen muss, wenn das Irp-PendingReturned-Flag> festgelegt ist.

SignalEventInCompletion3

Die SignalEventInCompletion3-Regel gibt an, dass der Treiber bei der Verarbeitung eines asynchronen IRP das KeSetEvent in der Vervollständigungsroutine aufrufen muss, wenn das Irp-PendingReturned-Flag> festgelegt ist.

StartIoCancel

Die StartIoCancel-Regel gibt an, dass der Treiber IoSetStartIoAttributes nicht aufrufen darf, wobei der NonCancelable-Parameter auf FALSE festgelegt ist, bevor IoSetCancelRoutine mit einer Cancel-Routine ohne NULL aufgerufen wird.

StartIoRecursion

Die StartIoRecursion-Regel gibt an, dass, wenn die StartIo-Routine eines Treibers einen Aufruf von IoStartNextPacket enthält, der Treiber zuerst IoSetStartIoAttributes aufrufen muss, wobei das DeferredStartIo-Attribut auf TRUE festgelegt ist. Andernfalls kann es zu unendlicher Rekursion führen.

PnpRemove

Die PnpRemove-Regel gibt an, dass der Treiber IRP_MN_SURPRISE_REMOVAL-, IRP_MN_CANCEL_REMOVE_DEVICE-, IRP_MN_CANCEL_STOP_DEVICE- oder IRP_MN_REMOVE_DEVICE-Anforderungen mit einem Fehler nicht abschließen kann.

PnpSurpriseRemove

Die PnpSurpriseRemove-Regel gibt an, dass der Treiber bei der Verarbeitung einer IRP_MN_SURPRISE_REMOVAL Anforderung nicht IoDeleteDevice oder IoDetachDevice aufruft.

PowerDownAllocate

Die PowerDownAllocate-Regel gibt an, dass ein FDO- und FIDO-Treiber beim Verarbeiten einer IRP_MN_SET_POWER Anforderung für einen SystemPowerState-Übergang von s0 auf [S1... S5].

PowerDownFail

Die PowerDownFail-Regel gibt an, dass ein FDO- oder FIDO-Treiber eine IRP_MN_SET_POWER Anforderung nicht fehlschlagen darf, wenn das Gerät heruntergefahren wird. Diese Regel gilt nur für FDO- und FIDO-Treiber.

PowerIrpDDIs

Die PowerIrpDDIs-Regel gibt an, dass ein Treiber bei der Verarbeitung eines Systems oder eines Geräts, das mit IRP_MN_SET_POWER IRP_MJ_POWER, keine DDIs aufrufen soll, die nur bei PASSIVE_LEVEL aufgerufen werden können.

PowerUpFail

Die PowerUpFail-Regel gibt an, dass ein FDO- oder FIDO-Treiber keine IRP_MN_SET_POWER-Anforderung fehlschlagen darf, wenn das Gerät hochfahren wird.

PnpIrpCompletion

Die PnpIrpCompletion-Regel überprüft, ob ein FDO-Treiber PnP-IRPs an den unteren Treiber übergibt.

WmiComplete

Die WmiComplete-Regel gibt an, dass der Treiber bei der Verarbeitung eines WMI-Neben-IRPIoCompleteRequest aufruft, bevor er von der DispatchSystemControl-Routine zurückkehrt.

WmiForward

Die WmiForward-Regel gibt an, dass der Treiber WMI-Neben-IRPs weiterleiten muss, wenn eine Weiterleitung erforderlich ist.

So wählen Sie den IrpProcessing-Regelsatz aus

  1. Wählen Sie Ihr Treiberprojekt (.vcxProj) in Microsoft Visual Studio aus. Klicken Sie im Menü Treiber auf Statische Treiberüberprüfung starten....

  2. Klicken Sie auf die Registerkarte Regeln . Wählen Sie unter Regelsätzedie Option IrpProcessing aus.

    Um den Standardregelsatz in einem Visual Studio-Entwicklereingabeaufforderungsfenster auszuwählen, geben Sie IrpProcessing.sdv mit der Option /check an . Beispiel:

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

    Weitere Informationen finden Sie unter Using Static Driver Verifier to Find Defects in Drivers and Static Driver Verifier commands (MSBuild).