Compartilhar via


estrutura SCSI_REQUEST_BLOCK (srb.h)

A estrutura SCSI_REQUEST_BLOCK está associada a uma função SRB.

Observação

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 .

Sintaxe

typedef struct _SCSI_REQUEST_BLOCK {
  USHORT                     Length;
  UCHAR                      Function;
  UCHAR                      SrbStatus;
  UCHAR                      ScsiStatus;
  UCHAR                      PathId;
  UCHAR                      TargetId;
  UCHAR                      Lun;
  UCHAR                      QueueTag;
  UCHAR                      QueueAction;
  UCHAR                      CdbLength;
  UCHAR                      SenseInfoBufferLength;
  ULONG                      SrbFlags;
  ULONG                      DataTransferLength;
  ULONG                      TimeOutValue;
  PVOID                      DataBuffer;
  PVOID                      SenseInfoBuffer;
  struct _SCSI_REQUEST_BLOCK *NextSrb;
  PVOID                      OriginalRequest;
  PVOID                      SrbExtension;
  union {
    ULONG InternalStatus;
    ULONG QueueSortKey;
    ULONG LinkTimeoutValue;
  };
  ULONG                      Reserved;
  UCHAR                      Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;

Membros

Length

Especifica o tamanho em bytes dessa estrutura.

Function

Especifica a operação a ser executada, que pode ser um dos seguintes valores:

Valor Operação
SRB_FUNCTION_EXECUTE_SCSI (0x00) Uma solicitação de E/S do dispositivo SCSI deve ser executada na unidade lógica de destino.
SRB_FUNCTION_ABORT_COMMAND (0x10) Uma mensagem SCSIMESS_ABORT deve ser enviada para cancelar a solicitação apontada pelo membro NextSrb . Se essa for uma solicitação de fila marcada, uma mensagem SCSIMESS_ABORT_WITH_TAG deverá ser usada. Se a solicitação indicada tiver sido concluída, essa solicitação deverá ser concluída normalmente. Somente os membros da Função SRB, PathId, TargetId, Lun e NextSrb são válidos.
SRB_FUNCTION_RESET_DEVICE (0x13) O driver ScsiPort não envia mais esse SRB para seus miniportos. Somente os drivers de miniporto storport usam esse SRB. O controlador de destino SCSI deve ser redefinido usando a mensagem SCSIMESS_BUS_DEVICE_RESET. O driver de miniporta deve concluir todas as solicitações ativas para o controlador de destino. Somente os membros SRB Function, TargetId e PathId são válidos.
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) A unidade lógica deve ser redefinida, se possível. O driver de miniporto HBA deve concluir todas as solicitações ativas para a unidade lógica. Somente os membros Function, PathId, TargetId e Lun do SRB são válidos. O Storport dá suporte a esse tipo de redefinição, mas a porta SCSI não.
SRB_FUNCTION_RESET_BUS (0x12) O barramento SCSI deve ser redefinido usando a mensagem SCSIMESS_BUS_DEVICE_RESET. Um driver de miniporta recebe essa solicitação somente se uma determinada solicitação atingiu o tempo limite e uma solicitação subsequente para anular a solicitação de tempo limite também atingiu o tempo limite. Somente os membros SRB Function e PathId são válidos.
SRB_FUNCTION_TERMINATE_IO (0x14) Uma mensagem SCSIMESS_TERMINATE_IO_PROCESS deve ser enviada para cancelar a solicitação apontada pelo membro NextSrb . Se a solicitação indicada já tiver sido concluída, essa solicitação deverá ser concluída normalmente. Somente os membros da Função SRB, PathId, TargetId, Lun e NextSrb são válidos.
SRB_FUNCTION_RELEASE_RECOVERY (0x11) Uma mensagem SCSIMESS_RELEASE_RECOVERY deve ser enviada ao controlador de destino. Somente os membros de Função SRB, PathId, TargetId e Lun são válidos.
SRB_FUNCTION_RECEIVE_EVENT (0x03) O HBA deve estar preparado para receber uma notificação de evento assíncrono do destino endereçado. O membro SRB DataBuffer indica onde os dados devem ser colocados.
SRB_FUNCTION_SHUTDOWN (0x07) O sistema está sendo desligado. Essa solicitação será enviada a um driver de miniporte somente se definir CachesData como TRUE no PORT_CONFIGURATION_INFORMATION para o HBA. Esse driver de miniporta pode receber várias dessas notificações antes que todas as atividades do sistema realmente parem. No entanto, a última notificação de desligamento ocorrerá após a última E/S de início. Somente os membros SRB Function, PathId, TargetId e Lun são válidos.
SRB_FUNCTION_FLUSH (0x08) O driver de miniporta deve liberar todos os dados armazenados em cache para o dispositivo de destino. Essa solicitação será enviada ao driver de miniporte somente se definir CachesData como TRUE no PORT_CONFIGURATION_INFORMATION para o HBA. Somente os membros SRB Function, PathId, TargetId e Lun são válidos.
SRB_FUNCTION_IO_CONTROL (0x02) A solicitação é uma solicitação de controle de E/S, originada em um aplicativo de modo de usuário com um HBA dedicado. O SRB DataBuffer aponta para um cabeçalho SRB_IO_CONTROL seguido pela área de dados. O valor no DataBuffer pode ser usado pelo driver, independentemente do valor de MapBuffers. Somente os membros SRB Function, SrbFlags, TimeOutValue, DataBuffer e DataTransferLength são válidos, juntamente com o membro SrbExtension se o driver de miniporto solicitou extensões SRB quando inicializado. Se um driver de miniporta controlar um HBA dedicado ao aplicativo para que ele dê suporte a essa solicitação, o driver de miniporte deverá executar a solicitação e notificar o driver de porta específico do sistema operacional quando o SRB for concluído, usando o mecanismo normal de chamadas para ScsiPortNotification com RequestComplete e NextRequest.
SRB_FUNCTION_LOCK_QUEUE (0x18) Contém solicitações enfileiradas pelo driver de porta para uma unidade lógica específica, normalmente enquanto uma solicitação de energia está sendo processada. Somente os membros SRB Length, Function, SrbFlags e OriginalRequest são válidos. Quando a fila estiver bloqueada, somente as solicitações com SrbFlags ORed com SRB_FLAGS_BYPASS_LOCKED_QUEUE serão processadas. Os drivers de miniporta SCSI não processam solicitações de SRB_FUNCTION_LOCK_QUEUE.
SRB_FUNCTION_UNLOCK_QUEUE (0x19) Libera a fila do driver de porta para uma unidade lógica que foi bloqueada anteriormente com SRB_FUNCTION_LOCK_QUEUE. O SrbFlags da solicitação de desbloqueio deve ser ORed com SRB_FLAGS_BYPASS_LOCKED_QUEUE. Somente os membros SRB Length, Function, SrbFlags e OriginalRequest são válidos. Os drivers de miniporta SCSI não processam solicitações de SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FUNCTION_UNLOCK_QUEUE (0x19) Libera a fila do driver de porta para uma unidade lógica que foi bloqueada anteriormente com SRB_FUNCTION_LOCK_QUEUE. O SrbFlags da solicitação de desbloqueio deve ser ORed com SRB_FLAGS_BYPASS_LOCKED_QUEUE. Somente os membros SRB Length, Function, SrbFlags e OriginalRequest são válidos. Os drivers de miniporta SCSI não processam solicitações de SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FUNCTION_DUMP_POINTERS (0x26) Uma solicitação com essa função é enviada para um driver de miniporto storport que é usado para controlar o disco que contém os dados de despejo de memória. A solicitação coleta as informações necessárias do driver de miniporta para dar suporte ao despejo de memória e à hibernação. Consulte a estrutura de MINIPORT_DUMP_POINTERS . Um driver de miniporto físico deve definir o sinalizador STOR_FEATURE_DUMP_POINTERS no membro FeatureSupport de sua HW_INITIALIZATION_DATA para receber uma solicitação com essa função.
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) Uma solicitação com essa função é enviada a um driver de miniporto storport para liberar todos os recursos alocados durante uma solicitação anterior para SRB_FUNCTION_DUMP_POINTERS.

