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 houver um driver de classe para o tipo de destino do dispositivo, o aplicativo deverá enviar a solicitação para o driver de classe. Assim, um aplicativo pode 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 a cache do qual, ou no 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, esse IOCTL falhará com STATUS_INVALID_PARAMETER.
- O comprimento de transferência de dados não deve ser maior que o tamanho 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
Buffer de entrada
O buffer em >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 DataBuffer membro do ATA_PASS_THROUGH_DIRECT deve apontar para um buffer alinhado a 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 >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 de ATA_PASS_THROUGH_DIRECT que ele armazena no buffer em >AssociatedIrp.SystemBuffer.
O driver de porta armazena os dados transferidos no buffer alinhado ao cache apontado pelo DataBuffer membro do ATA_PASS_THROUGH_DIRECT.
O driver de porta preenche o CurrentTaskFile membro do 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 DataTransferLength membro 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 de Informações é definido como o número de bytes retornados no buffer de saída em >AssociatedIrp.SystemBuffer. O membro status de é definido como STATUS_SUCCESS ou possivelmente STATUS_BUFFER_TOO_SMALL ou STATUS_INVALID_PARAMETER se o valor de de comprimento de de entrada no ATA_PASS_THROUGH_DIRECT for definido incorretamente.
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows Server 2003 |
cabeçalho | ntddscsi.h (include Ntddscsi.h) |