structure HW_STREAM_REQUEST_BLOCK (strmini.h)
Le pilote de classe de flux utilise la structure HW_STREAM_REQUEST_BLOCK pour transmettre des informations à et à partir du minidriver, à l’aide des rappels fournis par minidriver.
Syntaxe
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;
Membres
SizeOfThisPacket
Spécifie la taille, en octets, de cette structure.
Command
Spécifie l’opération à effectuer par le rappel du minidriver. Le pilote de classe transmet SRB_XXX codes de commande aux rappels minidriver.
Status
Lorsque le minidriver termine une demande de flux, il remplit ce membre avec le code status de la demande. Consultez la documentation relative à la routine de requêteStrMiniXxx appropriée pour connaître les codes status les mini-drives sont censés utiliser.
StreamObject
Pour les requêtes orientées flux, le pilote de classe définit ce paramètre pour qu’il pointe vers la structure HW_STREAM_OBJECT qui spécifie le flux sur lequel le pilote de classe effectue une requête.
HwDeviceExtension
Pointeur vers l’extension de l’appareil du minidriver. Le minidriver peut utiliser cette mémoire tampon pour enregistrer des informations privées. Le minidriver définit la taille de cette mémoire tampon dans la structure HW_INITIALIZATION_DATA qu’il passe lorsqu’il s’inscrit lui-même via StreamClassRegisterMinidriver. Le pilote de classe transmet également des pointeurs vers cette mémoire tampon dans le membre HwDeviceExtension du HW_STREAM_OBJECT, HW_TIME_CONTEXT et PORT_CONFIGURATION_INFORMATION structures qu’il transmet au minidriver.
SRBExtension
Pointe vers une mémoire tampon non initialisée que le pilote de classe alloue pour le minidriver à utiliser lors du traitement de ce bloc de demande de flux. Cette mémoire tampon est libérée une fois que le minidriver a terminé sa gestion du bloc (voir StreamClassDeviceNotification ou StreamClassStreamNotification pour plus d’informations ).
CommandData
CommandData est une union de membres fournis pour les données spécifiques au code de commande.
CommandData.DataBufferArray
Pointeur vers un tableau de structures KSSTREAM_HEADER . Le nombre d’entrées dans ce tableau est spécifié dans NumberOfBuffers. Chaque KSSTREAM_HEADER décrit un bloc de données.
Ce membre est utilisé lorsque le code de commande est SRB_READ_DATA ou SRB_WRITE_DATA.
CommandData.StreamBuffer
Pointe vers la structure HW_STREAM_DESCRIPTOR que le minidriver remplit avec une description de la sémantique de diffusion en continu du noyau qu’il prend en charge.
Le minidriver spécifie la taille de cette mémoire tampon dans le membre StreamDescriptorSize de sa structure PORT_CONFIGURATION_INFORMATION .
Ce membre est utilisé lorsque le code de commande est SRB_GET_STREAM_INFO.
CommandData.StreamState
État du flux. Pour plus d’informations, consultez KSPROPERTY_CONNECTION_STATE .
Ce membre est utilisé lorsque le code de commande est SRB_GET_STREAM_STATE ou SRB_SET_STREAM_STATE.
CommandData.TimeReference
Pointeur vers une structure STREAM_TIME_REFERENCE.
CommandData.PropertyInfo
Pointe vers la structure STREAM_PROPERTY_DESCRIPTOR qui spécifie les paramètres de l’opération get ou set de propriété.
Ce membre est utilisé lorsque le code de commande est SRB_GET_DEVICE_PROPERTY, SRB_SET_DEVICE_PROPERTY, SRB_GET_STREAM_PROPERTY ou SRB_SET_STREAM_PROPERTY.
CommandData.OpenFormat
Pointeur vers la structure KSDATAFORMAT qui spécifie le format.
Ce membre est utilisé lorsque le code de commande est SRB_OPEN_STREAM ou SRB_PROPOSE_DATA_FORMAT.
CommandData.ConfigInfo
Pointeur vers la structure PORT_CONFIGURATION_INFORMATION utilisée pour initialiser l’appareil
Ce membre est utilisé lorsque le code de commande est SRB_INITIALIZE_DEVICE.
CommandData.MasterClockHandle
Handle pour l’objet d’horloge qui sert désormais d’horloge master.
Ce membre est utilisé lorsque le code de commande est SRB_OPEN_MASTER_CLOCK ou SRB_INDICATE_MASTER_CLOCK.
CommandData.DeviceState
Spécifie le nouvel état d’alimentation.
Ce membre est utilisé lorsque le code de commande est SRB_CHANGE_POWER_STATE.
CommandData.IntersectInfo
Pointeur vers une structure STREAM_DATA_INTERSECT_INFO qui décrit les paramètres de cette opération.
Ce membre est utilisé lorsque le code de commande est SRB_GET_DATA_INTERSECTION.
CommandData.MethodInfo
Pointeur vers une mémoire tampon à partir de laquelle les données de méthode seront lues ou écrites.
CommandData.FilterTypeIndex
Index de type de filtre pour SRB_OPEN_DEVICE_INSTANCE.
CommandData.Idle
Ce membre est défini sur TRUE si aucun handle ouvert sur l’appareil ne reste. Ce membre a la valeur FALSE si l’appareil n’est plus inactif (un handle de l’appareil a été ouvert).
Ce membre est utilisé lorsque le code de commande est SRB_NOTIFY_IDLE_STATE.
_CommandData
CommandData est une union de membres fournis pour les données spécifiques au code de commande.
NumberOfBuffers
Si Command est SRB_READ_DATA ou SRB_WRITE_DATA, cela spécifie le nombre d’entrées dans le tableau de structures KSSTREAM_HEADER qui commence à l’adresse pointée par CommandData.DataBufferArray. Sinon, ce paramètre n’est pas utilisé.
TimeoutCounter
Nombre de secondes avant l’expiration de cette requête. Le pilote de classe décrémente cela une fois par seconde. Si le pilote de classe décrémente TimeoutCounter à zéro avant que le minidriver ne termine cette demande, il appelle la routine StrMiniRequestTimeout du minidriver. Si le minidriver définit ce paramètre sur zéro, la demande n’expire pas.
TimeoutOriginal
Le pilote de classe définit cette valeur sur la valeur d’origine de TimeoutCounter lors de la création du SRB.
NextSRB
Pointe vers un autre bloc de demande de flux. Le minidriver peut utiliser ce membre pour mettre en file d’attente les blocs de demande de flux.
Irp
Pointeur vers l’IRP pour la demande. La plupart des minidrivers n’ont pas besoin d’utiliser ce membre.
Flags
Spécifie le type de requête. Le pilote de classe et le minidriver peuvent utiliser ce membre pour déterminer à quel rappel le pilote de classe a passé ce bloc de demande de flux.
Valeur | Rappel utilisé |
---|---|
None | 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 est défini pour les requêtes spécifiques au flux (qui sont transmises aux routines de paquets StrMiniReceiveStreamXxx du minidriver). Le SRB_HW_FLAGS_DATA_TRANSFER bit est défini pour les demandes de transfert de données (qui sont passées au minidriver).
HwInstanceExtension
Pointeur vers l’extension instance du minidriver. Le minidriver peut utiliser cette mémoire tampon pour enregistrer des informations privées globales sur cette instance du minidriver. Le minidriver définit la taille de cette mémoire tampon dans la structure HW_INITIALIZATION_DATA qu’il passe lorsqu’il s’inscrit lui-même via StreamClassRegisterMinidriver.
NumberOfBytesToTransfer
Pour une requête SRB_READ_DATA ou SRB_WRITE_DATA, le nombre d’octets à transférer.
ActualBytesTransferred
Pour les demandes de contrôle, le nombre d’octets réellement transférés.
ScatterGatherBuffer
Pointe vers un tableau de structures KSSCATTER_GATHER, de la forme :
typedef struct {
PHYSICAL_ADDRESS PhysicalAddress;
ULONG Length;
} KSSCATTER_GATHER, *PKSSCATTER_GATHER;
Le tableau décrit une liste de points/regroupement qui peut être utilisée par le minidriver pour effectuer DMA. La mémoire n’a pas besoin d’être sondée, verrouillée, mappée ou vidée. Le pilote de classe de flux effectue ces opérations pour le minidriver.
NumberOfPhysicalPages
Spécifie la taille du tableau transmis dans le membre ScatterGatherBuffer .
NumberOfScatterGatherElements
Spécifie le nombre d’éléments physiques pointés par ScatterGatherBuffer.
Reserved[1]
Le champ Réservé[1] est réservé à l’utilisation du système. Ne pas utiliser.
Remarques
Le pilote de classe de flux transmet des pointeurs vers HW_STREAM_REQUEST_BLOCK structures vers les routines StrMiniReceiveStreamDataPacket, StrMiniReceiveStreamControlPacket et StrMiniReceiveDevicePacket du minidriver.
Le minidriver possède ce bloc de demande de flux jusqu’à ce que la requête expire ou qu’il termine la demande. Le minidriver signale au pilote de classe qu’il a terminé la demande en appelant StreamClassDeviceNotification(DeviceRequestComplete, pSrb-HwDeviceExtension>, pSRB) pour les requêtes spécifiques à l’appareil, ou en appelant StreamClassStreamNotification(StreamRequestComplete, pSrb-StreamObject>, pSrb) pour les requêtes spécifiques au flux. (Le minidriver peut également effectuer une demande en appelant StreamClassCompleteRequestAndMarkQueueReady(pSrb). Pour plus d’informations, consultez cette routine.)
Si le pilote de classe expire la demande, il appelle la routine StrMiniRequestTimeout du minidriver, qui a la responsabilité de mettre fin au traitement de la demande. Si le minidriver met en file d’attente une demande pour un traitement ultérieur, il doit définir le membre TimeoutCounter sur zéro, ce qui empêchera le pilote de classe d’expirer la demande. Une fois que le minidriver est prêt à reprendre le traitement de la demande, il doit réinitialiser le membre TimeoutCounter à la valeur TimeoutOriginal.
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | strmini.h (include Strmini.h) |