DispatchDeviceControl- und DispatchInternalDeviceControl-Routinen
Die Dispatchroutinen eines Treibers (siehe DRIVER_DISPATCH) verarbeiten IRPs mit E/A-Funktionscodes von IRP_MJ_DEVICE_CONTROL bzw. IRP_MJ_INTERNAL_DEVICE_CONTROL.
Für jeden gängigen Typ von Peripheriegeräten definiert das System einen Satz von E/A-Steuercodes für IRP_MJ_DEVICE_CONTROL Anforderungen. Neue Treiber für jeden Gerätetyp müssen diese Anforderungen unterstützen. In den meisten Fällen werden diese öffentlichen E/A-Steuerungscodes für jeden Gerätetyp nicht in Benutzermodusanwendungen exportiert.
Einige dieser systemdefinierten E/A-Steuerungscodes werden von Treibern höherer Ebene verwendet, die IRPs für den zugrunde liegenden Gerätetreiber erstellen, indem IoBuildDeviceIoControlRequest aufgerufen wird. Andere werden von Win32-Komponenten verwendet, um mit einem zugrunde liegenden Gerätetreiber zu kommunizieren, indem die Win32-Funktion DeviceIoControl aufgerufen wird (siehe Microsoft Windows SDK Dokumentation), die wiederum einen Systemdienst aufruft. Der E/A-Manager richtet eine IRP ein und speichert den Hauptfunktionscode IRP_MJ_DEVICE_CONTROL und den angegebenen E/A-Steuerungscode in der IO_STACK_LOCATION-Struktur unter Parameters.DeviceIoControl.IoControlCode. Anschließend ruft der E/A-Manager die DispatchDeviceControl-Routine des Treibers der obersten Ebene in der Kette auf.
Für bestimmte vom System bereitgestellte Treiber, die für die Zusammenarbeit mit neuen Treibern entwickelt wurden und diese unterstützen, definiert das Betriebssystem auch eine Reihe von E/A-Steuercodes für IRP_MJ_INTERNAL_DEVICE_CONTROL Anforderungen. In den meisten Fällen ermöglichen diese öffentlichen E/A-Steuerungscodes die Zusammenarbeit von Add-On-Treibern auf höherer Ebene mit einem zugrunde liegenden Gerätetreiber.
Beispielsweise unterstützen die vom System bereitgestellten parallelen Treiber eine Reihe interner E/A-Kontrollcodes, die vom Anbieter bereitgestellte Treiber IRP_MJ_INTERNAL_DEVICE_CONTROL Anforderungen senden. Weitere Informationen finden Sie unter Interne Gerätesteuerungsanforderungen für parallele Ports und Interne Gerätesteuerungsanforderungen für parallele Geräte.
Fast alle Vorgänge, die über systemdefinierte E/A-Steuerungscodes angefordert werden, verwenden gepufferte E/A, da diese Art von Anforderung selten die Übertragung großer Datenmengen erfordert. Das heißt, selbst Treiber, die ihre Geräteobjekte für direkte E/A einrichten, werden IRPs für Gerätesteuerungsanforderungen mit Daten gesendet, die in den oder aus dem Puffer bei Irp-AssociatedIrp.SystemBuffer> übertragen werden (mit Ausnahme bestimmter Typen von Gerätetreibern der höchsten Ebene mit eng gekoppelten Win32-Multimediatreibern).
Darüber hinaus kann ein Treiber eine Reihe von privaten E/A-Steuerungscodes definieren, die andere Treiber für die Kommunikation mit dem Treiber verwenden können. Neue öffentliche E/A-Steuercodes können dem System nur in Zusammenarbeit mit der Microsoft Corporation hinzugefügt werden, da öffentliche E/A-Steuerungscodes in das Betriebssystem selbst integriert sind.
Spezifische Informationen zu den öffentlichen E/A-Steuerungscodes, die von verschiedenen Treibertypen unterstützt werden müssen, und zum Definieren privater E/A-Steuerungscodes finden Sie in den gerätespezifischen Referenzabschnitten des Windows Driver Kit (WDK).