Compartir a través de


DispatchReadWrite mediante E/S almacenadas en búfer

Cualquier controlador de dispositivo de nivel más bajo 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 bloqueado en el espacio del sistema 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 normalmente comprueba 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 se almacenan las pulsaciones de tecla del dispositivo y, en todo momento, mantiene una cantidad de estas estructuras en un búfer de anillo interno para satisfacer las solicitudes de lectura a medida que se reciben.

    • 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 alguno de los parámetros 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 para su posterior procesamiento por otras rutinas de controlador, como se describe en Paso de IRP por la pila de controladores.

Normalmente, los controladores de dispositivos de nivel más bajo que usan E/S almacenados en búfer deben satisfacer una solicitud de transferencia leyendo o escribiendo datos de un tamaño especificado por el originador de la solicitud. Es probable que un controlador de este tipo 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 almacenan en búfer los datos internamente deben admitir las solicitudes de IRP_MJ_FLUSH_BUFFERS y también pueden admitir las solicitudes 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 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 inferior 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.