IRP_MJ_DEVICE_CONTROL (FS e drivers de filtro)

Quando enviado

O Gerenciador de E/S, outros componentes do sistema operacional e outros drivers de modo kernel enviam IRP_MJ_DEVICE_CONTROL solicitações. Normalmente, esse IRP é enviado em nome de um aplicativo de modo de usuário que chamou a função DeviceIoControl win32 ou em nome de um componente de modo kernel que chamou ZwDeviceIoControlFile.

Operação: Drivers do sistema de arquivos

O driver do sistema de arquivos deve extrair e decodificar o objeto de arquivo para determinar se a solicitação foi emitida em um identificador que é um volume aberto. Nesse caso, o driver do sistema de arquivos deve passar o IRP para o driver de dispositivo para o dispositivo de armazenamento no qual o volume está montado. Caso contrário, o driver deve falhar no IRP.

Operação: Drivers de filtro do sistema de arquivos herdado

O driver de filtro deve executar qualquer processamento necessário e, dependendo da natureza do filtro, concluir o IRP ou passá-lo para o driver inferior na pilha.

Parâmetros

Um sistema de arquivos ou driver de filtro chama IoGetCurrentIrpStackLocation para o IRP fornecido para obter um ponteiro para seu próprio local de pilha no IRP. Nos parâmetros a seguir, Irp aponta para os pontos IRP e IrpSp para o IO_STACK_LOCATION. O driver pode usar as informações definidas nos membros a seguir do IRP e do local da pilha IRP para processar uma solicitação de controle de dispositivo.

  • DeviceObject é um ponteiro para o objeto de dispositivo de destino.

  • Irp->AssociatedIrp.SystemBuffer aponta para um buffer de entrada fornecido pelo sistema a ser passado para o driver de dispositivo para o dispositivo de destino. Usado para E/S METHOD_BUFFERED ou METHOD_DIRECT. Se esse parâmetro é necessário depende do código de controle de E/S específico.

  • Irp->IoStatus aponta para uma estrutura IO_STATUS_BLOCK que recebe a status de conclusão final e informações sobre a operação solicitada. Para obter mais informações, consulte a descrição do parâmetro IoStatusBlock para ZwDeviceIoControlFile.

  • Irp->MdlAddress é o endereço de uma MDL (lista de descritores de memória) que descreve um buffer de saída a ser passado para o driver de dispositivo para o dispositivo de destino. Usado para METHOD_DIRECT E/S. Se esse parâmetro é necessário depende do código de controle de E/S específico.

  • Irp->RequestorMode indica o modo de execução do processo que solicitou a operação, KernelMode ou UserMode.

  • Irp->UserBuffer aponta para um buffer de saída fornecido pelo chamador a ser passado para o driver de dispositivo para o dispositivo de destino. Usado para E/S METHOD_BUFFERED ou METHOD_NEITHER. Se esse parâmetro é opcional ou necessário depende do código de controle de E/S específico.

  • IrpSp->FileObject aponta para o objeto de arquivo associado a DeviceObject.

    O parâmetro IrpSp-FileObject> contém um ponteiro para o campo RelatedFileObject, que também é uma estrutura FILE_OBJECT. O campo RelatedFileObject da estrutura FILE_OBJECT não é válido durante o processamento de IRP_MJ_DEVICE_CONTROL e não deve ser usado.

  • IrpSp->MajorFunction está definido como IRP_MJ_DEVICE_CONTROL.

  • IrpSp->Parameters.DeviceIoControl.InputBufferLength é o tamanho em bytes do buffer apontado por Irp-AssociatedIrp.SystemBuffer>.

  • IrpSp->Parameters.DeviceIoControl.IoControlCode é o código de função IOCTL a ser passado para o driver de dispositivo para o dispositivo de destino.

    Para obter informações detalhadas sobre solicitações IOCTL, consulte Usando códigos de controle de E/S e "Códigos de controle de entrada e saída do dispositivo" na documentação do SDK do Windows.

  • IrpSp->Parameters.DeviceIoControl.OutputBufferLength é o tamanho em bytes do buffer apontado por Irp-UserBuffer>.

  • IrpSp->Parameters.DeviceIoControl.Type3InputBuffer é o buffer de entrada para solicitações de modo kernel que usam METHOD_NEITHER.

Confira também

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL (Referência de Kernel do WDK)

Usando códigos de controle de E/S

ZwDeviceIoControlFile