Share via


Geräteknoten und Gerätestapel

In Windows werden Geräte durch Geräteknoten in der Plug & Play(PnP)-Gerätestruktur dargestellt. Wenn eine E/A-Anforderung an ein Gerät gesendet wird, helfen in der Regel mehrere Treiber bei der Verarbeitung der Anforderung. Jeder dieser Treiber ist einem Geräteobjekt zugeordnet, und die Geräteobjekte sind in einem Stapel angeordnet. Die Reihenfolge der Geräteobjekte zusammen mit den zugehörigen Treibern wird als Gerätestapel bezeichnet. Jeder Geräteknoten verfügt über einen eigenen Gerätestapel.

Geräteknoten und die Plug & Play Gerätestruktur

Windows organisiert Geräte in einer Struktur, die als Plug & Play Gerätestruktur oder einfach die Gerätestruktur bezeichnet wird. In der Regel stellt ein Knoten in der Gerätestruktur entweder ein Gerät oder eine einzelne Funktion auf einem zusammengesetzten Gerät dar. Einige Knoten stellen jedoch Softwarekomponenten dar, die keine Zuordnung zu physischen Geräten aufweisen.

Ein Knoten in der Gerätestruktur wird als Geräteknoten bezeichnet. Der Stammknoten der Gerätestruktur wird als Stammgeräteknoten bezeichnet. Gemäß der Konvention wird der Knoten des Stammgeräts am unteren Rand der Gerätestruktur gezeichnet, wie im folgenden Diagramm dargestellt.

Diagramm der Gerätestruktur mit Geräteknoten

Die Gerätestruktur veranschaulicht die übergeordneten/untergeordneten Beziehungen, die in der PnP-Umgebung inhärent sind. Mehrere Knoten in der Gerätestruktur stellen Busse dar, mit denen untergeordnete Geräte verbunden sind. Der PCI Bus-Knoten stellt beispielsweise den physischen PCI-Bus auf der Hauptplatine dar. Beim Start fordert der PnP-Manager den PCI-Bustreiber auf, die Geräte aufzulisten, die mit dem PCI-Bus verbunden sind. Diese Geräte werden durch untergeordnete Knoten des PCI Bus-Knotens dargestellt. Im vorherigen Diagramm verfügt der PCI-Busknoten über untergeordnete Knoten für mehrere Geräte, die mit dem PCI-Bus verbunden sind, einschließlich USB-Hostcontrollern, einem Audiocontroller und einem PCI-Express-Port.

Einige der Geräte, die mit dem PCI-Bus verbunden sind, sind Busse selbst. Der PnP-Manager fordert jeden dieser Busse auf, die Geräte aufzulisten, die mit diesem verbunden sind. Im vorherigen Diagramm sehen Wir, dass es sich bei dem Audiocontroller um einen Bus handelt, an den ein Audiogerät angeschlossen ist. Wir können sehen, dass es sich beim PCI Express-Port um einen Bus handelt, an dem ein Anzeigeadapter angeschlossen ist, und der Grafikkarte ist ein Bus, an dem ein Monitor angeschlossen ist.

Ob Sie sich einen Knoten als Darstellung eines Geräts oder eines Busses vorstellen, hängt von Ihrem Standpunkt ab. Beispielsweise können Sie sich die Grafikkarte als ein Gerät vorstellen, das eine wichtige Rolle beim Vorbereiten von Frames spielt, die auf dem Bildschirm angezeigt werden. Sie können sich den Grafikkarten jedoch auch als einen Bus vorstellen, der in der Lage ist, verbundene Monitore zu erkennen und aufzulisten.

Geräteobjekte und Gerätestapel

Ein Geräteobjekt ist ein instance einer DEVICE_OBJECT-Struktur. Jeder Geräteknoten in der PnP-Gerätestruktur verfügt über eine geordnete Liste von Geräteobjekten, und jedes dieser Geräteobjekte ist einem Treiber zugeordnet. Die sortierte Liste der Geräteobjekte wird zusammen mit den zugehörigen Treibern als Gerätestapel für den Geräteknoten bezeichnet.

