Compartilhar via


estrutura SCSI_REQUEST_BLOCK (srb.h)

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

Nota

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

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 de dispositivo SCSI deve ser executada na unidade lógica de destino.
SRB_FUNCTION_ABORT_COMMAND (0x10) Uma mensagem de 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 de 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 de funçãoSRB, PathId, TargetId, Lune 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 do Storport usam este SRB. O controlador de destino SCSI deve ser redefinido usando a mensagem SCSIMESS_BUS_DEVICE_RESET. O driver de miniporto deve concluir todas as solicitações ativas para o controlador de destino. Somente os membros de funçãoSRB, TargetIde 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 a função , PathId, targetIde lun membros 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 miniporto recebe essa solicitação somente se uma determinada solicitação tiver um tempo limite e uma solicitação subsequente para anular a solicitação de tempo limite também tiver o tempo limite esgotado. Somente os membros de função SRB e PathId são válidos.
SRB_FUNCTION_TERMINATE_IO (0x14) Uma mensagem de SCSIMESS_TERMINATE_IO_PROCESS deve ser enviada para cancelar a solicitação apontada pelo membro do NextSrb. Se a solicitação indicada já tiver sido concluída, essa solicitação deverá ser concluída normalmente. Somente os membros de funçãoSRB, PathId, TargetId, Lune nextSrb são válidos.
SRB_FUNCTION_RELEASE_RECOVERY (0x11) Uma mensagem de SCSIMESS_RELEASE_RECOVERY deve ser enviada ao controlador de destino. Somente os membros de funçãoSRB, PathId, TargetIde lun são válidos.
SRB_FUNCTION_RECEIVE_EVENT (0x03) O HBA deve estar preparado para receber uma notificação de evento assíncrona do destino endereçado. O membro databuffer SRB 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 ela definir cachesData para TRUE no PORT_CONFIGURATION_INFORMATION do HBA. Esse driver de miniporto pode receber várias dessas notificações antes que toda a atividade do sistema realmente pare. No entanto, a última notificação de desligamento ocorrerá após a última E/S de início. Somente os membros de funçãoSRB, PathId, targetId e lun são válidos.
SRB_FUNCTION_FLUSH (0x08) O driver de miniporto deve liberar todos os dados armazenados em cache para o dispositivo de destino. Essa solicitação será enviada ao driver de miniporte somente se ela definir cachesData para TRUE no PORT_CONFIGURATION_INFORMATION do HBA. Somente os membros de funçãoSRB, PathId, targetId e lun são válidos.
SRB_FUNCTION_IO_CONTROL (0x02) A solicitação é uma solicitação de controle de E/S, originária de um aplicativo no modo de usuário com um HBA dedicado. O databuffer SRB aponta para um cabeçalho SRB_IO_CONTROL seguido pela área de dados. O valor em do DataBuffer pode ser usado pelo driver, independentemente do valor de MapBuffers. Somente a função SRB, SrbFlags, TimeOutValue, DataBuffere membros DataTransferLength são válidos, juntamente com o membro SrbExtension se o driver de miniport solicitação de extensões SRB quando inicializado. Se um driver de miniporto controlar um HBA dedicado ao aplicativo para que ele dê suporte a essa solicitação, o driver de miniporto 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) Manté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 de comprimento deSRB, Function, SrbFlagse 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 miniporto 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 de comprimento deSRB, Function, SrbFlagse OriginalRequest são válidos. Os drivers de miniporto SCSI não processam solicitações 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 de comprimento deSRB, Function, SrbFlagse OriginalRequest são válidos. Os drivers de miniporto SCSI não processam solicitações SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FUNCTION_DUMP_POINTERS (0x26) Uma solicitação com essa função é enviada para um driver de miniporto do Storport que é usado para controlar o disco que contém os dados de despejo de memória. A solicitação coleta informações necessárias do driver de miniporto 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 de STOR_FEATURE_DUMP_POINTERS no do FeatureSupport de seu 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 do 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 miniporte 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 miniporto define esse status no NextSrb para uma solicitação de SRB_FUNCTION_ABORT_COMMAND bem-sucedida.
SRB_STATUS_ABORT_FAILED Indica que falha na tentativa de anular a solicitação. Retorne esse status para uma solicitação 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 do barramento SCSI.
SRB_STATUS_BUSY Indica que o driver de miniporto 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, o status é registrado em InternalStatus.
SRB_STATUS_INVALID_REQUEST Indica que o driver de miniporto 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 repetição 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 miniporto definir AutoRequestSense para TRUE no PORT_CONFIGURATION_INFORMATION deste HBA.
SRB_STATUS_NO_HBA Indica que o HBA não responde.
SRB_STATUS_DATA_OVERRUN Indica que ocorreu um erro de sobrecarga ou de subexecução de dados. O driver de miniporto também deve atualizar o membro DataTransferLength do SRB para indicar quantos dados realmente foram transferidos se ocorrer uma subexecuçã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 de de função de SRB.
SRB_STATUS_INVALID_PATH_ID Indica que o 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 do Lun no SRB é inválido.
SRB_STATUS_ERROR_RECOVERY Indica que a solicitação foi concluída com um erro no status do barramento SCSI 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 miniporto 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 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 ou o barramento SCSI 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 de 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 à enfileiramento interno de solicitações para LUs e ao conjunto de drivers de miniporto TaggedQueueing para TRUE no PORT_CONFIGURATION_INFORMATION deste HBA.

