Rutinas de IoCompletion del controlador de clase storage
Un controlador de clase de almacenamiento debe tener una o varias rutinas de IoCompletion , a menos que el controlador espere sincrónicamente a que se complete cada IRP que envía al controlador de puerto, vuelva a intentar las solicitudes según sea necesario y, a continuación, libera la memoria de los SRB desde dentro de una rutina dispatch o BuildRequest . Tenga en cuenta que controlar cada IRP de forma sincrónica reducirá el rendimiento del controlador de clase. Además, los controladores de clase de almacenamiento para dispositivos que podrían contener el archivo de página del sistema deben controlar todas las solicitudes de transferencia de forma asincrónica y, por tanto, deben tener una rutina de IoCompletion para las solicitudes de lectura y escritura.
Como se describe en La rutina BuildRequest del controlador de clase de almacenamiento, los controladores de clase de almacenamiento son responsables de liberar la memoria que asignan para los SRB, ya sea de vuelta a una lista de búsqueda o a un grupo no paginado. Al igual que cualquier otro controlador de modo kernel de nivel superior, también son responsables de liberar los IRP que asignen, como un IRP para dividir una solicitud de transferencia, como se describe en La rutina SplitTransferRequest del controlador de clase de almacenamiento.
Una rutina de IoCompletion del controlador de clase es responsable en última instancia de asegurarse de que el bloque de estado de E/S está establecido y para completar el IRP original. Tenga en cuenta que completar un IRP puede incluir la traducción de un error devuelto en el miembro ScsiStatus de SRB o en el miembro SenseInfoBuffer en un valor de tipo NTSTATUS o registrando un error, como se describe en Finalización de IRP en rutinas de distribución.
Cuando se producen ciertos tipos de errores en el procesamiento de una solicitud, un controlador de puerto de almacenamiento inmoviliza su cola interna para la unidad lógica de destino (LU) y establece SRB_STATUS_QUEUE_FROZEN al finalizar la solicitud. Por lo tanto, los controladores de clase suelen tener rutinas internas para cambiar el estado de la cola para sus solicitudes de E/S del dispositivo. Para obtener más información, vea Storage Class Driver's ReleaseQueue Routine.
Si la rutina BuildRequest del controlador solicitó que el controlador de puerto devuelva información de detección de solicitudes para una solicitud, su rutina ioCompletion llama a una rutina interna interpretRequestSense o implementa la misma funcionalidad insertada. Para obtener más información, vea Rutina InterpretRequestSense del controlador de clase de almacenamiento.
Los controladores de clase de almacenamiento son responsables de reintentar solicitudes que producen errores debido a errores del controlador de destino, restablecimientos de bus o tiempos de espera de solicitud. Cuando el controlador de puerto devuelve una solicitud determinada con su SrbStatus establecido para indicar este error, el controlador de clase puede llamar a una rutina RetryRequest desde su rutina de IoCompletion o, posiblemente, desde su rutina InterpretRequestSense . Para obtener más información, vea Rutina RetryRequest del controlador de clase de almacenamiento.
Para obtener información general sobre las rutinas de IoCompletion , consulte Finalización de IRP.