DispatchReadWrite mediante E/S directa
Cualquier controlador de dispositivo de nivel inferior que configure sus objetos de dispositivo para la E/S directa satisface una solicitud de lectura devolviendo los datos transferidos desde su dispositivo a la memoria física del sistema, que se describe en MDL en Irp-MdlAddress>. Satisface una solicitud de escritura mediante la transferencia de datos de la memoria física del sistema a su dispositivo.
Los controladores de nivel inferior deben controlar las solicitudes de lectura y escritura de forma asincrónica. Por lo tanto, cada rutina dispatchReadWrite del controlador de nivel inferior debe pasar IRP_MJ_READ e IRP_MJ_WRITE IRP con parámetros válidos en otras rutinas de controlador, como se describe en Pasar IRP a la pila de controladores.
Para irP de lectura y escritura enviados a controladores de nivel inferior, la memoria física paginada descrita por el MDL en Irp-MdlAddress> ya se ha sondado para obtener los derechos de acceso correctos para llevar a cabo la transferencia solicitada y ya ha sido bloqueado por el controlador de nivel superior en la cadena o por el administrador de E/S. Cualquier controlador intermedio o de nivel inferior que configure sus objetos de dispositivo para la E/S directa no debe llamar a MmProbeAndLockPages porque ya se ha realizado. Un controlador de nivel más bajo llama a MmGetSystemAddressForMdlSafe. (Los controladores para Windows 98 llaman a MmGetSystemAddressForMdl en su lugar. Los controladores para Windows Me, Windows 2000 y versiones posteriores de Windows deben usar MmGetSystemAddressForMdlSafe).
Cualquier rutina de dispatchReadWrite del controlador de dispositivo de nivel intermedio o inferior debe validar los parámetros en su ubicación de pila de E/S de IRP de lectura y escritura si no puede confiar en un controlador de nivel superior para pasar solo irP con parámetros válidos. Si la rutina DispatchReadWrite encuentra un error de parámetro, debe completar el IRP con un error adecuado STATUS_XXX como ya se describe en Finalización de IRP. Si los parámetros son válidos, la rutina DispatchReadWrite de un controlador intermedio debe pasar la solicitud para su posterior procesamiento, según las directrices de DispatchReadWrite en los controladores de Higher-Level.
Una rutina dispatchReadWrite del controlador de dispositivo de nivel más bajo debe llamar a IoMarkIrpPending con la solicitud de transferencia, pasar el IRP para su posterior procesamiento por otras rutinas de controlador y devolver STATUS_PENDING, como se describe en Paso de IRP por la pila de controladores.
Tenga en cuenta que la rutina DispatchReadWrite de un controlador de dispositivo puede controlar el orden en el que los IRP se ponen en cola en su dispositivo para obtener un rendimiento de E/S más rápido mediante una llamada a IoStartPacket con un valor de clave determinado por el controlador. Otra rutina del controlador pone en cola el IRP más adelante, determina si la longitud solicitada debe dividirse en operaciones de transferencia parcial y programa el dispositivo para transferir datos.
En general, un controlador de dispositivo que debe dividir las solicitudes de transferencia de gran tamaño para adaptarse a las limitaciones de su dispositivo debe posponer estas operaciones hasta justo antes de configurar el dispositivo para una solicitud de transferencia determinada. Dicha rutina de dispatchReadWrite del controlador de dispositivo no debe comprobar la ubicación de la pila de E/S de los IRP entrantes para cualquier restricción de transferencia específica del dispositivo, ni intentar calcular intervalos de transferencia parciales, cuando el controlador puede posponer estas comprobaciones hasta que su StartIo (u otra rutina de controlador) programa el dispositivo para una operación de transferencia.