Condividi tramite


struttura HW_STREAM_REQUEST_BLOCK (strmini.h)

Il driver della classe di flusso usa la struttura HW_STREAM_REQUEST_BLOCK per passare informazioni da e verso il minidriver, usando i callback forniti dal minidriver.

Sintassi

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;

Membri

SizeOfThisPacket

Specifica le dimensioni, in byte, di questa struttura.

Command

Specifica l'operazione da eseguire dal callback del minidriver. Il driver di classe passa SRB_XXX codici di comando ai callback del minidriver.

Status

Quando il minidriver completa una richiesta di flusso, riempie questo membro con il codice di stato della richiesta. Vedere la documentazione relativa alla routine StrMiniXxxRequest routine per i minidriver per i codici di stato.

StreamObject

Per le richieste orientate ai flussi, il driver di classe imposta questo valore in modo che punti alla struttura HW_STREAM_OBJECT che specifica il flusso in cui il driver di classe sta effettuando una richiesta.

HwDeviceExtension

Puntatore all'estensione del dispositivo del minidriver. Il minidriver può usare questo buffer per registrare informazioni private. Il minidriver imposta le dimensioni di questo buffer nella struttura HW_INITIALIZATION_DATA che passa quando si registra tramite StreamClassRegisterMinidriver. Il driver di classe passa anche puntatori a questo buffer nella HwDeviceExtension membro del HW_STREAM_OBJECT, HW_TIME_CONTEXTe PORT_CONFIGURATION_INFORMATION strutture che passa al minidriver.

SRBExtension

Punta a un buffer non inizializzato che il driver di classe alloca per il minidriver da usare durante l'elaborazione di questo blocco di richieste di flusso. Questo buffer viene deallocato dopo che il minidriver completa la gestione del blocco (vedere StreamClassDeviceNotification o StreamClassStreamNotification per informazioni dettagliate).

CommandData

commandData è un'unione di membri forniti per i dati specifici del codice del comando.

CommandData.DataBufferArray

Puntatore a una matrice di strutture KSSTREAM_HEADER. Il numero di voci in questa matrice viene specificato in NumberOfBuffers. Ogni KSSTREAM_HEADER descrive un blocco di dati.

Questo membro viene usato quando il codice del comando viene SRB_READ_DATA o SRB_WRITE_DATA.

CommandData.StreamBuffer

Punta alla struttura HW_STREAM_DESCRIPTOR in cui il minidriver inserisce una descrizione della semantica di streaming del kernel supportata.

Il minidriver specifica le dimensioni di questo buffer nel StreamDescriptorSize membro della relativa struttura PORT_CONFIGURATION_INFORMATION.

Questo membro viene usato quando il codice del comando è SRB_GET_STREAM_INFO.

CommandData.StreamState

Stato del flusso. Per informazioni dettagliate, vedere KSPROPERTY_CONNECTION_STATE.

Questo membro viene usato quando il codice del comando viene SRB_GET_STREAM_STATE o SRB_SET_STREAM_STATE.

CommandData.TimeReference

Puntatore a una struttura STREAM_TIME_REFERENCE.

CommandData.PropertyInfo

Punta alla struttura STREAM_PROPERTY_DESCRIPTOR che specifica i parametri per l'operazione get o set della proprietà.

Questo membro viene usato quando il codice del comando viene SRB_GET_DEVICE_PROPERTY, SRB_SET_DEVICE_PROPERTY, SRB_GET_STREAM_PROPERTYo SRB_SET_STREAM_PROPERTY.

CommandData.OpenFormat

Puntatore alla struttura KSDATAFORMAT che specifica il formato.

Questo membro viene usato quando il codice del comando viene SRB_OPEN_STREAM o SRB_PROPOSE_DATA_FORMAT.

CommandData.ConfigInfo

Puntatore alla struttura PORT_CONFIGURATION_INFORMATION usata per inizializzare il dispositivo

Questo membro viene usato quando il codice del comando è SRB_INITIALIZE_DEVICE.

CommandData.MasterClockHandle

Handle per l'oggetto clock che ora funge da orologio master.

Questo membro viene usato quando il codice del comando è SRB_OPEN_MASTER_CLOCK o SRB_INDICATE_MASTER_CLOCK.

CommandData.DeviceState

Specifica il nuovo stato di alimentazione.

Questo membro viene usato quando il codice del comando è SRB_CHANGE_POWER_STATE.

CommandData.IntersectInfo

Puntatore a una struttura STREAM_DATA_INTERSECT_INFO che descrive i parametri di questa operazione.

Questo membro viene usato quando il codice del comando è SRB_GET_DATA_INTERSECTION.

CommandData.MethodInfo

Puntatore a un buffer in cui i dati del metodo verranno letti o scritti.

CommandData.FilterTypeIndex

Indice del tipo di filtro per SRB_OPEN_DEVICE_INSTANCE.

CommandData.Idle