Sie können sich einen Gerätestapel auf verschiedene Arten vorstellen. Im formalsten Sinne ist ein Gerätestapel eine geordnete Liste von Paaren (Geräteobjekt, Treiber). In bestimmten Kontexten kann es jedoch nützlich sein, sich den Gerätestapel als eine geordnete Liste von Geräteobjekten vorzudenken. In anderen Kontexten kann es hilfreich sein, sich den Gerätestapel als eine geordnete Liste von Treibern zu vorstellen.

Gemäß der Konvention verfügt ein Gerätestapel über eine Ober- und eine Unterseite. Das erste Geräteobjekt, das im Gerätestapel erstellt werden soll, befindet sich unten, und das letzte Geräteobjekt, das erstellt und an den Gerätestapel angefügt werden soll, befindet sich oben.

Im folgenden Diagramm verfügt der Proseware Gizmo-Geräteknoten über einen Gerätestapel, der drei (Geräteobjekt, Treiber) Paare enthält. Das oberste Geräteobjekt ist dem Treiber AfterThought.sys zugeordnet, das mittlere Geräteobjekt dem Treiber Proseware.sys und das untere Geräteobjekt dem Treiber Pci.sys zugeordnet. Der PCI Bus-Knoten in der Mitte des Diagramms verfügt über einen Gerätestapel, der zwei Paare (Geräteobjekt, Treiber) enthält : ein Geräteobjekt, das Pci.sys zugeordnet ist, und ein Geräteobjekt, das Acpi.sys zugeordnet ist.

Diagramm, das Geräteobjekte zeigt, die in Gerätestapeln in den Proseware-Gizmo- und PCI-Geräteknoten sortiert wurden.

Wie wird ein Gerätestapel erstellt?

Beim Start fordert der PnP-Manager den Treiber für jeden Bus auf, untergeordnete Geräte aufzulisten, die mit dem Bus verbunden sind. Der PnP-Manager fordert beispielsweise den PCI-Bustreiber (Pci.sys) auf, die Geräte aufzulisten, die mit dem PCI-Bus verbunden sind. Als Reaktion auf diese Anforderung erstellt Pci.sys ein Geräteobjekt für jedes Gerät, das mit dem PCI-Bus verbunden ist. Jedes dieser Geräteobjekte wird als physisches Geräteobjekt (PDO ) bezeichnet. Kurz nachdem Pci.sys den Satz von PDOs erstellt hat, sieht die Gerätestruktur wie im folgenden Diagramm dargestellt aus.

Diagramm mit PCI-Knoten und physischen Geräteobjekten für untergeordnete Geräte.

Der PnP-Manager ordnet jedem neu erstellten PDO einen Geräteknoten zu und sucht in der Registrierung, um zu ermitteln, welche Treiber Teil des Gerätestapels für den Knoten sein müssen. Der Gerätestapel muss über einen (und nur einen) Funktionstreiber verfügen und kann optional über einen oder mehrere Filtertreiber verfügen. Der Funktionstreiber ist der Standard Treiber für den Gerätestapel und ist für die Verarbeitung von Lese-, Schreib- und Gerätesteuerungsanforderungen verantwortlich. Filtertreiber spielen zusätzliche Rollen bei der Verarbeitung von Lese-, Schreib- und Gerätesteuerungsanforderungen. Wenn jede Funktion und jeder Filtertreiber geladen wird, erstellt er ein Geräteobjekt und fügt sich selbst an den Gerätestapel an. Ein vom Funktionstreiber erstelltes Geräteobjekt wird als funktionales Geräteobjekt (Functional Device Object , FDO) bezeichnet, und ein von einem Filtertreiber erstelltes Geräteobjekt wird als Filtergeräteobjekt (Filter-DO) bezeichnet. Nun sieht die Gerätestruktur in etwa wie dieses Diagramm aus.

Diagramm einer Gerätestruktur, die die Filter-, Funktions- und physischen Geräteobjekte im Proseware-Gizmo-Geräteknoten zeigt.