QueueAction

Indica a mensagem de enfileiramento marcada a ser usada quando o sinalizador de SRB_FLAGS_QUEUE_ACTION_ENABLE é 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 subexecuçã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 os drivers de miniport de adaptadores de DMA 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:

Bandeira 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 do 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 ASPI/CAM SCSI, esse sinalizador indica que a direção de 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 que não há 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 foi negociada anteriormente, o HBA deve renegociar para E/S assíncrona antes de executar 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 os motoristas de miniporto.
SRB_FLAGS_NO_QUEUE_FREEZE É irrelevante para os motoristas de miniporto.
SRB_FLAGS_IS_ACTIVE É irrelevante para os motoristas de miniporto.
SRB_FLAGS_ALLOCATED_FROM_ZONE É irrelevante para os drivers de miniporto 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 os motoristas de miniporto. 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 estiver definido, o driver de classe deverá chamar ExFreePool para liberar a memória após a conclusão do SRB.
SRB_FLAGS_BYPASS_LOCKED_QUEUE É irrelevante para os motoristas de miniporto. 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 SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FLAGS_NO_KEEP_AWAKE É irrelevante para os motoristas de miniporto. 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 miniporto alocou um buffer para dados de sentido. Isso informa ao driver de classe que ele deve liberar o buffer de dados de sentido depois de extrair os dados.

DataTransferLength

Indica o tamanho em bytes do buffer de dados. Se ocorrer uma subexecuçã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 considere o tempo limite. Os drivers de miniporto não são necessários para cronometrar solicitações porque o driver de porta já faz.

DataBuffer

Aponta para o buffer de dados. Os drivers de miniporto não devem usar esse valor como um ponteiro de dados, a menos que o driver de miniporto tenha definido MapBuffers para TRUE no PORT_CONFIGURATION_INFORMATION do 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 miniporto não é necessário para fornecer dados de solicitação de sentido após uma CONDIÇÃO CHECK.

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. Este membro é irrelevante para os drivers de miniporto

SrbExtension

Aponta para a extensão Srb. Um driver de miniporto 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 do 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 está 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 do tempo limite do link.

Reserved

Reservado.

Cdb[16]

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

Observações

Os drivers de classe de armazenamento e filtro do Windows podem enviar SRBs com os seguintes valores de 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, TargetIde lun.
  • SRB_ATTACH_DEVICE para indicar que um driver de filtro, em camadas acima de um driver de classe, deseja que solicitações para 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.

OsXXX SRB_FUNCTION_ anteriores nunca são definidos em SRBs enviados para drivers de miniporto 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 apenas 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)

Consulte também

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification