Compartir a través de


DispatchReadWrite en controladores de Higher-Level

Excepto en el caso de los controladores del sistema de archivos, un controlador de nivel superior normalmente no tiene ninguna cola de controladores interna para irP. La rutina DispatchReadWrite de este controlador puede pasar IRP con parámetros válidos en para reducir los controladores, posiblemente después de configurar su rutina de IoCompletion , como se describe en Paso de IRP a la pila de controladores.

Sin embargo, la rutina DispatchReadWrite de un controlador de clase SCSI es responsable de dividir las solicitudes de transferencia grandes, si es necesario, antes de enviar un IRP con el código de función principal IRP_MJ_READ o IRP_MJ_WRITE al par de controladores de puerto/miniport SCSI. Para obtener más información, vea Rutina SplitTransferRequest del controlador de clase de almacenamiento.

Si un controlador de nivel superior asigna uno o varios IRP, que configura para el controlador inferior siguiente en su rutina DispatchReadWrite , para solicitar cierto número de transferencias parciales, la rutina DispatchReadWrite debe llamar a IoSetCompletionRoutine con cada IRP asignado por el controlador. El controlador debe registrar su rutina de IoCompletion para realizar un seguimiento de la cantidad de datos que se transfieren en cada operación de transferencia parcial para que la rutina ioCompletion pueda liberar todos los IRP asignados por el controlador y, finalmente, completar la solicitud original.

Si el controlador subyacente controla un dispositivo multimedia extraíble, los IRP asignados por el controlador de nivel superior deben tener un contexto de subproceso. Para configurar un contexto de subproceso, el controlador de asignación debe establecer irp-Tail.Overlay>. Subproceso en cada IRP recién asignado desde el mismo valor en el IRP de transferencia entrante. Para obtener más información, vea Compatibilidad con medios extraíbles.

Si el controlador de dispositivo subyacente devuelve un IRP para una transferencia parcial con un error, la rutina ioCompletion puede reintentar la solicitud de transferencia parcial o completar el IRP original con su bloque de estado de E/S establecido con el error devuelto, después de liberar los IRP y la memoria que haya asignado el controlador de nivel superior.

Si una rutina DispatchReadWrite de un controlador de nivel superior asigna memoria para las operaciones de transferencia parcial y la rutina IoCompletion del controlador (o por el controlador de dispositivo subyacente), la rutina DispatchReadWrite debe asignar esa memoria del grupo no paginado.