estrutura STORAGE_REQUEST_BLOCK (minitape.h)
O STORAGE_REQUEST_BLOCK é a estrutura SRB (Bloco de Solicitação SCSI) de formato estendido. A estrutura fornece a adição de dados estendidos associados 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 _STORAGE_REQUEST_BLOCK {
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
ULONG ReservedUlong1;
ULONG Signature;
ULONG Version;
ULONG SrbLength;
ULONG SrbFunction;
ULONG SrbFlags;
ULONG ReservedUlong2;
ULONG RequestTag;
USHORT RequestPriority;
USHORT RequestAttribute;
ULONG TimeOutValue;
union {
ULONG SystemStatus;
ULONG RequestTagHigh4Bytes;
} DUMMYUNIONNAME;
ULONG SystemStatus;
ULONG ZeroGuard1;
ULONG AddressOffset;
ULONG NumSrbExData;
ULONG DataTransferLength;
PVOID POINTER_ALIGN DataBuffer;
PVOID POINTER_ALIGN ZeroGuard2;
PVOID POINTER_ALIGN OriginalRequest;
PVOID POINTER_ALIGN ClassContext;
PVOID POINTER_ALIGN PortContext;
PVOID POINTER_ALIGN MiniportContext;
_STORAGE_REQUEST_BLOCK POINTER_ALIGN *NextSrb;
struct _STORAGE_REQUEST_BLOCK;
ULONG SrbExDataOffset[ANYSIZE_ARRAY];
} STORAGE_REQUEST_BLOCK, *PSTORAGE_REQUEST_BLOCK;
Membros
Length
Especifica o tamanho do cabeçalho SRB para compatibilidade com a estrutura SCSI_REQUEST_BLOCK. Isso é igual ao deslocamento do membro assinatura dessa estrutura.
Function
Defina como SRB_FUNCTION_STORAGE_REQUEST_BLOCK para indicar que este é um SRB estendido. Ao contrário de SCSI_REQUEST_BLOCK, o identificador de função SRB está no membro do SrbFunction.
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 StorPortNotification com RequestComplete. SrbStatus pode ser um dos valores a seguir.
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 membro 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 storport 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 (adaptador de barramento de host) executar o sentido de solicitação automática e o driver de miniporto definido AutoRequestSense para verdadeiro 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 miniporte nunca deve definir o membro do 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. |
SRB_STATUS_NOT_POWERED | Um indica que a solicitação falhou porque o destino não está ligado. Para solicitações com SRB_FLAGS_NO_KEEP_AWAKE definidas em SrbFlags, as solicitações enviadas aos LUNs que são desligados falharão com esse status. |
SRB_STATUS_LINK_DOWN | Indica que a solicitação falhou porque o link está inoperante. |
SRB_STATUS_BAD_SRB_BLOCK_LENGTH | Indica que a solicitação falhou porque o comprimento do SRB era inválido. |
ReservedUlong1
Reservado. Definido como 0.
Signature
A assinatura do formato SRB estendido. Isso está definido como SRB_SIGNATURE.
Version
A versão da estrutura usada. A versão atual é STORAGE_REQUEST_BLOCK_VERSION_1.
SrbLength
O comprimento desse SRB estendido, em bytes, incluindo essa estrutura, endereço e quaisquer dados estendidos de SRB.
SrbFunction
Especifica a operação a ser executada, que pode ser um destes valores:
Valor | Significado |
---|---|
SRB_FUNCTION_EXECUTE_SCSI (0x00) | Uma solicitação de E/S de dispositivo SCSI deve ser executada na unidade lógica de destino. Quando NumSrbExData> 0, uma ou mais estruturas de blocos de solicitação estendidas a seguir estão localizadas nos deslocamentos especificados em SrbExDataOffset: SRBEX_DATA_SCSI_CDB16, SRBEX_DATA_SCSI_CDB32, SRBEX_DATA_SCSI_CDB_VAR, SRBEX_DATA_BIDIRECTIONAL, SRBEX_DATA_IO_INFO |
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. Dados SRB estendidos não são necessários para essa função. OBSERVAÇÃO: essa função não é enviada para o miniporto pelo Storport. |
SRB_FUNCTION_RESET_DEVICE (0x16) | 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. Dados SRB estendidos não são necessários para essa função. |
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. Dados SRB estendidos não são necessários para essa função. 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. Dados SRB estendidos não são necessários para essa função. |
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. Dados SRB estendidos não são necessários para essa função. OBSERVAÇÃO: essa função não é enviada para o miniporto pelo Storport. |
SRB_FUNCTION_RELEASE_RECOVERY (0x11) | Uma mensagem de SCSIMESS_RELEASE_RECOVERY deve ser enviada ao controlador de destino. Dados SRB estendidos não são necessários para essa função. OBSERVAÇÃO: essa função não é enviada para o miniporto pelo Storport. |
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. OBSERVAÇÃO: essa função não é enviada para o miniporto pelo Storport. |
SRB_FUNCTION_SHUTDOWN (0x07) | O sistema está sendo desligado. Um driver de miniporto 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. Dados SRB estendidos não são necessários para essa função. |
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 ele definir cachesData para TRUE no PORT_CONFIGURATION_INFORMATION do HBA. Dados SRB estendidos não são necessários para essa função. |
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 miniporte 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 StorPortNotification com RequestComplete e NextRequest. |
SRB_FUNCTION_LOCK_QUEUE (0x18) | Mantém solicitações que são 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 de 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. |
SRB_FUNCTION_QUIESCE_DEVICE (0x1A) | A solicitação é somente entre uma classe de armazenamento e um driver de porta de armazenamento e não é enviada para o miniporto. Essa função serve como uma espera pelo driver de classe para que o driver de porta conclua todas as E/Ss pendentes. |
SRB_FUNCTION_PNP (0x25) | A solicitação é uma solicitação estendida PnP formatada como uma estrutura SRBEX_DATA_PNP. O deslocamento para dados de solicitação estendida está localizado em SrbExDataOffset[0]. |
SRB_FUNCTION_POWER (0x24) | A solicitação é uma solicitação estendida de energia formatada como uma estrutura SRBEX_DATA_POWER. O deslocamento para dados de solicitação estendida está localizado em SrbExDataOffset[0]. |
SRB_FUNCTION_WMI (0x17) | A solicitação é uma solicitação estendida de energia formatada como uma estrutura SRBEX_DATA_WMI. O deslocamento para dados de solicitação estendida está localizado em SrbExDataOffset[0]. |
SrbFlags
Indica vários parâmetros e opções para 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 desses sinalizadores definidos.
ReservedUlong2
Reservado. Definido como 0.
RequestTag
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 à fila interna de solicitações a LUs (unidades lógicas) e ao conjunto de drivers de miniporto TaggedQueueing para TRUE no PORT_CONFIGURATION_INFORMATION deste HBA.
RequestPriority
A atribuição de prioridade para o SRB.
RequestAttribute
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_REQUESTou SRB_ORDERED_QUEUE_TAG_REQUEST.
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. Os drivers de miniporto não são necessários para cronometrar solicitações porque o driver de porta já faz.
DUMMYUNIONNAME
União que contém o Windows 10 e campos posteriores.
DUMMYUNIONNAME.SystemStatus
Usado para armazenar informações de status de falha do sistema em condições de falha do SrbStatus (por exemplo, SRB_STATUS_INTERNAL_ERROR).
DUMMYUNIONNAME.RequestTagHigh4Bytes
Usado para armazenar quatro bytes altos de marca exclusiva se o recurso de marca exclusiva estiver habilitado.
SystemStatus
Usado pelo driver storport, 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 o Storport e o driver de classe e não deve ser usado por drivers de miniporto.
ZeroGuard1
Uma área de proteção para proteger contra drivers que interpretam essa estrutura como SCSI_REQUEST_BLOCK. Definido como 0.
AddressOffset
O deslocamento do endereço de solicitação de armazenamento desde o início dessa estrutura. Esse deslocamento localiza uma estrutura STOR_ADDRESS que contém o endereço da solicitação.
NumSrbExData
A contagem de blocos de dados SRB estendidos para essa solicitação.
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.
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 miniportor definido MapBuffers para 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.
ZeroGuard2
Uma área de proteção para proteger contra drivers que interpretam essa estrutura como SCSI_REQUEST_BLOCK. Definido como 0.
OriginalRequest
Aponta para o IRP para essa solicitação. Esse membro é irrelevante para miniportar drivers.
ClassContext
Aponta para dados de contexto de driver de classe para essa solicitação. Esse membro é irrelevante para miniportar drivers.
PortContext
Aponta para dados de contexto de driver de porta para essa solicitação. Esse membro é irrelevante para miniportar drivers.
MiniportContext
Aponta para a extensão Srb. Um driver de miniporto não deverá usar esse membro se ele definir SrbExtensionSize como zero em HW_INITIALIZATION_DATA. A memória em MiniportContext 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 StorportGetPhysicalAddress com o ponteiro MiniportContext.
NextSrb
Indica a STORAGE_REQUEST_BLOCK à qual essa solicitação se aplica. Apenas um pequeno subconjunto de solicitações usa um segundo SRB, por exemplo, SRB_FUNCTION_ABORT_COMMAND.
_STORAGE_REQUEST_BLOCK
SrbExDataOffset[ANYSIZE_ARRAY]
Uma matriz de deslocamentos que especifica o local dos blocos de dados estendidos para o SRB. Essa matriz estará vazia se NumSrbExData = 0.
Observações
A partir do Windows 8, há suporte para um tipo SRB estendido com o uso da estrutura de STORAGE_REQUEST_BLOCK. STORAGE_REQUEST_BLOCK estende as funções SRB, permitindo que blocos de dados estendidos para a função SRB sejam adicionados à solicitação. O suporte para solicitações SRB usando a estrutura de SCSI_REQUEST_BLOCK continuará.
Se NumSrbExData> 0, os deslocamentos para os blocos de dados estendidos SRB estarão na matriz SrbExDataOffset. Cada deslocamento é relativo ao início dessa estrutura e aponta para uma estrutura SRBEX_DATA que contém o bloco de dados estendido.
O endereço do dispositivo de destino para o SRB está em uma estrutura STOR_ADDRESS indicada pelo AddressOffset.
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows 8 |
cabeçalho | minitape.h (inclua Storport.h, Srb.h, Minitape.h) |