Cuándo comprobar la ubicación de la pila de E/S del controlador

Se establece un código de función de E/S principal en la ubicación de pila de E/S del controlador para cada IRP entrante.

La rutina de envío de un controlador debe comprobar la ubicación de la pila de E/S del controlador para que el IRP determine qué hacer si alguna de las condiciones siguientes contiene:

  • La rutina de distribución controla más de un código de función de E/S principal.

  • La rutina de distribución debe controlar un conjunto de códigos de función menores para determinados códigos de función principales. Los IRP con códigos de función menores incluyen IRP_MJ_PNP y IRP_MJ_POWER, así como ciertos IRP que deben controlar el controlador de puerto SCSI y los controladores del sistema de archivos.

  • La rutina de envío de un controlador de dispositivo o de un controlador de nivel superior estrechamente acoplado controla IRP_MJ_DEVICE_CONTROL o solicitudes de IRP_MJ_INTERNAL_DEVICE_CONTROL , que tienen un conjunto asociado de códigos de control de E/S.

Para obtener un puntero a la ubicación de pila de E/S de un controlador, su rutina de envío llama a IoGetCurrentIrpStackLocation.

Las rutinas de distribución de los controladores de nivel superior siempre llaman a IoGetCurrentIrpStackLocation y también llaman a IoGetNextIrpStackLocation para obtener un puntero a la ubicación de pila de E/S del controlador siguiente inferior para irP que configuran para el siguiente controlador inferior, al pasar irP a la pila de controladores.

La rutina DispatchDeviceControl o dispatchInternalDeviceControl de un controlador de dispositivo, o posiblemente de sus controladores de clase estrechamente acoplados, debe determinar qué código de control de E/S se establece en la ubicación de la pila de E/S del controlador en Parameters.DeviceIoControl.IoControlCode para cada solicitud. El código de control de E/S se encuentra en la ubicación de la pila de E/S del controlador.

En la mayoría de los casos, la rutina DispatchDeviceControl o DispatchInternalDeviceControl de un controlador de nivel superior simplemente pasa una solicitud de IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL al controlador siguiente inferior, después de configurar su ubicación de pila en irP. Sin embargo, los controladores de clase SCSI deben comprobar si hay determinados códigos de control de E /S de puerto SCSI para que puedan configurar la ubicación de pila de E/S del controlador de puerto SCSI correctamente antes de pasar estas solicitudes.