Beachten Sie im Diagramm, dass sich in einem Knoten der Filtertreiber über dem Funktionstreiber befindet und auf dem anderen Knoten der Filtertreiber unterhalb des Funktionstreibers. Ein Filtertreiber, der sich über dem Funktionstreiber in einem Gerätestapel befindet, wird als oberer Filtertreiber bezeichnet. Ein Filtertreiber, der sich unterhalb des Funktionstreibers befindet, wird als niedrigerer Filtertreiber bezeichnet.

Das PDO ist immer das untere Geräteobjekt in einem Gerätestapel. Dies ergibt sich aus der Art und Weise, wie ein Gerätestapel erstellt wird. Das PDO wird zuerst erstellt, und wenn zusätzliche Geräteobjekte an den Stapel angefügt werden, werden sie am oberen Rand des vorhandenen Stapels angefügt.

Hinweis Wenn die Treiber für ein Gerät installiert sind, verwendet das Installationsprogramm Informationen in einer Informationsdatei (INF), um zu bestimmen, welcher Treiber der Funktionstreiber ist und welche Treiber Filter sind. In der Regel wird die INF-Datei entweder von Microsoft oder vom Hardwarehersteller bereitgestellt. Nachdem die Treiber für ein Gerät installiert wurden, kann der PnP-Manager die Funktion ermitteln und die Treiber für das Gerät filtern, indem er in der Registrierung nachschaut.

Bustreiber

Im obigen Diagramm sehen Sie, dass der Treiber Pci.sys zwei Rollen spielt. Zunächst ist Pci.sys dem FDO im PCI Bus-Geräteknoten zugeordnet. Tatsächlich wurde die FDO im PCI Bus-Geräteknoten erstellt. Daher ist Pci.sys der Funktionstreiber für den PCI-Bus. Zweitens ist Pci.sys dem PDO in jedem untergeordneten Element des PCI Bus-Knotens zugeordnet. Denken Sie daran, dass die PDOs für die untergeordneten Geräte erstellt wurden. Der Treiber, der das PDO für einen Geräteknoten erstellt, wird als Bustreiber für den Knoten bezeichnet.

Wenn Ihr Bezugspunkt der PCI-Bus ist, ist Pci.sys der Funktionstreiber. Wenn Ihr Bezugspunkt jedoch das Proseware Gizmo-Gerät ist, dann ist Pci.sys der Bustreiber. Diese Doppelrolle ist in der PnP-Gerätestruktur typisch. Ein Treiber, der als Funktionstreiber für einen Bus dient, dient auch als Bustreiber für ein untergeordnetes Gerät des Busses.

Gerätestapel im Benutzermodus

Bisher haben wir Gerätestapel im Kernelmodus diskutiert. Das heißt, die Treiber in den Stapeln werden im Kernelmodus ausgeführt, und die Geräteobjekte werden dem Systembereich zugeordnet, dem Adressraum, der nur für Code verfügbar ist, der im Kernelmodus ausgeführt wird. Informationen zum Unterschied zwischen Kernelmodus und Benutzermodus finden Sie unter Benutzermodus und Kernelmodus.

In einigen Fällen verfügt ein Gerät zusätzlich zu seinem Kernelmodus-Gerätestapel über einen Gerätestapel im Benutzermodus. Benutzermodustreiber basieren häufig auf dem User-Mode Driver Framework (UMDF), einem der Treibermodelle, die von windows Driver Frameworks (WDF) bereitgestellt werden. In UMDF sind die Treiber Benutzermodus-DLLs, und die Geräteobjekte sind COM-Objekte, die die IWDFDevice-Schnittstelle implementieren. Ein Geräteobjekt in einem UMDF-Gerätestapel wird als WDF-Geräteobjekt (WDF DO) bezeichnet.

Das folgende Diagramm zeigt den Geräteknoten, den Kernelmodus-Gerätestapel und den Gerätestapel im Benutzermodus für ein USB-FX-2-Gerät. Die Treiber in den Stapeln des Benutzermodus und des Kernelmodus nehmen an E/A-Anforderungen teil, die an das USB-FX-2-Gerät gerichtet werden.

Diagramm mit Gerätestapeln im Benutzermodus und Kernelmodus.

Konzepte für alle Treiberentwickler

Treiberstapel