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.
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.
Código principal
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) |