IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)

IOCTL_ATA_PASS_THROUGH_DIRECT permite que um aplicativo envie quase qualquer comando do ATA para um dispositivo de destino, com as seguintes restrições:

  • Se existir um driver de classe para o tipo de dispositivo de destino, o aplicativo deverá enviar a solicitação para o driver de classe. Portanto, um aplicativo poderá enviar essa solicitação diretamente ao driver de porta do sistema para uma unidade lógica de destino somente se não houver nenhum driver de classe para o dispositivo.

  • O aplicativo deve usar essa solicitação em vez de IOCTL_ATA_PASS_THROUGH se o comando do ATA inserido puder exigir que o driver de miniporto subjacente acesse a memória diretamente.

Se o comando do ATA solicitar uma operação de transferência de dados, o chamador deverá configurar um buffer alinhado ao cache do qual, ou para o qual, o driver pode transferir dados diretamente. O chamador deve garantir o seguinte:

  • O comprimento da transferência de dados atende ao requisito de alinhamento de E/S do dispositivo; caso contrário, essa IOCTL falhará com STATUS_INVALID_PARAMETER.
  • O comprimento da transferência de dados não deve ser maior que o comprimento máximo de transferência de E/S do dispositivo; caso contrário, espera-se que o dispositivo falhe na solicitação.

A solicitação IOCTL_ATA_PASS_THROUGH_DIRECT normalmente é usada para transferir grandes quantidades de dados (mais de 16 KB).

Código principal

IRP_MJ_DEVICE_CONTROL

Buffer de entrada

O buffer em Irp-AssociatedIrp.SystemBuffer> contém uma estrutura ATA_PASS_THROUGH_DIRECT que inclui um conjunto de registros de entrada de arquivo de tarefa que indicam o tipo de comando a ser executado. O chamador deve inicializar todos os membros dessa estrutura, exceto PathId, TargetId e Lun, que o driver de porta preenche. Para um comando de saída de dados, o membro DataBuffer do ATA_PASS_THROUGH_DIRECT deve apontar para um buffer alinhado ao cache que contém os dados a serem gravados.

Comprimento do buffer de entrada

Parameters.DeviceIoControl.InputBufferLength indica o tamanho em bytes do buffer em Irp-AssociatedIrp.SystemBuffer>. O valor de InputBufferLength é fixo e não depende da quantidade de dados transferidos. É igual a sizeof(ATA_PASS_THROUGH_DIRECT). Se o tamanho do buffer for menor que sizeof(ATA_PASS_THROUGH_DIRECT),o driver de porta falhará na solicitação de E/S e retornará um erro.

Buffer de saída

O driver de porta formata os dados de retorno usando uma estrutura ATA_PASS_THROUGH_DIRECT que armazena no buffer em Irp-AssociatedIrp.SystemBuffer>.

O driver de porta armazena os dados transferidos no buffer alinhado ao cache apontado pelo membro DataBuffer do ATA_PASS_THROUGH_DIRECT.

O driver de porta preenche o membro CurrentTaskFile de ATA_PASS_THROUGH_DIRECT com os valores presentes nos registros de saída do dispositivo na conclusão do comando do ATA. O aplicativo é responsável por interpretar o conteúdo dos registros de saída para determinar quais erros, se houver, foram retornados pelo dispositivo.

Comprimento do buffer de saída

O driver de porta atualiza o membro DataTransferLength da estrutura ATA_PASS_THROUGH_DIRECT para indicar a quantidade de dados que foram transferidos do dispositivo.

Buffer de entrada/saída

Nenhum.

Comprimento do buffer de entrada/saída

Não aplicável.

Bloco de status

O membro Information é definido como o número de bytes retornados no buffer de saída em Irp-AssociatedIrp.SystemBuffer>. O membro Status é definido como STATUS_SUCCESS ou possivelmente para STATUS_BUFFER_TOO_SMALL ou STATUS_INVALID_PARAMETER se o valor length de entrada em ATA_PASS_THROUGH_DIRECT estiver definido incorretamente.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Server 2003
Cabeçalho ntddscsi.h (inclua Ntddscsi.h)

Confira também

ATA_PASS_THROUGH_DIRECT

IOCTL_ATA_PASS_THROUGH