KS-Pins
Der Minitreiber stellt eine KSPIN_DESCRIPTOR-Struktur für jeden zu instanziierten Pintyp bereit. Eine Stiftdeskriptorstruktur wird als Pin factory bezeichnet. Jede Pinfactory kann eine oder mehrere Pininstanzen eines bestimmten Typs instanziieren. Eine Pinfactory enthält mehrere Arrays, die den Typ des Pins beschreiben, den dieser Deskriptor instanziiert.
Der Minidriver gibt eine oder mehrere KS-Kategorien an, zu denen von diesem Deskriptor erstellte Pins in das Categories-Element von KSPIN_DESCRIPTOR gehören. KS verwendet Kategorien, um Pininstanzen zu verbinden, wenn ein Filterdiagramm erstellt wird. Die KSPROPERTY_TOPOLOGY_CATEGORIES-Eigenschaft fragt das Array von Funktionskategorien ab, das von einem Treiber unterstützt wird.
Ein Minidriver stellt eine INF-Datei bereit, die mindestens einen Pin-Gerätenamen registriert. Bei der Installation lädt das Betriebssystem die Namen und die entsprechenden Kategorien in die Systemregistrierung. Clients können dann Create-File-Aufrufe mit diesen Gerätenamen tätigen, um Pins zu instanziieren.
Clients im Benutzermodus rufen die Win32-Funktion CreateFile mit dem Namen des Geräts auf. Beispielsweise kann "\\.\filters\audio\default renderer" ein Link zu dem Audiogerät sein, das für die Standardausgabe konfiguriert wurde. Clients im Kernelmodus rufen ZwCreateFile aus dem Kernelmodus auf. Nachdem die Dateierstellungsroutine ein Dateihandle zurückgegeben hat, kommunizieren KS-Clients über KS-Eigenschaften mit Pininstanzen.
In den Stiftdeskriptorstrukturen legt der Minidriver Arrays von KSPIN_INTERFACE-Strukturen und KSPIN_MEDIUM-Strukturen bereit , die die Schnittstellen und Medien angeben, die von dieser Pinfactory unterstützt werden. KSPIN_DESCRIPTOR gibt der Minidriver auch die gültigen Datenbereiche für von dieser Factory erstellte Pins an. Dazu wird ein Zeiger auf ein Array von KSDATARANGE-Strukturen bereitgestellt. Der Minidriver gibt auch die Richtungen des Daten- und Kommunikationsflusses für neue Pins an, die von dieser Pinfactory erstellt wurden.
Ein Minidriver ermöglicht die Laufzeitermittlung von Pin-Factorys, indem der KSPROPSETID_Pin-Eigenschaftssatz unterstützt wird.
Um eine Pinverbindung zu erstellen, rufen Sie die KsCreatePin-Routine auf . In diesem Aufruf übergibt der Minidriver einen Zeiger auf eine Struktur vom Typ KSPIN_CONNECT , die die angeforderte Verbindung beschreibt. Wenn eine Pin erstellt wird, sieht der Filter die neue Pin als Dateiobjekt, das dem Dateiobjekt für diesen Filter untergeordnet ist.
Der Minidriver ruft KsValidateConnectRequest mit den Deskriptorstrukturen auf, die im resultierenden IRP_MJ_CREATE bereitgestellt werden. Diese Routine überprüft diese Strukturen und gibt einen Zeiger auf die Verbindungsstruktur und das Stammdateiobjekt zurück.
Minidriver verwenden die DataFlow - und Communication-Member von KSPIN_DESCRIPTOR-Strukturen , um die folgenden Pinspezifik zu definieren:
IRP-Quellpin im Vergleich zum IRP-Senkenpin
Eine IRP-Quellnadel gibt IRPs aus; eine IRP-Senkennadel empfängt sie. Ein Client im Benutzermodus sendet E/A-Anforderungen direkt über das entsprechende Dateihandle an eine IRP-Senkennadel. Clients verwenden KSPROPERTY_PIN_COMMUNICATION , um zu überprüfen, ob Daten in oder aus einem Pintyp fließen.
Datenquellen-Pin im Vergleich zur Datensenke-Pin
Ein Datenquellen-Pin ist ein Ausgabepin auf einem Filter. ein Datensenkennadel ist ein Eingabenadel. Die Eigenschaft, eine Datenquelle oder Senke zu sein, ist unabhängig davon, dass es sich um eine IRP-Quelle oder -Senke handelt. Der Client kann z. B. eine Datenquelle, eine IRP-Senkennadel mit einer Datensenke, eine IRP-Quellnadel verbinden. Clients verwenden KSPROPERTY_PIN_DATAFLOW , um zu überprüfen, ob Daten in oder aus einem Pintyp fließen.
Beim Beenden einer Verbindung muss das Handle des Quellpins geschlossen werden, bevor das zugrunde liegende Dateiobjekt zerstört wird. Wenn der Quell-Pin auf Ressourcen angewiesen ist, die vom Senkenpin bereitgestellt werden, ist es die Verantwortung des Senkenpins, die Quelle zu benachrichtigen, wenn die Verbindung beendet wird.
Ein Client interagiert mit einem Kernelstreaming-Pin, indem er die DeviceIoControl-Routine (beschrieben in der Microsoft Windows SDK-Dokumentation) mit IRP_MJ_DEVICE_CONTROL aufruft. Der Aufrufer identifiziert seine Anforderung anhand des E/A-Steuerungscodes, den er unter Parameters.DeviceIoControl.IoControlCode in der E/A-Stapelspeicherortstruktur platziert.
Zur Unterstützung von Anforderungen stellt der Minitreiber einen Zeiger auf eine KSDISPATCH_TABLE-Struktur in einem Aufruf von KsAllocateObjectHeader bereit.
Schreibanforderungen enthalten einen Zeiger auf ein Array von KSSTREAM_HEADER Strukturen, die wiederum Zeiger zum Streamen von Daten enthalten. Leseanforderungen enthalten einen Zeiger auf ein Array leerer Headerstrukturen, in dem die Lesedaten zurückgegeben werden sollen.