Solicitud de E/S de ejemplo: los detalles
La ilustración que ilustra la apertura de un objeto de archivo muestra un IRP con dos ubicaciones de pila de E/S, pero un IRP puede tener cualquier número de ubicaciones de pila de E/S, en función del número de controladores en capas que controlarán una solicitud determinada.
En la ilustración siguiente se muestra con más detalle cómo los controladores de la figura Abrir un objeto de archivo usan rutinas de compatibilidad de E/S (rutinas de IoXxx ) para procesar el IRP para una solicitud de lectura o escritura.
El administrador de E/S llama al controlador del sistema de archivos (FSD) con el IRP que ha asignado para la solicitud de lectura y escritura del subsistema. El FSD accede a su ubicación de pila de E/S en el IRP para determinar qué operación debe llevar a cabo.
El FSD puede dividir la solicitud original en solicitudes más pequeñas (posiblemente para más de un controlador de dispositivo) mediante una llamada a una rutina de soporte técnico de E/S (IoAllocateIrp) una o varias veces para asignar IRP adicionales. Los IRP adicionales se devuelven al FSD con ubicaciones de pila de E/S llenas de cero para controladores de nivel inferior. A su discreción, el FSD puede reutilizar el IRP original, en lugar de asignar IRP adicionales como se muestra en la ilustración anterior, configurando la ubicación de pila de E/S del controlador siguiente inferior en el IRP original y pasándola a controladores inferiores.
Para cada IRP asignado por el controlador, el FSD de la figura anterior llama a una rutina de soporte de E/S para registrar una rutina de finalización proporcionada por FSD; en la rutina de finalización, el FSD puede determinar si los controladores inferiores cumplen la solicitud y pueden liberar cada IRP asignado por el controlador cuando los controladores inferiores lo hayan completado. El administrador de E/S llamará a la rutina de finalización proporcionada por FSD si cada IRP asignado al controlador se completó correctamente, se completó con un estado de error o se canceló. Un controlador de nivel superior es responsable de liberar los IRP que asigna y configura en su propio nombre para los controladores de nivel inferior. El administrador de E/S libera los IRP que asigna después de que todos los controladores los hayan completado.
A continuación, el FSD llama a una rutina de compatibilidad de E/S (IoGetNextIrpStackLocation) para acceder a la ubicación de pila de E/S del controlador de nivel inferior siguiente para configurar la solicitud para el controlador siguiente inferior. (En la ilustración anterior, el siguiente controlador inferior es el controlador de nivel más bajo). A continuación, el FSD llama a una rutina de compatibilidad de E/S (IoCallDriver) para pasar ese IRP al controlador siguiente inferior.
Cuando se llama con el IRP, el controlador de nivel más bajo comprueba su ubicación de pila de E/S para determinar qué operación (indicada por el código de función IRP_MJ_XXX ) debe llevar a cabo en el dispositivo de destino. El dispositivo de destino se representa mediante el objeto de dispositivo en su ubicación de pila de E/S designada y se pasa con irP al controlador. El controlador de nivel más bajo puede suponer que el administrador de E/S ha enrutado el IRP a un punto de entrada que el controlador definió para la operación IRP_MJ_XXX (aquí IRP_MJ_READ o IRP_MJ_WRITE) y que el controlador de nivel superior ha comprobado la validez de otros parámetros para la solicitud.
Si no hubiera ningún controlador de nivel superior, el controlador de nivel inferior comprobaría si los parámetros de entrada de una operación IRP_MJ_XXX son válidos. Si lo son, el controlador suele llamar a rutinas de soporte técnico de E/S para indicar al administrador de E/S que una operación de dispositivo está pendiente en el IRP y poner en cola el IRP o pasarla a otra rutina proporcionada por el controlador que accede al dispositivo de destino (aquí, un dispositivo físico o lógico: el disco o una partición en el disco).
El administrador de E/S determina si el controlador ya está ocupado procesando otro IRP para el dispositivo de destino, pone en cola el IRP si es y devuelve. De lo contrario, el administrador de E/S enruta el IRP a una rutina proporcionada por el controlador que inicia la operación de E/S en su dispositivo. (En esta fase, ambos controladores de la figura anterior y el control de retorno del administrador de E/S).
Cuando se interrumpe el dispositivo, la rutina de servicio de interrupción del controlador (ISR) solo funciona tanto como debe para impedir que el dispositivo interrumpa y guarde el contexto necesario sobre la operación. A continuación, el ISR llama a una rutina de compatibilidad de E/S (IoRequestDpc) con irP para poner en cola una rutina DPC (llamada a procedimiento diferido) proporcionada por el controlador para completar la operación solicitada con una prioridad de hardware inferior a la ISR.
Cuando el DPC del controlador obtiene el control, usa el contexto (pasado en la llamada del ISR a IoRequestDpc) para completar la operación de E/S. El DPC llama a una rutina de soporte técnico para quitar de la cola el siguiente IRP (si existe) y para pasar ese IRP a la rutina proporcionada por el controlador que inicia operaciones de E/S en el dispositivo (consulte el paso 5). A continuación, el DPC establece el estado de la operación just-completed en el bloque de estado de E/S de IRP y lo devuelve al administrador de E/S con IoCompleteRequest.
El administrador de E/S cero la ubicación de pila de E/S del controlador de nivel más bajo en el IRP y llama a la rutina de finalización registrada del sistema de archivos (consulte el paso 3) con el IRP asignado por FSD. Esta rutina de finalización comprueba el bloque de estado de E/S para determinar si se debe reintentar la solicitud o actualizar cualquier estado interno mantenido sobre la solicitud original y liberar su IRP asignado por el controlador. El sistema de archivos puede recopilar información de estado de todos los IRP asignados por el controlador que envía a controladores de nivel inferior para que pueda establecer el estado de E/S y completar el IRP original. Cuando el sistema de archivos ha completado el IRP original, el administrador de E/S devuelve y el valor NTSTATUS al solicitante original (la función nativa del subsistema) de la operación de E/S.
Al igual que el controlador del sistema de archivos que se muestra en la figura Procesar IRP en controladores superpuestas , cualquier controlador nuevo que se agregue a una cadena de controladores existentes puede hacer lo siguiente:
Establezca su propia rutina de finalización en un IRP. La rutina IoCompletion comprueba el bloque de estado de E/S para determinar si los controladores inferiores completaron correctamente el IRP, cancelaron el IRP o lo completaron con un error. La rutina de finalización también puede actualizar cualquier estado específico del IRP que el controlador haya guardado, liberar los recursos específicos de la operación que el controlador haya asignado, etc., antes de completar el IRP. Además, la rutina de finalización puede posponer la finalización de IRP (informando al administrador de E/S de que se requiere más procesamiento en el IRP) y puede enviar otra solicitud al controlador de siguiente nivel inferior antes de permitir que el IRP se complete.
Configure la ubicación de pila de E/S del controlador de nivel inferior siguiente en los IRP que asigna y envía solicitudes al controlador de nivel inferior siguiente.
Pase las solicitudes entrantes en a controladores inferiores configurando la ubicación de pila de E/S del controlador siguiente en cada IRP y llamando a IoCallDriver. (Tenga en cuenta que para irP con código de función principal IRP_MJ_POWER, los controladores deben usar PoCallDriver).
Cada objeto de dispositivo creado por el controlador representa un dispositivo físico, lógico o virtual para el que un controlador determinado realiza solicitudes de E/S. Para obtener información detallada sobre cómo crear y configurar un objeto de dispositivo, consulte Objetos de dispositivo y Pilas de dispositivos.
Como también se muestra en la ilustración IRP de procesamiento de controladores en capas , la mayoría de los controladores procesan cada IRP en fases a través de un conjunto proporcionado por el controlador de rutinas estándar definidas por el sistema, pero los controladores en distintos niveles de una cadena necesariamente tienen rutinas estándar diferentes. Por ejemplo, solo los controladores de nivel más bajo controlan las interrupciones de un dispositivo físico, por lo que solo un controlador de nivel inferior tendría un ISR y un DPC que completa las operaciones de E/S controladas por interrupciones. Por otro lado, dado que este controlador sabe que la E/S está completa cuando recibe una interrupción de su dispositivo, no tiene necesidad de una rutina de finalización. Solo un controlador de nivel superior tendría una o varias rutinas de finalización como FSD en esta figura.