Compartilhar via


IOCTL_SCSI_PASS_THROUGH IOCTL (ntddscsi.h)

Permite que um aplicativo envie quase qualquer comando SCSI para um dispositivo de destino, com as seguintes restrições:

  • Comandos multitarget, como COPY, não são permitidos.
  • Não há suporte para operações de transferência de dados bidirecionais.
  • Se existir um driver de classe para o tipo de dispositivo de destino, a solicitação deverá ser enviada para esse driver de classe. Portanto, um aplicativo poderá enviar essa solicitação diretamente ao driver de porta do sistema para uma LU (unidade lógica) de destino somente se não houver nenhum driver de classe para o tipo de dispositivo conectado a essa LU. O driver de porta do sistema não marcar determinar se um dispositivo foi reivindicado por um driver de classe antes de processar uma solicitação de passagem. Portanto, se um aplicativo ignorar um driver de classe que reivindicou um dispositivo e enviar uma solicitação de passagem para esse dispositivo diretamente para o driver de porta, um conflito para o controle do dispositivo poderá ocorrer entre o driver de classe e o aplicativo. Se uma solicitação de passagem for enviada para um objeto de dispositivo de adaptador e se ela for originada do modo de usuário e for direcionada a uma LU que é reivindicada por um driver de classe, o Storport falhará na solicitação com STATUS_INVALID_DEVICE_REQUEST. Se a solicitação for enviada a um objeto de dispositivo LU, originada no modo kernel ou se destinar a uma LU não reclamada, ela será passada para o driver de miniporto.
  • Essa solicitação não poderá ser usada se o CDB puder exigir que o driver de miniporto subjacente acesse a memória diretamente. Se o CDB do chamador puder exigir acesso direto à memória, use IOCTL_SCSI_PASS_THROUGH_DIRECT em vez disso.
  • Os aplicativos não devem tentar enviar uma solicitação de passagem de forma assíncrona. Todas as solicitações de passagem devem ser síncronas.
  • Os aplicativos não exigem privilégios administrativos para enviar uma solicitação de passagem para um dispositivo, mas devem ter acesso de leitura/gravação ao dispositivo.
O aplicativo de chamada cria o bloco do descritor de comando SCSI, que pode incluir uma solicitação de dados de sentido de solicitação se ocorrer uma CHECK CONDITION.

IOCTL_SCSI_PASS_THROUGH é uma solicitação de controle de dispositivo em buffer. Para ignorar o buffer na memória do sistema, os chamadores devem usar IOCTL_SCSI_PASS_THROUGH_DIRECT. Ao lidar com uma solicitação de IOCTL_SCSI_PASS_THROUGH_DIRECT , o sistema bloqueia o buffer na memória do usuário e o dispositivo acessa essa memória diretamente.

Essa solicitação normalmente é usada para transferir pequenas quantidades de dados (<16K).

Os aplicativos podem enviar essa solicitação por meio de uma solicitação IRP_MJ_DEVICE_CONTROL .

Os drivers de classe de armazenamento definem o número irp secundário como IRP_MN_SCSI_CLASS para indicar que a solicitação foi processada por um driver de classe de armazenamento.

Nota O driver de porta SCSI e os modelos de driver de miniporta SCSI podem ser alterados ou indisponíveis no futuro. Em vez disso, recomendamos usar os modelos de driver storport e driver de miniporto Storport .
 

Código principal

IRP_MJ_DEVICE_CONTROL

Buffer de entrada

Essa estrutura inclui uma CDB SCSI, que deve ser inicializada pelo chamador, exceto pelo caminho, pela ID de destino e pelo LUN (número de unidade lógica), que são preenchidos pelo driver de porta. Para um comando de saída de dados, os dados a serem transferidos são incluídos no buffer em Irp-AssociatedIrp.SystemBuffer> em DataBufferOffset na estrutura SCSI_PASS_THROUGH. No entanto, o chamador deve alocar armazenamento adicional, imediatamente após SCSI_PASS_THROUGH, se o chamador solicitar dados de sentido de solicitação.

Comprimento do buffer de entrada

Parameters.DeviceIoControl.InputBufferLength indica o tamanho, em bytes, do buffer em Irp->AssociatedIrp.SystemBuffer, que deve ser pelo menos (sense data sizeof + (SCSI_PASS_THROUGH)). O tamanho da estrutura SCSI_PASS_THROUGH varia, dependendo de sua especificação DataTransferLength .

Buffer de saída

O driver de porta retorna todos os dados de sensor de solicitação e todos os dados transferidos do dispositivo para o buffer em Irp-AssociatedIrp.SystemBuffer>.

Comprimento do buffer de saída

O SenseInfoLength e o DataTransferLength na estrutura SCSI_PASS_THROUGH são atualizados para indicar a quantidade de dados transferidos.

Bloco de status

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

Requisitos

Requisito Valor
Cabeçalho ntddscsi.h (inclua Ntddscsi.h)

Confira também

SCSI_PASS_THROUGH