Rutinas DispatchDeviceControl y DispatchInternalDeviceControl
Las rutinas de envío de un controlador (consulte DRIVER_DISPATCH) controlan los IRP con códigos de función de E/S de IRP_MJ_DEVICE_CONTROL y IRP_MJ_INTERNAL_DEVICE_CONTROL, respectivamente.
Para cada tipo común de dispositivo periférico, el sistema define un conjunto de códigos de control de E/S para IRP_MJ_DEVICE_CONTROL solicitudes. Los nuevos controladores para cada tipo de dispositivo deben admitir estas solicitudes. En la mayoría de los casos, estos códigos de control de E/S públicos para cada tipo de dispositivo no se exportan a aplicaciones en modo de usuario.
Algunos de estos códigos de control de E/S definidos por el sistema se usan mediante controladores de nivel superior que crean IRP para el controlador de dispositivo subyacente mediante una llamada a IoBuildDeviceIoControlRequest. Los componentes de Win32 usan otros para comunicarse con un controlador de dispositivo subyacente mediante una llamada a la función Win32 DeviceIoControl (descrita en Microsoft Windows SDK documentación) que, a su vez, llama a un servicio del sistema. El administrador de E/S configura un IRP y almacena el código de función principal IRP_MJ_DEVICE_CONTROL y el código de control de E/S especificado en la estructura de IO_STACK_LOCATION en Parameters.DeviceIoControl.IoControlCode. A continuación, el administrador de E/S llama a la rutina DispatchDeviceControl del controlador de nivel más alto de la cadena.
Para determinados controladores suministrados por el sistema diseñados para interoperar con nuevos controladores y admitirlos, el sistema operativo también define un conjunto de códigos de control de E/S para solicitudes de IRP_MJ_INTERNAL_DEVICE_CONTROL . En la mayoría de los casos, estos códigos de control de E/S públicos permiten que los controladores de nivel superior del complemento interoperan con un controlador de dispositivo subyacente.
Por ejemplo, los controladores paralelos proporcionados por el sistema admiten un conjunto de códigos de control de E/S internos que los controladores suministrados por el proveedor envían en IRP_MJ_INTERNAL_DEVICE_CONTROL solicitudes. Para obtener más información, vea Solicitudes de control de dispositivos internos para puertos paralelos y solicitudes de control de dispositivos internos para dispositivos paralelos.
Casi todas las operaciones solicitadas a través de códigos de control de E/S definidos por el sistema usan E/S almacenadas en búfer, ya que este tipo de solicitud rara vez requiere la transferencia de grandes cantidades de datos. Es decir, incluso los controladores que configuran sus objetos de dispositivo para la E/S directa se envían IRP para las solicitudes de control de dispositivos con datos que se van a transferir o salir del búfer en Irp-AssociatedIrp.SystemBuffer> (excepto para determinados tipos de controladores de dispositivos de nivel superior con controladores multimedia Win32 estrechamente acoplados).
Además, un controlador puede definir un conjunto de códigos de control de E/S privados que otros controladores pueden usar para comunicarse con él. Los nuevos códigos de control de E/S públicos se pueden agregar al sistema solo con la cooperación de Microsoft Corporation, ya que los códigos de control de E/S públicos están integrados en el propio sistema operativo.
Para obtener información específica sobre el conjunto de códigos de control de E/S públicos que los distintos tipos de controladores deben admitir y sobre cómo definir códigos de control de E/S privados, consulta las secciones de referencia específicas del dispositivo del Kit de controladores de Windows (WDK).