Ubicaciones de pila de E/S
El administrador de E/S proporciona a cada controlador una cadena de controladores en capas una ubicación de pila de E/S para cada IRP que configure. Cada ubicación de pila de E/S consta de una estructura de IO_STACK_LOCATION .
El administrador de E/S crea una matriz de ubicaciones de pila de E/S para cada IRP, con un elemento de matriz correspondiente a cada controlador de una cadena de controladores en capas. Cada controlador posee una de las ubicaciones de pila del paquete y llama a IoGetCurrentIrpStackLocation para obtener información específica del controlador sobre la operación de E/S.
Cada controlador de esta cadena es responsable de llamar a IoGetNextIrpStackLocation y, a continuación, configurar la ubicación de pila de E/S del controlador inferior siguiente. Cualquier ubicación de pila de E/S del controlador de nivel superior también se puede usar para almacenar contexto sobre una operación para que la rutina ioCompletion del controlador pueda realizar sus operaciones de limpieza.
En la ilustración IrP de procesamiento de controladores en capas se muestran dos ubicaciones de pila de E/S en el IRP original porque muestra dos controladores, un controlador del sistema de archivos y un controlador de dispositivo de almacenamiento masivo. Los IRP asignados por el controlador en la ilustración IRP de procesamiento de controladores en capas no tienen una ubicación de pila para el FSD (controlador del sistema de archivos) que los creó. Cualquier controlador de nivel superior que asigne IRP para controladores de nivel inferior también determina cuántas ubicaciones de pila de E/S deben tener las nuevas IRP, según el valor StackSize del objeto de dispositivo del controlador inferior siguiente.
En la ilustración siguiente se muestra el contenido del IRP con más detalle.
Como se muestra en la ilustración, cada ubicación de pila de E/S específica del controlador en un IRP contiene la siguiente información general:
El código de función principal (IRP_MJ_XXX), que indica la operación básica que debe llevar a cabo el controlador.
Para algunos códigos de función principales administrados por FSD, controladores SCSI de nivel superior y todos los controladores PnP, un código de función menor (IRP_MN_XXX), que indica qué subcase de la operación básica que el controlador debe llevar a cabo
Un conjunto de argumentos específicos de la operación, como la longitud y la ubicación inicial de un búfer en el que o desde el que el controlador transfiere datos
Puntero al objeto de dispositivo creado por el controlador, que representa el dispositivo de destino (físico, lógico o virtual) para la operación solicitada.
Puntero al objeto de archivo, que representa un archivo abierto, un dispositivo, un directorio o un volumen
Un controlador del sistema de archivos accede al objeto de archivo a través de su ubicación de pila de E/S en IRP. Normalmente, otros controladores omiten el objeto de archivo.
El conjunto de códigos de función principal y secundaria de IRP que un controlador determinado puede ser específico del tipo de dispositivo. Sin embargo, los controladores de nivel más bajo y los controladores intermedios (incluidas las funciones PnP y los controladores de filtro) normalmente controlan el siguiente conjunto de solicitudes básicas:
IRP_MJ_CREATE : abra el objeto de dispositivo de destino, lo que indica que está presente y disponible para las operaciones de E/S.
IRP_MJ_READ : transferencia de datos desde el dispositivo
IRP_MJ_WRITE : transferencia de datos al dispositivo
IRP_MJ_DEVICE_CONTROL : configure (o restablezca) el dispositivo, según un código de control de E/S específico del tipo de dispositivo (IOCTL) definido por el sistema.
IRP_MJ_CLOSE : cierre el objeto de dispositivo de destino.
IRP_MJ_PNP: realice una operación de Plug and Play en el dispositivo. El administrador de PnP envía una solicitud de IRP_MJ_PNP a través del administrador de E/S.
IRP_MJ_POWER: realice una operación de alimentación en el dispositivo. El administrador de energía envía una solicitud IRP_MJ_POWER a través del administrador de E/S.
Para obtener más información sobre los principales códigos de función IRP que se requieren para controlar los controladores, consulte Códigos de función principales de IRP.
En general, el administrador de E/S envía IRP con al menos dos ubicaciones de pila de E/S a controladores de dispositivos de almacenamiento masivo porque un sistema de archivos se superpone a otros controladores para dispositivos de almacenamiento masivo. El administrador de E/S envía IRP con una única ubicación de pila a cualquier controlador que no tenga ningún otro controlador por encima de él.
Sin embargo, el administrador de E/S proporciona compatibilidad para agregar un nuevo controlador a cualquier cadena de controladores existentes en el sistema. Por ejemplo, un controlador reflejado intermedio que realiza una copia de seguridad de los datos en una partición de disco determinada podría insertarse entre un par de controladores, como el controlador del sistema de archivos y el controlador de nivel inferior que se muestra en la figura Procesamiento de IRP en controladores en capas . Cuando este nuevo controlador se asocia a la pila de dispositivos, el administrador de E/S ajusta el número de ubicaciones de pila de E/S en todos los IRP que envía al sistema de archivos, al reflejo y a los controladores de nivel más bajo. Cada IRP que el sistema de archivos de los IRP de procesamiento en la figura Controladores en capas asignado también contendrá otra ubicación de pila de E/S para un nuevo controlador reflejado.
Tenga en cuenta que esta compatibilidad para agregar controladores nuevos a una cadena existente implica ciertas restricciones en el acceso de cualquier controlador concreto a las ubicaciones de pila de E/S en irP:
Un controlador de nivel superior en una cadena de controladores superpuestas solo puede acceder de forma segura a sus propias ubicaciones de pila de E/S del controlador de nivel inferior en cualquier IRP. Este controlador debe configurar la ubicación de la pila de E/S para el controlador de nivel inferior siguiente en IRP. Sin embargo, al diseñar un controlador de nivel superior, no se puede predecir cuándo (o si) se agregará un nuevo controlador a la cadena existente justo debajo del controlador.
Por lo tanto, debe suponer que cualquier controlador agregado posteriormente controlará los mismos códigos de función principales de IRP (IRP_MJ_XXX) que el controlador de nivel inferior desplazado.
El controlador de nivel más bajo de una cadena de controladores superpuestas solo puede acceder de forma segura a su propia ubicación de pila de E/S en cualquier IRP. Al diseñar este controlador, no puede predecir cuándo (o si) se agregará un nuevo controlador a la cadena existente encima del controlador del dispositivo.
En el diseño de un controlador de nivel inferior, supongamos que el controlador puede seguir procesando IRP mediante la información pasada en su propia ubicación de pila de E/S, sea cual sea el origen de origen de un IRP determinado y, sin embargo, muchos controladores están superpuestas por encima de él.