Compartilhar via


Descrições de buffer para códigos de controle de E/S

Os códigos de controle de E/S estão contidos em solicitações de IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL . O gerenciador de E/S cria essas solicitações como resultado de chamadas para DeviceIoControl e IoBuildDeviceIoControlRequest.

Como DeviceIoControl e IoBuildDeviceIoControlRequest aceitam um buffer de entrada e um buffer de saída como argumentos, todas as solicitações IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL fornecem um buffer de entrada e um buffer de saída. A maneira como o sistema descreve esses buffers depende do tipo de transferência de dados. O tipo de transferência é especificado pelo valor TransferType na macro CTL_CODE que cria valores de código IOCTL.

O sistema descreve buffers para cada valor TransferType da seguinte maneira.

METHOD_BUFFERED

Para esse tipo de transferência, os IRPs fornecem um ponteiro para um buffer em Irp-AssociatedIrp.SystemBuffer>. Esse buffer representa o buffer de entrada e o buffer de saída especificados em chamadas para DeviceIoControl e IoBuildDeviceIoControlRequest. O driver transfere dados de e, em seguida, para esse buffer.

Para dados de entrada, o tamanho do buffer é especificado por Parameters.DeviceIoControl.InputBufferLength na estrutura de IO_STACK_LOCATION do driver. Para dados de saída, o tamanho do buffer é especificado por Parameters.DeviceIoControl.OutputBufferLength na estrutura de IO_STACK_LOCATION do driver.

O tamanho do espaço alocado pelo sistema para o buffer de entrada/saída único é o maior dos dois valores de comprimento.

METHOD_IN_DIRECT ou METHOD_OUT_DIRECT

Para esses tipos de transferência, os IRPs fornecem um ponteiro para um buffer em Irp-AssociatedIrp.SystemBuffer>. Isso representa o primeiro buffer especificado em chamadas para DeviceIoControl e IoBuildDeviceIoControlRequest. O tamanho do buffer é especificado por Parameters.DeviceIoControl.InputBufferLength na estrutura de IO_STACK_LOCATION do driver.

Para esses tipos de transferência, os IRPs também fornecem um ponteiro para um MDL em Irp-MdlAddress>. Isso representa o segundo buffer especificado em chamadas para DeviceIoControl e IoBuildDeviceIoControlRequest. Esse buffer pode ser usado como um buffer de entrada ou um buffer de saída, da seguinte maneira:

  • METHOD_IN_DIRECT será especificado se o driver que manipula o IRP receber dados no buffer quando for chamado. O MDL descreve um buffer de entrada e especificar METHOD_IN_DIRECT garante que o thread em execução tenha acesso de leitura ao buffer.

  • METHOD_OUT_DIRECT será especificado se o driver que manipula o IRP gravará dados no buffer antes de concluir o IRP. O MDL descreve um buffer de saída e especificar METHOD_OUT_DIRECT garante que o thread em execução tenha acesso de gravação ao buffer.

Para ambos os tipos de transferência, Parameters.DeviceIoControl.OutputBufferLength especifica o tamanho do buffer descrito pelo MDL.

METHOD_NEITHER

O gerenciador de E/S não fornece buffers ou MDLs do sistema. O IRP fornece os endereços virtuais do modo de usuário dos buffers de entrada e saída especificados para DeviceIoControl ou IoBuildDeviceIoControlRequest, sem validá-los ou mapeá-los.

O endereço do buffer de entrada é fornecido por Parameters.DeviceIoControl.Type3InputBuffer na estrutura de IO_STACK_LOCATION do driver e o endereço do buffer de saída é especificado por Irp-UserBuffer>.

Os tamanhos de buffer são fornecidos por Parameters.DeviceIoControl.InputBufferLength e Parameters.DeviceIoControl.OutputBufferLength na estrutura de IO_STACK_LOCATION do driver.

Para obter mais informações sobre a macro CTL_CODE e os tipos de transferência listados acima, consulte Definindo códigos de controle de E/S.