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