Einführung in E/A-Steuerungscodes
E/A-Steuerungscodes (IOCTLs) werden für die Kommunikation zwischen Benutzermodusanwendungen und Treibern oder für die interne Kommunikation zwischen Treibern in einem Stapel verwendet. E/A-Steuerungscodes werden mithilfe von IRPs gesendet.
Benutzermodusanwendungen senden IOCTLs an Treiber, indem Sie DeviceIoControl aufrufen, was in Microsoft Windows SDK Dokumentation beschrieben wird. Aufrufe von DeviceIoControl führen dazu, dass der E/A-Manager eine IRP_MJ_DEVICE_CONTROL Anforderung erstellt und an den obersten Treiber sendet.
Darüber hinaus können Treiber der oberen Ebene IOCTLs an Treiber auf niedrigerer Ebene senden, indem sie IRP_MJ_DEVICE_CONTROL oder IRP_MJ_INTERNAL_DEVICE_CONTROL Anforderungen erstellen und senden. Treiber verarbeiten diese Anforderungen in DispatchDeviceControl - und DispatchInternalDeviceControl-Routinen . (Anwendungen im Benutzermodus können keine IRP_MJ_INTERNAL_DEVICE_CONTROL Anforderungen senden.)
Einige IOCTLs sind "öffentlich" und einige "privat". Öffentliche IOCTLs werden in der Regel von Microsoft systemdefiniert und dokumentiert, entweder im Windows Driver Kit (WDK) oder im Windows SDK. Sie können durch Aufrufe einer Benutzermoduskomponente an DeviceIoControl gesendet oder von einem Kernelmodustreiber an einen anderen gesendet werden, wobei IRP_MJ_DEVICE_CONTROL - oder IRP_MJ_INTERNAL_DEVICE_CONTROL-Anforderungen verwendet werden. Beispiele für öffentliche IOCTLs sind SCSI-Port-E/A-Steuerungscodes und I8042prt Mouse Internal Device Control Requests.
Private IOCTLs hingegen sollen ausschließlich von den Softwarekomponenten eines Anbieters verwendet werden, um miteinander zu kommunizieren. Private IOCTLs werden in der Regel in einer vom Anbieter bereitgestellten Headerdatei definiert und sind nicht öffentlich dokumentiert. Wie öffentliche IOCTLs können sie mithilfe der Aufrufe einer Benutzermoduskomponente an DeviceIoControl gesendet oder von einem Kernelmodustreiber an einen anderen gesendet werden, wobei IRP_MJ_DEVICE_CONTROL - oder IRP_MJ_INTERNAL_DEVICE_CONTROL-Anforderungen verwendet werden.
Es gibt keinen Unterschied zwischen der Codierung von öffentlichen und privaten IOCTLs. Es gibt jedoch Unterschiede in den internen Codes, die in vom Hersteller definierten IOCTLs verwendet werden können, im Vergleich zu denen, die für systemdefinierte IOCTLs verwendet werden. Wenn die verfügbaren öffentlichen IOCTLs nicht Ihren Anforderungen entsprechen, können Sie neue private IOCTLs definieren, die Ihre Softwarekomponenten für die Kommunikation untereinander verwenden können. Weitere Informationen finden Sie unter Definieren von E/A-Steuerungscodes.