Compartir a través de


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, de una cadena de controladores en capas, comprobar los parámetros de IRP de lectura y escritura entrantes para verificar la validez antes de configurar la ubicación de pila de E/S del controlador de nivel inferior en un IRP.

  • Por lo general, los controladores intermedios y de nivel más bajo pueden depender del controlador de nivel más alto 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 ubicación de pila de E/S con un valor de tipo NTSTATUS adecuado, establecer el miembro Information en cero y, a continuación, llamar a IoCompleteRequest con el IRP y un 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 es posible que tenga que 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 en 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 bajo nivel debe posponer la división de una solicitud de transferencia grande en transferencias parciales hasta que otra rutina del controlador desencola el IRP para preparar el dispositivo para la transferencia.

  • Si un controlador de dispositivo de nivel inferior pone en cola un IRP de lectura/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 inmediatamente inferior en el IRP. Si el controlador superior también establece una rutina de IoCompletion en el IRP antes de pasarlo con IoCallDriver depende del diseño del controlador y de aquellos que están superpuestos bajo é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 IoCompletion debe liberar los recursos asignados por los 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.