Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Cualquier controlador de dispositivo de nivel inferior que configura 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, todas las rutinas DispatchReadWrite de los controladores de nivel inferior deben pasar IRP_MJ_READ y IRP_MJ_WRITE IRPs con parámetros válidos a otras rutinas de controlador, como se describe en Transmisión de IRP a través de la pila de controladores.
En el caso de 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 verificado para obtener los derechos de acceso correctos para llevar a cabo la transferencia solicitada y ya ha sido bloqueada por el controlador de nivel más alto en la cadena o por el Administrador de E/S. Cualquier controlador intermedio o de nivel inferior que configure sus objetos de dispositivo para E/S directa no debe llamar a MmProbeAndLockPages porque ya se ha hecho esto. Un controlador de nivel inferior 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 de un controlador de dispositivo de nivel intermedio o inferior debe validar los parámetros en su ubicación de pila de E/S de los IRP de lectura y escritura, si no puede confiar en que un controlador de nivel superior pase únicamente IRP con parámetros válidos. Si la rutina DispatchReadWrite encuentra un error de parámetro, debe completar el IRP con un valor de error STATUS_XXX adecuado, como ya se describe en Completar 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 Higher-Level Controladores.
Una rutina de 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 llamando 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 grandes solicitudes de transferencia 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. Esta rutina de dispatchReadWrite del controlador de dispositivo no debe comprobar la ubicación de la pila de E/S de los IRP entrantes para las restricciones de transferencia específicas del dispositivo, ni intentar calcular intervalos de transferencia parcial, 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.