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) |