Compartilhar via


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)