SrbStatus

Retorna o status da solicitação concluída. Esse membro deve ser definido pelo driver de miniporto antes de notificar o driver específico do sistema operacional de que a solicitação foi concluída chamando ScsiPortNotification com RequestComplete. O valor desse membro pode ser um dos seguintes:

Valor Significado
SRB_STATUS_PENDING Indica que a solicitação está em andamento. O driver de porta específico do sistema operacional inicializa SrbStatus para esse valor.
SRB_STATUS_SUCCESS Indica que a solicitação foi concluída com êxito.
SRB_STATUS_ABORTED Indica que a solicitação foi anulada conforme indicado pelo driver de porta. Um driver de miniporta define esse status no NextSrb para uma solicitação de SRB_FUNCTION_ABORT_COMMAND bem-sucedida.
SRB_STATUS_ABORT_FAILED Indica uma tentativa de anular a solicitação falhou. Retorne essa status para uma solicitação de SRB_FUNCTION_ABORT_COMMAND quando a solicitação especificada não puder ser localizada.
SRB_STATUS_ERROR Indica que a solicitação foi concluída com um erro no status de barramento SCSI.
SRB_STATUS_BUSY Indica que o driver de miniporta ou o dispositivo de destino não pôde aceitar a solicitação no momento. O driver de porta específico do sistema operacional reenviará a solicitação mais tarde.
SRB_STATUS_INTERNAL_ERROR Indica que o driver de porta SCSI não pôde entregar a solicitação ao driver de miniporto ou ao dispositivo de destino. Nesses casos, status é registrado em InternalStatus.
SRB_STATUS_INVALID_REQUEST Indica que o driver de miniporta não dá suporte à solicitação fornecida.
SRB_STATUS_NO_DEVICE Indica que o dispositivo não respondeu.
SRB_STATUS_TIMEOUT Indica que a solicitação atingiu o tempo limite.
SRB_STATUS_SELECTION_TIMEOUT Indica que a seleção do dispositivo SCSI atingiu o tempo limite.
SRB_STATUS_COMMAND_TIMEOUT Indica que o destino não concluiu o comando dentro do limite de tempo.
SRB_STATUS_MESSAGE_REJECTED Indica que o destino rejeitou uma mensagem. Normalmente, isso é retornado apenas para solicitações de tipo de mensagem como SRB_FUNCTION_TERMINATE_IO.
SRB_STATUS_BUS_RESET Indica que ocorreu uma redefinição de barramento enquanto essa solicitação estava sendo executada.
SRB_STATUS_PARITY_ERROR Indica que ocorreu um erro de paridade no barramento SCSI e que uma nova tentativa falhou.
SRB_STATUS_REQUEST_SENSE_FAILED Indica que o comando request-sense falhou. Isso será retornado somente se o HBA executar o sentido de solicitação automática e o driver de miniportar definir AutoRequestSense como TRUE no PORT_CONFIGURATION_INFORMATION para esse HBA.
SRB_STATUS_NO_HBA Indica que o HBA não responde.
SRB_STATUS_DATA_OVERRUN Indica que ocorreu um erro de estouro de dados ou de subexecutar. O driver de miniporto também deve atualizar o membro DataTransferLength do SRB para indicar quantos dados realmente foram transferidos se ocorrer uma subexecutação.
SRB_STATUS_UNEXPECTED_BUS_FREE Indica que o destino foi desconectado inesperadamente.
SRB_STATUS_PHASE_SEQUENCE_FAILURE Indica que o HBA detectou um erro de falha de sequência de fase ilegal.
SRB_STATUS_REQUEST_FLUSHED Indica que a solicitação de status foi interrompida.
SRB_STATUS_BAD_FUNCTION Indica que não há suporte para o código da função SRB.
SRB_STATUS_INVALID_PATH_ID Indica que PathId especificado no SRB não existe.
SRB_STATUS_INVALID_TARGET_ID Indica que o valor targetID no SRB é inválido.
SRB_STATUS_INVALID_LUN Indica que o valor de Lun no SRB é inválido.
SRB_STATUS_ERROR_RECOVERY Indica que a solicitação foi concluída com um erro no barramento SCSI status e que a mensagem SCSI INITIATE RECOVERY foi recebida.
SRB_STATUS_AUTOSENSE_VALID Indica que as informações retornadas no SenseInfoBuffer são válidas.
SRB_STATUS_QUEUE_FROZEN Um driver de miniporta nunca deve definir o membro SrbStatus para esse valor. O driver de porta do Windows pode definir esse valor para informar a um driver de classe de armazenamento que sua fila de solicitações para um periférico específico foi congelada.

