Freigeben über


Driver-Managed IRP-Warteschlangen

Mit Ausnahme von Dateisystemtreibern ordnet der E/A-Manager jedem Geräteobjekt, das ein Treiber erstellt, ein Gerätewarteschlangenobjekt zur Warteschlangenbildung von IRPs zu.

Die meisten Gerätetreiber rufen die Supportroutinen des E/A-Managers auf, um die zugeordnete Gerätewarteschlange zu verwenden, die IRPs enthält, wenn Geräte-E/A-Anforderungen für ein Zielgerätobjekt schneller eingehen, als der Treiber sie zum Abschluss verarbeiten kann. Mit dieser Technik werden IRPs in die Warteschlange einer vom Treiber bereitgestellten StartIo-Routine eingereiht.

Um eine gute Performance zu gewährleisten, übergeben die meisten Zwischentreiber die IRPs so schnell wie möglich an niedrigere Treiber, sodass Zwischentreiber die Gerätewarteschlangen, die ihren jeweiligen Geräteobjekten zugeordnet sind, so gut wie nie verwenden.

Sie können jedoch einen Treiber so entwerfen, dass interne IRPs-Warteschlangen verwaltet werden, indem Sie eine oder mehrere Gerätewarteschlangen, versperrte Warteschlangen oder abbruchsichere Warteschlangen explizit einrichten. Dieser Ansatz kann besonders hilfreich sein, wenn der Treiber ein Gerät steuert, das E/A-Vorgänge überlappt. Für ein solches Gerät kann es schwierig sein, die gleichzeitige Verarbeitung von zwei oder mehr IRPs für dasselbe Zielgerätobjekt nur mit einer einzigen Warteschlange zu verwalten.

Die einfachste Möglichkeit zum Erstellen einer internen Warteschlange besteht darin, das abbruchsichere IRP-Warteschlangenframework zu verwenden. Sie können den Warteschlangenmechanismus Ihrer Wahl in Ihrem Treiber implementieren. Anschließend können Sie IoCsqInitialize verwenden, um eine Reihe von Rückrufroutinen zu registrieren, die das Einfügen und Löschen von IRP behandeln, sowie das Sperren und Entsperren Ihrer Warteschlange. Das IRP-Warteschlangenframework bietet "Cancel-Safe", welches die Routinen IoCsqInsertIrp, IoCsqRemoveIrp und IoCsqRemoveNextIrp umfasst. Diese Routinen verwenden automatisch die Rückruffunktionen, um IRPs sicher in die Warteschlange des Treibers einzufügen und daraus zu entfernen. Das System verwendet auch Ihre Rückruf-Routinen, um alle IRPs, die abgebrochen werden, sicher zu entfernen.

Sie können sich auch dafür entscheiden, zusätzliche Warteschlangen für IRPs im Treiber eines Gerätecontrollers für eine Reihe heterogener physischer Geräte einzurichten. Beispielsweise verwendet der SCSI-Porttreiber Gerätewarteschlangenobjekte für interne Warteschlangen. Dieser Treiber verfügt sowohl über eine StartIo-Routine als auch über Gerätewarteschlangenobjekte, die als ergänzende Warteschlangen eingerichtet werden. Diese werden zusätzlich zu der Gerätewarteschlange verwendet, die dem von ihm erstellten Geräteobjekt zugeordnet ist, um ein HBA darzustellen. Der SCSI-Porttreiber verwendet seine zusätzlichen Gerätewarteschlangen, um IRPs für bestimmte logische Einheiten auf dem von HBA gesteuerten SCSI-Bus(sen) zu verwalten.

Der System-Diskettencontrollertreiber ist ein Beispiel für einen Treiber, der keine StartIo-Routine aufweist und eine verriegelte Warteschlange verwendet. Dieser Treiber richtet eine doppelt verkettete, verriegelte Warteschlange ein, in die und aus der der Treiber und sein gerätededizierter Thread IRPs einfügen und entfernen.

Der Kernel definiert den Objekttyp der Gerätewarteschlange. Die Komponente "Executive Support" bietet Routinen zum Einfügen und Entfernen von IRPs in verriegelten Warteschlangen. Treiber für Windows XP und spätere Versionen von Windows können abbruchsichere IRP-Warteschlangen verwenden, um IRP-Anfragen zu verwalten.

In den folgenden Abschnitten wird erläutert, wie Gerätewarteschlangen, verriegelte Warteschlangen und abbruchsichere Warteschlangen verwendet werden:

Einrichten und Verwenden von Gerätewarteschlangen

Verwalten von Gerätewarteschlangen

Einrichten und Verwenden von verriegelten Warteschlangen

Verwaltung von verknüpften Warteschlangen mit einem Driver-Created-Thread

Cancel-Safe IRP-Warteschlangen