Halten eingehender IRPs, wenn ein Gerät angehalten wird

Die Treiber für ein Gerät müssen das Gerät anhalten, wenn die Ressourcen neu ausgeglichen werden. Während des Ressourcenausgleichs halten einige Treiber das Gerät als Reaktion auf eine IRP_MN_QUERY_STOP_DEVICE-Anforderung an, und andere Treiber verzögern das Anhalten des Geräts, bis sie die IRP_MN_STOP_DEVICE-Anforderung erhalten. In beiden Fällen muss das Gerät angehalten werden, wenn die IRP_MN_STOP_DEVICE erfolgreich ist.

Die Treiber müssen alle irPs beenden, die auf dem Gerät ausgeführt werden, und keine neuen IRPs starten, die Zugriff auf das Gerät erfordern.

Um IRPs zu speichern, während ein Gerät angehalten wird, implementiert ein Treiber eine Prozedur wie die folgende:

  1. Definieren Sie in der AddDevice-Routine ein Flag in der Geräteerweiterung mit einem Namen wie HOLD_NEW_REQUESTS. Löschen Sie das Flag.

  2. Erstellen Sie eine FIFO-Warteschlange zum Speichern von IRPs.

    Wenn der Treiber bereits IRPs in die Warteschlange stellt, kann er dieselbe Warteschlange wiederverwenden, da der Treiber alle ausstehenden Anforderungen abschließen muss, bevor er das Gerät anhält.

    Wenn der Treiber nicht bereits über eine IRP-Warteschlange verfügt, muss er eine in seiner AddDevice-Routine erstellen. Welche Art von Warteschlange erstellt wird, hängt davon ab, wie der Treiber die Warteschlange leert. Ein Treiber kann eine ineinander verschachtelte, doppelt verknüpfte Liste und die ExInterlockedXxxList-Routinen verwenden.

  3. Beenden Sie im DispatchPnP-Code für IRP_MN_QUERY_STOP_DEVICE (oder IRP_MN_STOP_DEVICE) alle ausstehenden Anforderungen, und legen Sie das HOLD_NEW_REQUESTS-Flag fest.

  4. Überprüfen Sie in einer Dispatchroutine, die auf das Gerät zugreift, z. B. DispatchWrite oder DispatchRead, ob das HOLD_NEW_REQUESTS-Flag festgelegt ist. Wenn ja, muss der Treiber die ausstehende IRP markieren und in eine Warteschlange stellen.

    Die DispatchPnP-Routine des Treibers muss weiterhin PnP-IRPs verarbeiten, anstatt sie zu halten, und die DispatchPower-Routine muss weiterhin Power IRPs verarbeiten.

  5. Deaktivieren Sie in DispatchPnP als Reaktion auf ein Start- oder Cancel-Stop-IRP das Flag HOLD_NEW_REQUESTS, und starten Sie die IRPs in der IRP-Warteschlange.

    Diese Aktionen sind wahrscheinlich die letzten Schritte für die Verarbeitung dieser PnP-IRPs. Beispielsweise muss der Treiber als Reaktion auf eine Start-IRP zuerst alle Vorgänge ausführen, um das Gerät zu starten, und dann kann er die IRPs in der IRP-Warteschlange starten.

    Fehler bei der Verarbeitung von IRPs aus der IRP-Warteschlange wirken sich nicht auf die status aus, die für die START- oder Cancel-Stop-IRPs zurückgegeben werden.