WDM-Audioterminologie
In diesem Abschnitt werden die Unterschiede in der Terminologie zwischen der WdM-Audiotreiberarchitektur (Microsoft Windows Driver Model) und der generischen Windows-Mehrschichttreiberarchitektur beschrieben. Die generische Treiberarchitektur wird durch SCSI-Port-/Miniporttreiber veranschaulicht (siehe Speichertreiberarchitektur).
Die durch die generischen und WDM-Audiotreiberarchitekturen definierten Begriffe ähneln sich, weisen jedoch einige wichtige Unterschiede auf, wie unten beschrieben.
Der Miniporttreiber (generisch) ist der hardwarespezifische Treiber für einen Adapter, der sich auf einem Systembus befindet (z. B. PCI oder ISA). Dieser Treiber verfügt über einen einzigen Einstiegspunkt , DriverEntry, und registriert eine Funktionstabelle bei einem Porttreiber. Dieses Funktionsverzeichnis dient als Obere Schnittstelle des Miniporttreibers.
Der Miniporttreiber befindet sich unterhalb des Porttreibers im Treiberstapel. Das heißt, alle Aufrufe des Miniporttreibers erfolgen vom Porttreiber und alle Aufrufe aus dem Miniporttreiber an die Unterkante der Schnittstelle des Porttreibers.
Die folgende Abbildung veranschaulicht die Bedeutung der Begriffe Stapel, Oberrandschnittstelle und Unterrandschnittstelle , wie sie in diesem Kontext verwendet werden. Der Block, der den Porttreiber darstellt, wird auf dem Block gestapelt, der den Miniporttreiber darstellt. Daher befindet sich der Miniporttreiber unterhalb des Porttreibers im "Stack".
Die Port- und Miniporttreiber kommunizieren über die Softwareschnittstellen, die sie einander zur Verfügung stellen. In der obigen Abbildung sind diese Schnittstellen dem unteren Rand des Blocks zugeordnet, der den Porttreiber darstellt, und dem oberen Rand des Blocks, der den Miniporttreiber darstellt. Diese Darstellung ist die Quelle der Begriffe "Schnittstelle unterer Rand" und "Schnittstelle des oberen Edges".
Der Porttreiber (generisch) umgibt einen Miniporttreiber.
Der Porttreiber:
Implementiert WDM-Streamingfilter.
Stellt eine gemeinsame Schnittstelle für den Rest des Betriebssystems bereit.
Verarbeitet E/A-Anforderungen vom System und übergibt diese Anforderungen als Aufrufe in die Funktionstabelle des Miniporttreibers.
Stellt dem Miniporttreiber eine Bibliothek mit Unterstützungsfunktionen bereit (die Unterkante der Schnittstelle des Porttreibers).
Der Porttreiber blendet viele Details des Betriebssystems vor dem Miniporttreiber aus, und der Miniporttreiber blendet die Besonderheiten der zugrunde liegenden Hardware vor dem Porttreiber aus. Die Implementierung des Porttreibers kann sich bei verschiedenen Betriebssystemversionen ändern, aber die Schnittstelle des Porttreibers zum Miniporttreiber bleibt mehr oder weniger unverändert, sodass der Miniporttreiber weitgehend plattformunabhängig ist.
Der Minidriver (generisch) stellt eine Hardwarekomponente auf einem Bus dar. Der Minidriver verwendet den Bustreiber, um über den Bus mit dem physischen Gerät zu kommunizieren, und bindet den Bustreiber und einen oder mehrere Klassentreiber zusammen.
Klassentreiber helfen dem Minitreiber, das physische Gerät für Clients als logisches Gerät darzustellen. In WDM-Umgebungen empfängt ein Minidriver in der Regel Anforderungen in IRP-Form von Klassentreibern und sendet Anforderungen in IRP-Form an einen Bustreiber.
Ein Minidriver muss möglicherweise auch mit mehreren Klassentreibern kommunizieren. Ein Beispiel für einen Minidriver, der an mehrere Klassentreiber bindet, ist ein Minidriver für ein CD-ROM-Laufwerk auf einem IEEE 1394-Bus. Es kann an einen Dateisystemtreiber gebunden werden, sodass vom Dateisystem aus auf das Laufwerk zugegriffen werden kann. Es wird jedoch auch an einen Redbook-Systemtreiber gebunden, sodass Audio von CDs gestreamt werden kann.
Der Bustreiber (generisch) gewährt Minidrivern Zugriff auf einen physischen Bus. Die Microsoft Windows-Hardwareabstraktionsschicht (HAL) wird manchmal als Systembustreiber bezeichnet, da sie zugriff auf den Systembus bietet. Weitere Informationen finden Sie unter Bustreiber.
Der Klassentreiber (generisch) implementiert ein Verhalten, das für eine Klasse ähnlicher Geräte üblich ist.
Der Klassentreiber:
Es wird keine Duplizierung von Funktionen in hardwarespezifischen Treibern vermieden.
Ist nicht busspezifisch.
Ressourcenprobleme (z. B. DMA und Interrupts) sind nicht bekannt.
Der Miniporttreiber (WDM-Audio) implementiert eine funktionsspezifische Schnittstelle für eine Funktion auf einem Audioadapter Karte, die sich auf einem Systembus befindet. Ein Miniporttreiber ist eine Komponente eines Adaptertreibers. Es wird vom Betriebssystem nicht als Treiber erkannt. In dieser Hinsicht unterscheidet sich ein Audio-Miniporttreiber von einem generischen Miniporttreiber.
Im Gegensatz zu generischen Miniporttreibern implementieren Audio-Miniporttreiber DriverEntry nicht, sind nicht registriert und basieren nicht vollständig auf ihren jeweiligen Porttreibern für die Unterstützung. Mehrere Audio-Miniporttreiber, die mehrere Funktionen adressieren, können mit einem einzelnen Adaptertreiber (und einem einzelnen Geräteobjekt zugeordnet) verknüpft werden.
Der Adaptertreiber (WDM-Audio) dient als Container für alle Miniporttreiber, die einem bestimmten Adapter zugeordnet sind. Dieser Adaptertreiber wird vom Betriebssystem als Treiber erkannt und ist in seiner eigenen .sys-Datei enthalten.
Der Audioadaptertreiber besteht aus einer Reihe von Miniporttreibern und zusätzlichem Code, der Initialisierungsprobleme behandelt. Ein Adaptertreiber implementiert beispielsweise einen DriverEntry-Einstiegspunkt .
Der Porttreiber (WDM-Audio) implementiert einen KS-Filter im Auftrag eines Miniporttreibers und arbeitet im Kontext eines Portklassentreibers. Der Porttreiber macht den funktionsspezifischen Code des Miniporttreibers als KS-Filter für das System verfügbar und ist für die Implementierung adapterunabhängiger Funktionen verantwortlich.
Im Gegensatz zum generischen Porttreiber teilt der Audioporttreiber das Geräteobjekt und wird daher anders instanziiert. Ein Audioporttreiber ähnelt auch eher einem generischen Klassentreiber als einem generischen Porttreiber, da er ein Verhalten implementiert, das von einer Geräteklasse erwartet wird (er ist nicht busunabhängig).
Der Portklassentreiber (WDM-Audio) dient als Container für eine Sammlung von Porttreibern, die jeweils Unterstützung für einen anderen Typ von Audiohardwarefunktionen bieten. Die folgende Abbildung zeigt die Beziehungen zwischen der Audioportklasse und den Adaptertreibern.
Ein Adaptertreiber verwaltet einen Adapter Karte, der mehrere verschiedene Hardwarefunktionen enthalten kann. Wie in der vorherigen Abbildung gezeigt, enthält der Adaptertreiber einen Miniporttreiber, um jeden Hardwarefunktionstyp zu verwalten. Ebenso ist der Portklassentreiber so konzipiert, dass er Adapterkarten mit mehreren Hardwarefunktionen unterstützt. Der Portklassentreiber stellt einen Porttreiber für jeden der wohldefinierten Funktionstypen bereit, die er unterstützt. Der Adaptertreiber bindet seinen Miniporttreiber für eine bestimmte Funktion an den entsprechenden Porttreiber für diesen Funktionstyp. Der Porttreiber für jede Funktion übernimmt die Kommunikation mit den WDM-Audioclients, die die Funktion verwenden. Der Miniporttreiber enthält den gesamten hardwarespezifischen Code für die Verwaltung dieser Funktion.
Der Portklassentreiber (WDM-Audio) fungiert in erster Linie als Container für mehrere Untergeräte, die einem einzelnen Geräteobjekt zugeordnet sind. Bustreiber erstellen ein einzelnes physisches Geräteobjekt (PDO) für jeden Plug & Play Knoten( PnP), den sie auflisten.
Bei einem Audioadapter enthält ein einzelner PnP-Knoten häufig mehrere Audiofunktionen. Um die verschiedenen Funktionen, die einem Knoten zugeordnet sind, als unterschiedliche Geräte verfügbar zu machen, ist in der Regel das Schreiben eines Bustreibers für den Adapter erforderlich. Der Bustreiber zählt die Hardwarefunktionen auf und erstellt entsprechende PDOs. In diesem Szenario muss mindestens ein funktionsspezifischer Treiber an die PDOs gebunden und mit dem Bustreiber für den Zugriff auf freigegebene Ressourcen auf dem Adapter verhandelt werden.
Der Portklassentreiber nutzt die Fähigkeit des Kernelstreamingtreibers, verschiedene Aspekte eines einzelnen Geräteobjekts verfügbar zu machen, damit das Betriebssystem das Gerät als eine Reihe unterschiedlicher Untergeräte erkennt.
An den Gerätenamen wird eine Verweiszeichenfolge angefügt, um das gewünschte Untergerät anzugeben. Der Kernelstreamingtreiber sendet Erstellungs-IRPs basierend auf dieser Referenzzeichenfolge. Nachdem ein Dateiobjekt erstellt wurde, ermöglicht der Kernelstreamingtreiber die Verteilung von IRPs, die auf das Dateiobjekt abzielen, das das Untergerät darstellt. Darüber hinaus implementiert der Portklassentreiber ein COM-basiertes Modell für das Packen von Untergeräte.
Ein Adaptertreiber instanziiert einen Porttreiber und einen Miniporttreiber und bindet sie zusammen, indem er einen Zeiger auf den Miniporttreiber als Parameter an die Initialisierungsfunktion des Porttreibers übergibt (siehe Codebeispiel unter Erstellung von Untergeräte). Der resultierende Port-/Miniporttreiberstapel stellt einen KS-Filter dar, der einen der Vom Portklassentreiber unterstützten Untergerätetypen darstellt.
Die PcRegisterSubdevice-Funktion des Portklassentreibers registriert das Untergerät, das vom Rest des Systems als Gerät wahrgenommen wird. Der Porttreiber empfängt Erstellungs-IRPs, die auf das Geräteobjekt ausgerichtet sind, aber nur für die IRPs, die durch die Verweiszeichenfolge angegeben werden, unter der das Untergerät registriert ist. Der Porttreiber empfängt auch die IRPs für die Dateiobjekte, die dem Untergerät zugeordnet sind. Der Porttreiber ist für das Verhalten des Untergerätes als KS-Filter und für die entsprechende Kommunikation mit dem Miniporttreiber verantwortlich.
Weitere Informationen zum Entwerfen von Treibern für Multifunktionsaudiokarten finden Sie unter Multifunktionsaudiogeräte.