Resumen de rutinas de distribución de lectura y escritura
Tenga en cuenta los siguientes puntos al implementar una rutina DispatchRead, DispatchWrite o DispatchReadWrite :
Es responsabilidad del controlador de nivel superior en una cadena de controladores en capas comprobar los parámetros de irP de lectura y escritura entrantes para comprobar la validez antes de configurar la ubicación de pila de E/S del controlador de nivel inferior siguiente en un IRP.
Los controladores intermedios y de nivel más bajo generalmente pueden confiar en el controlador de nivel superior de su cadena para pasar solicitudes de transferencia con parámetros válidos. Sin embargo, cualquier controlador puede realizar comprobaciones de integridad en los parámetros de su ubicación de pila de E/S de un IRP, y cada controlador de dispositivo debe comprobar los parámetros de las condiciones que podrían infringir las restricciones impuestas por su dispositivo.
Si una rutina DispatchReadWrite completa un IRP con un error, debe establecer el miembro status de la ubicación de pila de E/S con un valor de tipo NTSTATUS adecuado, establezca el miembro Information en cero y llame a IoCompleteRequest con irP y priorityBoost de IO_NO_INCREMENT.
Si un controlador usa E/S almacenada en búfer, es posible que tenga que definir una estructura para que contenga datos que se van a transferir y que necesite almacenar en búfer algún número de estas estructuras internamente.
Si un controlador usa E/S directa, es posible que tenga que comprobar si el MDL de Irp-MdlAddress> describe un búfer que contiene demasiados datos (o demasiados saltos de página) para que el dispositivo subyacente controle en una sola operación de transferencia. Si es así, el controlador debe dividir la solicitud de transferencia original en una secuencia de operaciones de transferencia más pequeñas.
Un controlador de clase estrechamente acoplado podría dividir dicha solicitud en su rutina DispatchReadWrite para su controlador de puerto subyacente. Los controladores de clase SCSI, especialmente para los dispositivos de almacenamiento masivo, son necesarios para hacerlo. Para obtener más información sobre los requisitos de los controladores SCSI, consulte Controladores de almacenamiento.
Una rutina dispatchReadWrite del controlador de dispositivo de nivel inferior debe posponer la división de una solicitud de transferencia grande en transferencias parciales hasta que otra rutina de controlador pone en cola el IRP para configurar el dispositivo para la transferencia.
Si un controlador de dispositivo de nivel inferior pone en cola un IRP de lectura y escritura para su posterior procesamiento por sus propias rutinas, debe llamar a IoMarkIrpPending antes de poner en cola el IRP. La rutina DispatchReadWrite también debe devolver el control con STATUS_PENDING en estas circunstancias.
Si la rutina DispatchReadWrite pasa un IRP a controladores inferiores, debe configurar la ubicación de la pila de E/S para el controlador siguiente inferior en el IRP. Si el controlador de nivel superior también establece una rutina de IoCompletion en el IRP antes de pasarla con IoCallDriver depende del diseño del controlador y de los que están en capas debajo de él.
Sin embargo, un controlador de nivel superior debe llamar a IoSetCompletionRoutine antes de llamar a IoCallDriver si asigna recursos, como IRP o memoria. Su rutina de IoCompletion debe liberar los recursos asignados por controladores cuando los controladores inferiores hayan completado la solicitud, pero antes de que la rutina ioCompletion llame a IoCompleteRequest con el IRP original.
Si un controlador de nivel superior asigna IRP para controladores inferiores que podrían incluir un controlador de dispositivo multimedia extraíble subyacente, el controlador de asignación debe establecer el contexto de subproceso en cada IRP que asigne.