Quando verificar o local da pilha de E/S do driver

Um código de função de E/S principal é definido no local da pilha de E/S do driver para cada IRP de entrada.

A rotina de expedição de um driver deve marcar o local da pilha de E/S do driver para que o IRP determine o que fazer se alguma das seguintes condições mantiver:

  • A rotina de expedição manipula mais de um código de função de E/S principal.

  • A rotina de expedição deve lidar com um conjunto de códigos de função secundários para determinados códigos de função principais. Os IRPs com códigos de função secundários incluem IRP_MJ_PNP e IRP_MJ_POWER, bem como determinados IRPs que o driver de porta SCSI e os drivers do sistema de arquivos devem manipular.

  • A rotina de expedição de um driver de dispositivo ou de um driver de nível superior estreitamente acoplado manipula IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL solicitações, que têm um conjunto associado de códigos de controle de E/S.

Para obter um ponteiro para o local da pilha de E/S de um driver, sua rotina de expedição chama IoGetCurrentIrpStackLocation.

As rotinas de expedição de drivers de nível superior sempre chamam IoGetCurrentIrpStackLocation e também chamam IoGetNextIrpStackLocation para obter um ponteiro para o local de pilha de E/S do driver mais baixo para IRPs que eles configuram para o driver mais baixo, ao passar IRPs para baixo na pilha de driver.

A rotina DispatchDeviceControl ou a rotina DispatchInternalDeviceControl de um driver de dispositivo ou possivelmente de seus driveres de classe estreitamente acoplados devem determinar qual código de controle de E/S está definido no local da pilha de E/S do driver em Parameters.DeviceIoControl.IoControlCode para cada solicitação. O código de controle de E/S está contido no local da pilha de E/S do driver.

Na maioria dos casos, a rotina DispatchDeviceControl ou DispatchInternalDeviceControl de um driver de nível superior simplesmente passa uma solicitação de IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL para o driver mais baixo, depois de configurar seu local de pilha no IRP. No entanto, os drivers de classe SCSI devem marcar para determinados códigos de controle de E/S da Porta SCSI para que possam configurar o local de pilha de E/S do driver de porta SCSI corretamente antes de passar essas solicitações.