Questo membro è impostato su TRUE se non rimangono handle aperti per il dispositivo. Questo membro è impostato su FALSE se il dispositivo non è più inattiva (un handle per il dispositivo è stato aperto).

Questo membro viene usato quando il codice del comando è SRB_NOTIFY_IDLE_STATE.

_CommandData

commandData è un'unione di membri forniti per i dati specifici del codice del comando.

NumberOfBuffers

Se Command è SRB_READ_DATA o SRB_WRITE_DATA, specifica il numero di voci nella matrice di strutture KSSTREAM_HEADER che iniziano all'indirizzo a cui punta CommandData.DataBufferArray. In caso contrario, questo parametro non è usato.

TimeoutCounter

Numero di secondi prima del timeout della richiesta. Il driver di classe decrementa questo valore una volta al secondo. Se il driver di classe decrementa TimeoutCounter a zero prima che il minidriver completi questa richiesta, chiamerà la routine strMiniRequestTime out del minidriver. Se il minidriver imposta questo valore su zero, la richiesta non si verifica il timeout.

TimeoutOriginal

Il driver di classe imposta questo valore sul valore originale di TimeoutCounter alla creazione di SRB.

NextSRB

Punta a un altro blocco di richieste di flusso. Il minidriver può usare questo membro per accodare blocchi di richieste di flusso.

Irp

Puntatore all'IRP per la richiesta. La maggior parte dei minidriver non deve usare questo membro.

Flags

Specifica il tipo di richiesta. Il driver di classe e il minidriver possono usare questo membro per determinare il callback a cui il driver di classe ha passato questo blocco di richiesta di flusso.

Valore Callback usato
Nessuno 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 viene impostato per le richieste specifiche del flusso (che vengono passate alle routine di StrMiniReceiveStreamXxxPacket). Il bit SRB_HW_FLAGS_DATA_TRANSFER è impostato per le richieste di trasferimento dei dati (che vengono passate al minidriver).

HwInstanceExtension

Puntatore all'estensione dell'istanza del minidriver. Il minidriver può usare questo buffer per registrare informazioni private globali in questa istanza del minidriver. Il minidriver imposta le dimensioni di questo buffer nella struttura HW_INITIALIZATION_DATA che passa quando si registra tramite StreamClassRegisterMinidriver.

NumberOfBytesToTransfer

Per una richiesta di SRB_READ_DATA o SRB_WRITE_DATA, il numero di byte da trasferire.

ActualBytesTransferred

Per le richieste di controllo, il numero di byte effettivamente trasferiti.

ScatterGatherBuffer

Punta a una matrice di strutture KSSCATTER_GATHER, del formato:

typedef struct {
    PHYSICAL_ADDRESS PhysicalAddress;
    ULONG Length;
} KSSCATTER_GATHER, *PKSSCATTER_GATHER;

La matrice descrive un elenco a dispersione/raccolta che può essere usato dal minidriver per eseguire DMA. La memoria non deve essere sottoposto a probe, bloccato, mappato o scaricato. Il driver della classe di flusso esegue queste operazioni per il minidriver.

NumberOfPhysicalPages

Specifica le dimensioni della matrice passata nel membro ScatterGatherBuffer.

NumberOfScatterGatherElements

Specifica il numero di elementi fisici a cui punta ScatterGatherBuffer.

Reserved[1]

Il campo Riservato[1] è riservato per l'uso del sistema. Non usare.

Osservazioni

Il driver della classe di flusso passa puntatori alle strutture HW_STREAM_REQUEST_BLOCK alle StrMiniReceiveStreamDataPacket, StrMiniReceiveStreamControlPackete routine StrMiniReceiveDevicePacket.

Il minidriver è proprietario di questo blocco di richiesta di flusso fino al timeout della richiesta o al completamento della richiesta. Il minidriver segnala al driver di classe che ha completato la richiesta chiamando StreamClassDeviceNotification(DeviceRequestComplete, pSrb->HwDeviceExtension, pSRB) per le richieste specifiche del dispositivo o chiamando StreamClassStreamNotification(StreamRequestComplete, pSrb->StreamObject, pSrb) per le richieste specifiche del flusso. Il minidriver può anche completare una richiesta chiamando StreamClassCompleteRequestAndMarkQueueReady(pSrb). Per informazioni dettagliate, vedere la routine.

Se il driver di classe raggiunge il timeout della richiesta, chiamerà la routine strMiniRequestTimeout del minidriver, che ha la responsabilità di terminare l'elaborazione della richiesta. Se il minidriver accoda una richiesta per un'elaborazione successiva, deve impostare il TimeoutCounter membro su zero, impedendo al driver di classe di timeout la richiesta. Quando il minidriver è pronto per riprendere l'elaborazione della richiesta, deve reimpostare il membro TimeoutCounter al valore di TimeoutOriginal.

Fabbisogno

Requisito Valore
intestazione strmini.h (include Strmini.h)