Partilhar via


Quando Verificar a Localização da Pilha de E/S do Driver

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

A rotina de despacho do motorista deve verificar a localização da pilha de E/S do motorista para que o IRP determine o que fazer se alguma das seguintes condições se mantiver:

  • A rotina de despacho lida com mais de um código de função de E/S principal.

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

  • A rotina de despacho de um driver de dispositivo ou de um driver de nível superior intimamente acoplado lida com solicitações de IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL, 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, a sua rotina de despacho chama IoGetCurrentIrpStackLocation.

As rotinas de despacho de drivers de nível mais alto sempre chamam IoGetCurrentIrpStackLocation e também chamam IoGetNextIrpStackLocation para obter um ponteiro para o local da pilha de E/S do próximo driver inferior para IRPs que eles configuram para o driver inferior seguinte, quando passando IRPs pela pilha de drivers.

A rotina DispatchDeviceControl ou DispatchInternalDeviceControl de um driver de dispositivo, ou possivelmente de seus respetivos drivers de classe intimamente acoplados, deve determinar qual código de controlo 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 a solicitação de IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL para o driver inferior seguinte, depois de configurar o seu local de pilha no IRP. No entanto, os drivers de classe SCSI devem verificar determinados códigos de controle de E/S da porta SCSI para que possam configurar corretamente o local da pilha de E/S do driver de porta SCSI antes de passar essas solicitações.