ScsiStatus

Retorna o status SCSI que foi retornado pelo HBA ou dispositivo de destino. Se o status não for SUCCESS, o driver de miniporto deverá definir o membro SrbStatus como SRB_STATUS_ERROR.

PathId

Indica a porta SCSI ou o barramento para a solicitação. Esse valor é baseado em zero.

TargetId

Indica o controlador de destino ou o dispositivo no barramento.

Lun

Indica o número da unidade lógica do dispositivo.

QueueTag

Contém o valor de marca de fila atribuído pelo driver de porta específico do sistema operacional. Se esse membro for usado para enfileiramento marcado, o HBA oferecerá suporte ao enfileiramento interno de solicitações para LUs e o driver de miniporto definir TaggedQueueing como TRUE no PORT_CONFIGURATION_INFORMATION para esse HBA.

QueueAction

Indica a mensagem de enfileiramento marcado a ser usada quando o sinalizador SRB_FLAGS_QUEUE_ACTION_ENABLE está definido. O valor pode ser um dos seguintes: SRB_SIMPLE_TAG_REQUEST, SRB_HEAD_OF_QUEUE_TAG_REQUEST ou SRB_ORDERED_QUEUE_TAG_REQUEST, conforme definido de acordo com a especificação SCSI.

CdbLength

