Condividi tramite


HW_STREAM_REQUEST_BLOCK struttura (strmini.h)

Il driver della classe di flusso usa la struttura di 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;

Members

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 per la routine Di richiestaStrMiniXxx appropriata per i minidriver dei codici di stato.

StreamObject

Per le richieste orientate al flusso, il driver di classe imposta questo valore per puntare alla struttura HW_STREAM_OBJECT che specifica il flusso in cui il driver di classe effettua 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 nel membro HwDeviceExtension del HW_STREAM_OBJECT, HW_TIME_CONTEXT e PORT_CONFIGURATION_INFORMATION strutture che passano al minidriver.

SRBExtension

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

CommandData

CommandData è un'unione di membri forniti per i dati specifici del codice di 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 è SRB_READ_DATA o SRB_WRITE_DATA.

CommandData.StreamBuffer

Punta alla struttura HW_STREAM_DESCRIPTOR che il minidriver riempie con una descrizione della semantica di streaming del kernel supportata.

Il minidriver specifica le dimensioni di questo buffer nel membro StreamDescriptorSize 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 è 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 è SRB_GET_DEVICE_PROPERTY, SRB_SET_DEVICE_PROPERTY, SRB_GET_STREAM_PROPERTY o SRB_SET_STREAM_PROPERTY.

CommandData.OpenFormat

Puntatore alla struttura KSDATAFORMAT che specifica il formato.

Questo membro viene usato quando il codice del comando è 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 orologio 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 nel 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 di comando.

NumberOfBuffers

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

TimeoutCounter

Numero di secondi prima del timeout della richiesta. Il driver di classe decrementa questa volta al secondo. Se il driver di classe decrementa TimeoutCounter su zero prima che il minidriver completi questa richiesta, chiamerà la routine StrMiniRequestTimeout del minidriver. Se il minidriver imposta questo valore su zero, la richiesta non viene 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 richiesta di flusso. Il minidriver può usare questo membro per accodare i blocchi di richiesta 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 quale callback il driver di classe ha passato questo blocco di richiesta di flusso a.

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 è impostato per le richieste specifiche del flusso ,passate alle routinestrMiniReceiveStreamXxx del minidriver. Il bit di SRB_HW_FLAGS_DATA_TRANSFER è impostato per le richieste di trasferimento 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 modulo:

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

La matrice descrive un elenco di dispersione/raccolta che può essere usato dal minidriver per eseguire DMA. La memoria non deve essere probe, bloccata, mappata o scaricata. 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 puntati da ScatterGatherBuffer.

Reserved[1]

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

Commenti

Il driver di classe di flusso passa puntatori alle strutture HW_STREAM_REQUEST_BLOCK alle routine StrMiniReceiveStreamDataPacket, StrMiniReceiveStreamControlPacket e StrMiniReceiveDevicePacket.

Il minidriver possiede questo blocco di richiesta di flusso fino al timeout della richiesta oppure completa la 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). Vedere la routine per informazioni dettagliate.

Se il driver di classe esegue 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 l'elaborazione successiva, deve impostare il membro TimeoutCounter su zero, che impedirà al driver di classe di eseguire il timeout della richiesta. Una volta che il minidriver è pronto per riprendere l'elaborazione della richiesta, deve reimpostare il membro TimeoutCounter al valore di TimeoutOriginal.

Requisiti

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