Introducción a los códigos de control de E/S

Los códigos de control de E/S (IOCTLs) se usan para la comunicación entre las aplicaciones y controladores en modo de usuario, o para la comunicación interna entre los controladores de una pila. Los códigos de control de E/S se envían mediante IRP.

Las aplicaciones en modo de usuario envían ICTL a controladores mediante una llamada a DeviceIoControl, que se describe en Microsoft Windows SDK documentación. Las llamadas a DeviceIoControl hacen que el administrador de E/S cree una solicitud de IRP_MJ_DEVICE_CONTROL y envíela al controlador más alto.

Además, los controladores de nivel superior pueden enviar ICTL a controladores de nivel inferior mediante la creación y el envío de IRP_MJ_DEVICE_CONTROL o solicitudes de IRP_MJ_INTERNAL_DEVICE_CONTROL . Los controladores procesan estas solicitudes en las rutinas DispatchDeviceControl y DispatchInternalDeviceControl . (Las aplicaciones en modo de usuario no pueden enviar solicitudes IRP_MJ_INTERNAL_DEVICE_CONTROL ).

Algunos IOCTL son "públicos" y algunos son "privados". Las E/S/S públicas suelen estar definidas por el sistema y documentadas por Microsoft, ya sea en el Kit de controladores de Windows (WDK) o en Windows SDK. Es posible que se envíen mediante llamadas de un componente en modo de usuario a DeviceIoControl o que se envíen desde un controlador en modo kernel a otro, mediante IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL solicitudes. Entre los ejemplos de ICTL públicos se incluyen códigos de control de E /S de puerto SCSI y solicitudes de control de dispositivos internos del mouse I8042prt.

Las ICTL privadas, por otro lado, están pensadas para ser utilizadas exclusivamente por los componentes de software de un proveedor para comunicarse entre sí. Las IOPS privadas se definen normalmente en un archivo de encabezado proporcionado por el proveedor y no se documentan públicamente. Al igual que las ICTLs públicas, pueden enviarse mediante llamadas de un componente en modo de usuario a DeviceIoControl, o pueden enviarse desde un controlador en modo kernel a otro, mediante IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL solicitudes.

No hay ninguna diferencia entre la codificación de ioCTLs pública y privada. Sin embargo, existen diferencias en los códigos internos que se pueden usar en las ICTLs definidas por el proveedor, en comparación con las que se usan para las ICTLs definidas por el sistema. Si las IOPS públicas disponibles no se ajustan a sus necesidades, puede definir nuevas ICTL privadas que los componentes de software pueden usar para comunicarse entre sí. Para obtener más información, vea Definir códigos de control de E/S.