Indica o tamanho em bytes do bloco do descritor de comando SCSI-2 ou posterior.

SenseInfoBufferLength

Indica o tamanho em bytes do buffer de sentido de solicitação. Se ocorrer uma subexecutação, o driver de miniporto deverá atualizar esse membro para o número de bytes realmente transferidos.

SrbFlags

Indica vários parâmetros e opções sobre a solicitação. SrbFlags é somente leitura, exceto quando SRB_FLAGS_UNSPECIFIED_DIRECTION é definido e drivers de miniporta de adaptadores de AMD subordinados são necessários para atualizar SRB_FLAGS_DATA_IN ou SRB_FLAGS_DATA_OUT. Esse membro pode ter um ou mais dos seguintes sinalizadores definidos:

Sinalizador Significado
SRB_FLAGS_QUEUE_ACTION_ENABLE Indica que as ações de fila marcada devem ser habilitadas.
SRB_FLAGS_DISABLE_AUTOSENSE Indica que as informações de sentido de solicitação não devem ser retornadas.
SRB_FLAGS_DATA_IN Indica que os dados serão transferidos do dispositivo para o sistema.
SRB_FLAGS_DATA_OUT Indica que os dados serão transferidos do sistema para o dispositivo.
SRB_FLAGS_UNSPECIFIED_DIRECTION Definido para compatibilidade com versões anteriores com as interfaces SCSI ASPI/CAM, esse sinalizador indica que a direção da transferência pode ser uma das anteriores porque ambos os sinalizadores anteriores estão definidos. Se esse sinalizador estiver definido, um driver de miniporto deverá determinar a direção da transferência examinando a fase de dados do destino no barramento SCSI. Se o HBA for um dispositivo DMA subordinado, esse driver de miniporto deverá atualizar SRB_FLAGS_DATA_OUT ou SRB_FLAGS_DATA_IN para o valor correto antes de chamar ScsiPortIoMapTransfer.
SRB_FLAGS_NO_DATA_TRANSFER Indica nenhuma transferência de dados com essa solicitação. Se isso estiver definido, os sinalizadores SRB_FLAGS_DATA_OUT, SRB_FLAGS_DATA_IN e SRB_FLAGS_UNSPECIFIED_DIRECTION estarão claros.
SRB_FLAGS_DISABLE_SYNCH_TRANSFER Indica que o HBA, se possível, deve executar E/S assíncrona para essa solicitação de transferência. Se a E/S síncrona tiver sido negociada anteriormente, o HBA deverá renegociar a E/S assíncrona antes de realizar a transferência.
SRB_FLAGS_DISABLE_DISCONNECT Indica que o HBA não deve permitir que o destino se desconecte do barramento SCSI durante o processamento dessa solicitação.
SRB_FLAGS_BYPASS_FROZEN_QUEUE É irrelevante para motoristas de miniporta.
SRB_FLAGS_NO_QUEUE_FREEZE É irrelevante para motoristas de miniporta.
SRB_FLAGS_IS_ACTIVE É irrelevante para motoristas de miniporta.
SRB_FLAGS_ALLOCATED_FROM_ZONE É irrelevante para drivers de miniporta e está obsoleto para os drivers de classe atuais do Windows. Para um driver de classe herdado do Windows, isso indica se o SRB foi alocado de um buffer de zona. Se esse sinalizador estiver definido, o driver de classe deverá chamar ExInterlockedFreeToZone para liberar o SRB; caso contrário, ele deve chamar ExFreePool. Os novos drivers de classe devem usar listas lookaside em vez de buffers de zona.
SRB_FLAGS_SGLIST_FROM_POOL É irrelevante para motoristas de miniporta. Para um driver de classe do Windows, isso indica que a memória de uma lista de dispersão/coleta foi alocada do pool nãopagado. Se esse sinalizador for definido, o driver de classe deverá chamar ExFreePool para liberar a memória depois que o SRB for concluído.
SRB_FLAGS_BYPASS_LOCKED_QUEUE É irrelevante para motoristas de miniporta. Para o driver de porta, esse sinalizador indica que a solicitação deve ser processada se a fila de unidade lógica está bloqueada. Um driver de nível superior deve definir esse sinalizador para enviar uma solicitação de SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FLAGS_NO_KEEP_AWAKE É irrelevante para motoristas de miniporta. Um driver de classe do Windows usa esse sinalizador para indicar ao driver de porta para relatar ocioso em vez de ligar o dispositivo para lidar com essa solicitação.
SRB_FLAGS_FREE_SENSE_BUFFER Indica que a porta ou o driver de miniporta alocou um buffer para dados de sensor. Isso informa ao driver de classe que ele deve liberar o buffer de dados de sensor depois de extrair os dados.

