Compartir vía


DispatchReadWrite mediante E/S almacenadas en búfer

Cualquier controlador de dispositivo de nivel inferior que configure sus objetos de dispositivo para la E/S almacenada en búfer satisface una solicitud de lectura devolviendo los datos transferidos desde su dispositivo a un búfer de espacio del sistema bloqueado en Irp-AssociatedIrp.SystemBuffer>. Satisface una solicitud de escritura mediante la transferencia de datos del mismo búfer a su dispositivo.

Por lo tanto, la rutina DispatchReadWrite de este tipo de controlador de dispositivo normalmente realiza lo siguiente al recibir una solicitud de transferencia:

  1. Llama a IoGetCurrentIrpStackLocation y determina la dirección de la solicitud de transferencia.

  2. Comprueba la validez de los parámetros de la solicitud.

    • Para una solicitud de lectura, la rutina suele comprobar el valor ioStackLocation-Parameters.Read.Length > del controlador para determinar si el búfer es lo suficientemente grande como para recibir datos transferidos desde el dispositivo.

      Por ejemplo, el controlador de clase de teclado del sistema procesa solicitudes de lectura que solo proceden del subproceso de entrada de usuario win32. Este controlador define una estructura, KEYBOARD_INPUT_DATA, en la que almacenar pulsaciones de teclas del dispositivo y, en cualquier momento, contiene algún número de estas estructuras en un búfer de anillo interno para satisfacer las solicitudes de lectura a medida que entran.

    • Para una solicitud de escritura, la rutina normalmente comprueba el valor en Parameters.Write.Length y comprueba los datos en Irp-AssociatedIrp.SystemBuffer> si es necesario: es decir, si su dispositivo acepta solo paquetes de datos estructurados que contienen miembros con intervalos de valores definidos.

  3. Si algún parámetro no es válido, la rutina DispatchReadWrite completa el IRP inmediatamente, como ya se describe en Finalización de IRP. De lo contrario, la rutina pasa el IRP en para su posterior procesamiento por otras rutinas de controlador, como se describe en Paso de IRP por la pila de controladores.

Los controladores de dispositivo de nivel más bajo que usan E/S almacenados en búfer normalmente deben satisfacer una solicitud de transferencia leyendo o escribiendo datos de un tamaño especificado por el autor de la solicitud. Es probable que este controlador defina una estructura para los datos procedentes de su dispositivo o que se envíen a su dispositivo y es probable que almacene en búfer los datos estructurados internamente, como lo hace el controlador de clase de teclado del sistema.

Los controladores que almacena en búfer los datos internamente deben admitir solicitudes de IRP_MJ_FLUSH_BUFFERS y también pueden admitir solicitudes de IRP_MJ_SHUTDOWN .

El controlador de nivel más alto de una cadena suele ser responsable de comprobar los parámetros del IRP de entrada antes de pasar una solicitud de lectura y escritura en a controladores inferiores. Por lo tanto, muchos controladores de nivel inferior pueden suponer que sus ubicaciones de pila de E/S en un IRP de lectura y escritura tienen parámetros válidos. Si un controlador de nivel más bajo de una cadena es consciente de las restricciones específicas del dispositivo en las transferencias de datos, ese controlador es necesario para comprobar la validez de los parámetros en su ubicación de pila de E/S.