Driver-Managed IRP-Warteschlangen

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

Die meisten Gerätetreiber rufen die E/A-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äteobjekt schneller eingehen, als der Treiber sie bis zum Abschluss verarbeiten kann. Bei dieser Technik werden IRPs in die Warteschlange einer vom Treiber bereitgestellten StartIo-Routine eingereiht.

Für eine gute Leistung übergeben die meisten fortgeschrittene Treiber IRPs einfach so schnell an niedrigere Treiber, wie sie kommen, sodass zwischengeschaltete Treiber fast nie die Gerätewarteschlangen verwenden, die ihren jeweiligen Geräteobjekten zugeordnet sind.

Sie können jedoch einen Treiber zum Verwalten interner WARTESCHLANGEN von IRPs entwerfen, indem Sie eine oder mehrere Gerätewarteschlangen, ineinander verschachtelte Warteschlangen oder abbruchsichere Warteschlangen explizit einrichten. Dieser Ansatz kann besonders nützlich sein, wenn der Treiber ein Gerät steuert, das E/A-Vorgänge überlappt. Bei einem solchen Gerät kann es schwierig sein, die gleichzeitige Verarbeitung von zwei oder mehr IRPs für dasselbe Zielgerätobjekt mit nur einer einzelnen Warteschlange zu verwalten.

Die einfachste Möglichkeit zum Erstellen einer internen Warteschlange ist die Verwendung des abbruchsicheren IRP-Warteschlangenframeworks. 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 sowie das Sperren und Entsperren Ihrer Warteschlange behandeln. Das abbruchsichere IRP-Warteschlangenframework stellt die Routinen IoCsqInsertIrp, IoCsqRemoveIrp und IoCsqRemoveNextIrp bereit, die die Rückrufroutinen automatisch verwenden, um IRPs sicher einzufügen und aus der Warteschlange des Treibers zu entfernen. Das System verwendet auch Ihre Rückrufroutinen, um alle abgebrochenen IRPs sicher zu entfernen.

Sie können auch zusätzliche Warteschlangen für IRPs im Treiber eines Gerätecontrollers für eine Reihe heterogener physischer Geräte einrichten. Der SCSI-Porttreiber verwendet beispielsweise Gerätewarteschlangenobjekte für interne Warteschlangen. Dieser Treiber verfügt sowohl über eine StartIo-Routine und richtet Gerätewarteschlangenobjekte als zusätzliche Warteschlangen ein, zusätzlich zur Gerätewarteschlange, die dem Geräteobjekt zugeordnet ist, das er erstellt, um einen HBA darzustellen. Der SCSI-Porttreiber verwendet seine zusätzlichen Gerätewarteschlangen, um IRPs zu halten, die für bestimmte logische Einheiten auf den HBA-gesteuerten SCSI-Bus(n) gebunden sind.

Der System-Diskettencontrollertreiber ist ein Beispiel für einen Treiber, der über keine StartIo-Routine verfügt und eine ineinander verriegelte Warteschlange verwendet. Dieser Treiber richtet eine doppelt verknüpfte ineinandergreifende Warteschlange ein, in die und aus der der Treiber und sein dedizierter Gerätethread 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 verzahnten Warteschlangen. Treiber für Windows XP und höhere Versionen von Windows können abbruchsichere IRP-Warteschlangen verwenden, um IRP-Warteschlangen zu verarbeiten.

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 ineinander verschachtelten Warteschlangen

Verwalten von ineinandergreifenden Warteschlangen mit einem Driver-Created Thread

Abbruchsichere IRP-Warteschlangen