IRP_MJ_DEVICE_CONTROL (IFS)

Quando enviado

A solicitação IRP_MJ_DEVICE_CONTROL é enviada pelo Gerenciador de E/S e outros componentes do sistema operacional, bem como outros drivers no modo kernel. Normalmente, esse IRP é enviado em nome de um aplicativo de modo de usuário que tenha chamado a função DeviceIoControl do Microsoft Win32 ou em nome de um componente do modo kernel chamado 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. Se esse for o caso, o driver do sistema de arquivos deverá passar o IRP para o driver de dispositivo para o dispositivo de armazenamento no qual o volume está montado. Caso contrário, o driver deverá falhar no IRP.

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

O driver de filtro deve executar qualquer processamento necessário e, dependendo da natureza do filtro, conclua o IRP ou passe-o para o driver mais baixo da 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, mostrado na lista a seguir como IrpSp. (O IRP é mostrado como Irp.) O driver pode usar as informações definidas nos seguintes membros do IRP e do local da pilha IRP no processamento de uma solicitação de controle de dispositivo:

DeviceObject
Ponteiro para o objeto de dispositivo de destino.

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

Irp-IoStatus>
Ponteiro para uma estrutura de IO_STATUS_BLOCK que recebe o 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>
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>
Ponteiro para um buffer de saída fornecido pelo chamador a ser passado para o driver de dispositivo para o dispositivo de destino. Usado para METHOD_BUFFERED ou METHOD_NEITHER E/S. Se esse parâmetro é opcional ou obrigatório depende do código de controle de E/S específico.

IrpSp-FileObject>
Ponteiro para o objeto de arquivo associado ao 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>
Especifica IRP_MJ_DEVICE_CONTROL.

IrpSp-Parameters.DeviceIoControl.InputBufferLength>
Tamanho em bytes do buffer apontado por Irp-AssociatedIrp.SystemBuffer>.

IrpSp-Parameters.DeviceIoControl.IoControlCode>
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 no Guia de Arquitetura do Modo Kernel e "Códigos de Controle de Entrada e Saída do Dispositivo" na documentação do SDK do Microsoft Windows.

IrpSp-Parameters.DeviceIoControl.OutputBufferLength>
Tamanho em bytes do buffer apontado por Irp-UserBuffer>.

IrpSp-Parameters.DeviceIoControl.Type3InputBuffer>
Buffer de entrada para solicitações no 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 do Kernel do WDK)

Usando códigos de controle de E/S

ZwDeviceIoControlFile