DataTransferLength

Indica o tamanho em bytes do buffer de dados. Se ocorrer uma subexecutação, o driver de miniporto deverá atualizar esse membro para o número de bytes realmente transferidos.

TimeOutValue

Indica o intervalo em segundos que a solicitação pode ser executada antes que o driver de porta específico do sistema operacional possa considerá-lo com o tempo limite esgotado. Os drivers de miniporta não são necessários para solicitações de tempo porque o driver de porta já faz isso.

DataBuffer

Aponta para o buffer de dados. Os drivers de miniporta não devem usar esse valor como um ponteiro de dados, a menos que o driver de miniporte defina MapBuffers como TRUE no PORT_CONFIGURATION_INFORMATION para o HBA. No caso de solicitações SRB_FUNCTION_IO_CONTROL, no entanto, os drivers de miniporto podem usar esse valor como um ponteiro de dados, independentemente do valor de MapBuffers.

SenseInfoBuffer

Aponta para o buffer de sentido de solicitação. Um driver de miniporta não é necessário para fornecer dados de sentido de solicitação após uma CONDIÇÃO DE VERIFICAÇÃO.

NextSrb

Indica o SCSI_REQUEST_BLOCK ao qual essa solicitação se aplica. Apenas um pequeno subconjunto de solicitações usa um segundo SRB, por exemplo, SRB_FUNCTION_ABORT_COMMAND.

