estrutura HW_STREAM_REQUEST_BLOCK (strmini.h)
O driver de classe de fluxo usa a estrutura HW_STREAM_REQUEST_BLOCK para passar informações de e para o minidriver, usando retornos de chamada fornecidos pelo minidriver.
Sintaxe
typedef struct _HW_STREAM_REQUEST_BLOCK {
ULONG SizeOfThisPacket;
SRB_COMMAND Command;
NTSTATUS Status;
PHW_STREAM_OBJECT StreamObject;
PVOID HwDeviceExtension;
PVOID SRBExtension;
union {
PKSSTREAM_HEADER DataBufferArray;
PHW_STREAM_DESCRIPTOR StreamBuffer;
KSSTATE StreamState;
PSTREAM_TIME_REFERENCE TimeReference;
PSTREAM_PROPERTY_DESCRIPTOR PropertyInfo;
PKSDATAFORMAT OpenFormat;
struct _PORT_CONFIGURATION_INFORMATION *ConfigInfo;
HANDLE MasterClockHandle;
DEVICE_POWER_STATE DeviceState;
PSTREAM_DATA_INTERSECT_INFO IntersectInfo;
PVOID MethodInfo;
LONG FilterTypeIndex;
BOOLEAN Idle;
} CommandData;
_CommandData _CommandData;
ULONG NumberOfBuffers;
ULONG TimeoutCounter;
ULONG TimeoutOriginal;
struct _HW_STREAM_REQUEST_BLOCK *NextSRB;
PIRP Irp;
ULONG Flags;
PVOID HwInstanceExtension;
union {
ULONG NumberOfBytesToTransfer;
ULONG ActualBytesTransferred;
};
PKSSCATTER_GATHER ScatterGatherBuffer;
ULONG NumberOfPhysicalPages;
ULONG NumberOfScatterGatherElements;
ULONG Reserved[1];
} HW_STREAM_REQUEST_BLOCK, *PHW_STREAM_REQUEST_BLOCK;
Membros
SizeOfThisPacket
Especifica o tamanho, em bytes, dessa estrutura.
Command
Especifica a operação a ser executada pelo retorno de chamada do minidriver. O driver de classe passa SRB_XXX códigos de comando para retornos de chamada de minidriver.
Status
Quando o minidriver conclui uma solicitação de fluxo, ele preenche esse membro com o código status da solicitação. Consulte a documentação da rotina de solicitaçãoStrMiniXxx apropriada para os minidrivers de códigos de status que devem ser usados.
StreamObject
Para solicitações orientadas a fluxo, o driver de classe define isso para apontar para a estrutura HW_STREAM_OBJECT que especifica o fluxo no qual o driver de classe está fazendo uma solicitação.
HwDeviceExtension
Ponteiro para a extensão de dispositivo do minidriver. O minidriver pode usar esse buffer para registrar informações privadas. O minidriver define o tamanho desse buffer na estrutura HW_INITIALIZATION_DATA que ele passa quando ele se registra por meio de StreamClassRegisterMinidriver. O driver de classe também passa ponteiros para esse buffer no membro HwDeviceExtension do HW_STREAM_OBJECT, HW_TIME_CONTEXT e PORT_CONFIGURATION_INFORMATION estruturas que ele passa para o minidriver.
SRBExtension
Aponta para um buffer não inicializado que o driver de classe aloca para o minidriver usar durante o processamento desse bloco de solicitação de fluxo. Esse buffer é desalocado depois que o minidriver conclui a manipulação do bloco (consulte StreamClassDeviceNotification ou StreamClassStreamNotification para obter detalhes).
CommandData
CommandData é uma união de membros fornecida para dados específicos do código de comando.
CommandData.DataBufferArray
Ponteiro para uma matriz de estruturas de KSSTREAM_HEADER . O número de entradas nessa matriz é especificado em NumberOfBuffers. Cada KSSTREAM_HEADER descreve um bloco de dados.
Esse membro é usado quando o código de comando é SRB_READ_DATA ou SRB_WRITE_DATA.
CommandData.StreamBuffer
Aponta para a estrutura de HW_STREAM_DESCRIPTOR que o minidriver preenche com uma descrição da semântica de streaming de kernel compatível.
O minidriver especifica o tamanho desse buffer no membro StreamDescriptorSize de sua estrutura PORT_CONFIGURATION_INFORMATION .
Esse membro é usado quando o código de comando é SRB_GET_STREAM_INFO.
CommandData.StreamState
O estado do fluxo. Consulte KSPROPERTY_CONNECTION_STATE para obter detalhes.
Esse membro é usado quando o código de comando é SRB_GET_STREAM_STATE ou SRB_SET_STREAM_STATE.
CommandData.TimeReference
Um ponteiro para uma estrutura STREAM_TIME_REFERENCE.
CommandData.PropertyInfo
Aponta para a estrutura STREAM_PROPERTY_DESCRIPTOR que especifica os parâmetros para a operação get ou set da propriedade.
Esse membro é usado quando o código de comando é SRB_GET_DEVICE_PROPERTY, SRB_SET_DEVICE_PROPERTY, SRB_GET_STREAM_PROPERTY ou SRB_SET_STREAM_PROPERTY.
CommandData.OpenFormat
Ponteiro para a estrutura KSDATAFORMAT que especifica o formato.
Esse membro é usado quando o código de comando é SRB_OPEN_STREAM ou SRB_PROPOSE_DATA_FORMAT.
CommandData.ConfigInfo
Ponteiro para a estrutura de PORT_CONFIGURATION_INFORMATION usada para inicializar o dispositivo
Esse membro é usado quando o código de comando é SRB_INITIALIZE_DEVICE.
CommandData.MasterClockHandle
Manipule para o objeto clock que agora serve como o relógio master.
Esse membro é usado quando o código de comando é SRB_OPEN_MASTER_CLOCK ou SRB_INDICATE_MASTER_CLOCK.
CommandData.DeviceState
Especifica o novo estado de energia.
Esse membro é usado quando o código de comando é SRB_CHANGE_POWER_STATE.
CommandData.IntersectInfo
Ponteiro para uma estrutura STREAM_DATA_INTERSECT_INFO que descreve os parâmetros dessa operação.
Esse membro é usado quando o código de comando é SRB_GET_DATA_INTERSECTION.
CommandData.MethodInfo
Ponteiro para um buffer no qual os dados do método serão lidos ou gravados.
CommandData.FilterTypeIndex
Índice de tipo de filtro para SRB_OPEN_DEVICE_INSTANCE.
CommandData.Idle
Esse membro será definido como TRUE se nenhum identificador aberto para o dispositivo permanecer. Esse membro será definido como FALSE se o dispositivo não estiver mais ocioso (um identificador para o dispositivo foi aberto).
Esse membro é usado quando o código de comando é SRB_NOTIFY_IDLE_STATE.
_CommandData
CommandData é uma união de membros fornecida para dados específicos do código de comando.
NumberOfBuffers
Se Command for SRB_READ_DATA ou SRB_WRITE_DATA, isso especificará o número de entradas na matriz de estruturas de KSSTREAM_HEADER que começa no endereço apontado por CommandData.DataBufferArray. Caso contrário, esse parâmetro não será utilizado.
TimeoutCounter
O número de segundos antes dessa solicitação atingir o tempo limite. O driver de classe diminui isso uma vez por segundo. Se o driver de classe diminuir TimeoutCounter para zero antes que o minidriver conclua essa solicitação, ele chamará a rotina StrMiniRequestTimeout do minidriver. Se o minidriver definir isso como zero, a solicitação não atingirá o tempo limite.
TimeoutOriginal
O driver de classe define isso como o valor original de TimeoutCounter após a criação do SRB.
NextSRB
Aponta para outro bloco de solicitação de fluxo. O minidriver pode usar esse membro para enfileirar blocos de solicitação de fluxo.
Irp
Ponteiro para o IRP para a solicitação. A maioria dos minidrivers não precisa usar esse membro.
Flags
Especifica o tipo de solicitação. O driver de classe e o minidriver podem usar esse membro para determinar para qual retorno de chamada o driver de classe passou esse bloco de solicitação de fluxo.
Valor | Retorno de chamada usado |
---|---|
Nenhum | StrMiniReceiveDevicePacket |
SRB_HW_FLAGS_STREAM_REQUEST | StrMiniReceiveStreamControlPacket |
SRB_HW_FLAGS_DATA_TRANSFER | StrMiniReceiveStreamDataPacket |
SRB_HW_FLAGS_STREAM_REQUEST | StrMiniReceiveStreamDataPacket |
SRB_HW_FLAGS_STREAM_REQUEST bit é definido para solicitações específicas do fluxo (que são passadas para as rotinas de pacoteStrMiniReceiveStreamXxx do minidriver). O bit SRB_HW_FLAGS_DATA_TRANSFER é definido para solicitações de transferência de dados (que são passadas para o minidriver).
HwInstanceExtension
Ponteiro para a extensão de instância do minidriver. O minidriver pode usar esse buffer para registrar informações privadas globais nessa instância do minidriver. O minidriver define o tamanho desse buffer na estrutura HW_INITIALIZATION_DATA que ele passa quando ele se registra por meio de StreamClassRegisterMinidriver.
NumberOfBytesToTransfer
Para uma solicitação de SRB_READ_DATA ou SRB_WRITE_DATA, o número de bytes a serem transferidos.
ActualBytesTransferred
Para solicitações de controle, o número de bytes realmente transferidos.
ScatterGatherBuffer
Aponta para uma matriz de estruturas KSSCATTER_GATHER do formulário:
typedef struct {
PHYSICAL_ADDRESS PhysicalAddress;
ULONG Length;
} KSSCATTER_GATHER, *PKSSCATTER_GATHER;
A matriz descreve uma lista de dispersão/coleta que pode ser usada pelo minidriver para fazer DMA. A memória não precisa ser sondada, bloqueada, mapeada ou liberada. O driver de classe de fluxo executa-os para o minidriver.
NumberOfPhysicalPages
Especifica o tamanho da matriz passada no membro ScatterGatherBuffer .
NumberOfScatterGatherElements
Especifica o número de elementos físicos apontados por ScatterGatherBuffer.
Reserved[1]
O campo Reservado[1] é reservado para uso do sistema. Não use.
Comentários
O driver de classe de fluxo passa ponteiros para HW_STREAM_REQUEST_BLOCK estruturas para as rotinas StrMiniReceiveStreamDataPacket, StrMiniReceiveStreamControlPacket e StrMiniReceiveDevicePacket do minidriver.
O minidriver possui esse bloco de solicitação de fluxo até que a solicitação termine ou conclua a solicitação. O minidriver sinaliza para o driver de classe que concluiu a solicitação chamando StreamClassDeviceNotification(DeviceRequestComplete, pSrb-HwDeviceExtension>, pSRB) para solicitações específicas do dispositivo ou chamando StreamClassStreamNotification(StreamRequestComplete, pSrb-StreamObject>, pSrb) para solicitações específicas de fluxo. (O minidriver também pode concluir uma solicitação chamando StreamClassCompleteRequestAndMarkQueueReady(pSrb). Consulte essa rotina para obter detalhes.)
Se o driver de classe atingir o tempo limite da solicitação, ele chamará a rotina StrMiniRequestTimeout do minidriver, que tem a responsabilidade de encerrar o processamento da solicitação. Se o minidriver enfileirar uma solicitação para processamento posterior, ele deverá definir o membro TimeoutCounter como zero, o que impedirá que o driver de classe cronometre a solicitação. Depois que o minidriver estiver pronto para retomar o processamento da solicitação, ele deverá redefinir o membro TimeoutCounter para o valor de TimeoutOriginal.
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | strmini.h (inclua Strmini.h) |