Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El administrador de E/S proporciona a cada controlador en una cadena de controladores en capas una ubicación de pila de E/S para cada IRP que configura el administrador. Cada ubicación de pila de E/S consta de una estructura 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 siguiente inferior. 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 de IoCompletion del controlador pueda realizar sus operaciones de limpieza.
La figura Procesamiento de IRP en controladores en capas muestra dos ubicaciones en la 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 IRPs asignados por el controlador en la figura Procesamiento de IRPs en 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:
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 gestionados por las FSD, los controladores SCSI de nivel superior y todos los controladores PnP, un código de función menor (IRP_MN_XXX), que indica qué subcaso de la operación básica debe realizar el controlador.
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. Otros controladores normalmente omiten el objeto de archivo.
El conjunto de códigos de función principal y secundaria de IRP que maneja un controlador determinado puede ser específico para el tipo de dispositivo. Sin embargo, los controladores de nivel más bajo y los controladores intermedios (incluida la función 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 Plug and Play en el dispositivo. El administrador de PnP envía una solicitud 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 los controladores deben gestionar, consulte Códigos de función principales de IRP.
En general, el administrador de E/S envía IRPs con al menos dos ubicaciones de la pila de E/S a los controladores de dispositivos de almacenamiento masivo porque un sistema de archivos está superpuesto a otros controladores para dispositivos de almacenamiento masivo. El administrador de E/S envía IRP con una sola ubicación de pila a cualquier controlador que no tenga ningún otro controlador superpuesta 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 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 en la figura Procesamiento de IRP en Controladores Capas asigna también contendrá otra ubicación en la pila de E/S para un nuevo controlador de espejo.
Tenga en cuenta que esta compatibilidad para agregar nuevos controladores a una cadena existente implica ciertas restricciones en el acceso de cualquier controlador determinado a las ubicaciones de pila de E/S en irP:
Un controlador de nivel superior en una cadena de controladores en capas solo puede acceder de forma segura a sus propias ubicaciones de pila de E/S y a las del controlador del nivel inmediatamente 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 manejará los mismos códigos de función principales de IRP (IRP_MJ_XXX) que el controlador de siguiente nivel inferior desplazado.
El controlador de nivel más bajo de una cadena de controladores en capas 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 se puede predecir cuándo (o si) se agregará un nuevo controlador a la cadena existente por encima del controlador de dispositivo.
En el diseño de un controlador de nivel más bajo, 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 la fuente de un IRP determinado, e independientemente de cuántos controladores estén apilados sobre él.