OriginalRequest

Aponta para o IRP para essa solicitação. Esse membro é irrelevante para miniportar drivers

SrbExtension

Aponta para a extensão Srb. Um driver de miniporta não deverá usar esse membro se ele definir SrbExtensionSize como zero no SCSI_HW_INITIALIZATION_DATA. A memória em SrbExtension não é inicializada pelo driver de porta específico do sistema operacional e os dados determinados pelo driver de miniport podem ser acessados diretamente pelo HBA. O endereço físico correspondente pode ser obtido chamando ScsiPortGetPhysicalAddress com o ponteiro SrbExtension .

InternalStatus

Usado pelo driver de porta SCSI, em vez de SrbStatus, para relatar o status da solicitação concluída sempre que a solicitação não puder ser entregue ao driver de miniporto. Nesses casos, SrbStatus é definido como SRB_STATUS_INTERNAL_ERROR. Esse membro é usado exclusivamente para comunicação entre a Porta SCSI e o driver de classe e não deve ser usado por drivers de miniporto.

QueueSortKey

Especifica o deslocamento do início da mídia ou zero, dependendo do tipo do dispositivo de destino.

LinkTimeoutValue

Valor de tempo limite do link.

Reserved

Reservado.

Cdb[16]

Especifica o bloco do descritor de comando SCSI-2 ou posterior a ser enviado ao dispositivo de destino.

Comentários

Os drivers de filtro e classe de armazenamento do Windows podem enviar SRBs com os seguintes valores de Função para o driver de porta do sistema:

  • SRB_FUNCTION_CLAIM_DEVICE para indicar que o driver de classe dá suporte a um periférico identificado no SRB pelos membros PathId, TargetId e Lun .
  • SRB_ATTACH_DEVICE para indicar que um driver de filtro, em camadas acima de um driver de classe, deseja que as solicitações de um periférico específico sejam roteadas primeiro para o driver de filtro.
  • SRB_FUNCTION_RELEASE_DEVICE para indicar que um driver de classe está liberando sua declaração em um periférico específico.
  • SRB_FUNCTION_FLUSH_QUEUE solicitar o cancelamento de todas as solicitações atualmente enfileiradas no driver de porta para um periférico específico.
  • SRB_FUNCTION_RELEASE_QUEUE solicitar que o driver de porta libere uma fila congelada de solicitações para um periférico específico.

Os SRB_FUNCTION_XXX anteriores nunca são definidos em SRBs enviados para drivers de miniporta SCSI. SRB_FUNCTION_REMOVE_DEVICE é definido para uso em versões futuras do sistema. Ele também nunca é definido em SRBs enviados para drivers de miniporto SCSI. SRB_FUNCTION_WMI_REQUEST é válido somente em SCSI_WMI_REQUEST_BLOCK. Uma classe de armazenamento ou driver de filtro usa isso para enviar solicitações WMI para o driver de porta.

Requisitos

Requisito Valor
Cabeçalho srb.h (incluem Srb.h, Minitape.h, Storport.h)

Confira também

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification