IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)

A solicitação de código de controle IOCTL_SCSI_PASS_THROUGH_EX é a versão estendida da solicitação de IOCTL_SCSI_PASS_THROUGH . Essa solicitação fornece suporte para transferências de dados bidirecionais e permite um bloco de dados de comando (CDB) > de 16 bytes.

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.
  • 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_EX .
  • 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_EX é 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_EX. Ao lidar com uma solicitação de IOCTL_SCSI_PASS_THROUGH_DIRECT_EX , 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 DataInBufferOffset na estrutura SCSI_PASS_THROUGH_EX. No entanto, o chamador deve alocar armazenamento adicional, imediatamente após SCSI_PASS_THROUGH_EX, 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_EX)). O tamanho da estrutura SCSI_PASS_THROUGH_EX varia, dependendo do valor especificado em DataInTransferLength .

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>. O SenseInfoLength e o DataOutTransferLength na estrutura SCSI_PASS_THROUGH_EX são atualizados para indicar a quantidade de dados transferidos.

Comprimento do buffer de saída

O SenseInfoLength e o DataOutTransferLength na estrutura SCSI_PASS_THROUGH_EX 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_EX estiver definido incorretamente.

Comentários

Para emitir uma solicitação de IOCTL_SCSI_PASS_THROUGH_EX , o dispositivo de armazenamento subjacente deve dar suporte a SRBs estendidos. Isso significa que o tipo SRB com suporte é SRB_TYPE_STORAGE_REQUEST_BLOCK. Um aplicativo pode consultar o suporte a SRB com a solicitação IOCTL_STORAGE_QUERY_PROPERTY com um tipo de consulta PropertyStandardQuery e um tipo de propriedade storageDeviceProperty. O membro SrbType retornado na estrutura STORAGE_ADAPTER_DESCRIPTIOR indicará SRB_TYPE_SCSI_REQUEST_BLOCK ou SRB_TYPE_STORAGE_REQUEST_BLOCK.

Requisitos

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

Confira também

SCSI_PASS_THROUGH_EX