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) |