HW_STREAM_REQUEST_BLOCK 结构 (strmini.h)
流类驱动程序使用 HW_STREAM_REQUEST_BLOCK 结构,使用微型驱动程序提供的回调向微型驱动程序传递和从微型驱动程序传递信息。
语法
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;
成员
SizeOfThisPacket
指定此结构的大小(以字节为单位)。
Command
指定要由微型驱动程序的回调执行的操作。 类驱动程序将SRB_XXX命令代码传递给微型驱动程序回调。
Status
当微型驱动程序完成流请求时,它会用请求的状态代码填充此成员。 有关微型驱动程序应使用的状态代码,请参阅相应的 StrMiniXxx请求 例程的文档。
StreamObject
对于面向流的请求,类驱动程序将此设置为指向 HW_STREAM_OBJECT 结构,该结构指定类驱动程序发出请求的流。
HwDeviceExtension
指向微型驱动程序的设备扩展的指针。 微型驱动程序可以使用此缓冲区来记录私人信息。 微型驱动程序在通过 StreamClassRegisterMinidriver 注册自身时,在传递的HW_INITIALIZATION_DATA结构中设置此缓冲区的大小。 类驱动程序还会将指针传递到HW_STREAM_OBJECT的 HwDeviceExtension 成员中的此缓冲区,HW_TIME_CONTEXT,并将PORT_CONFIGURATION_INFORMATION结构传递给微型驱动程序。
SRBExtension
指向类驱动程序为微型驱动程序分配的未初始化缓冲区,以便在处理此流请求块时使用。 此缓冲区在微型驱动程序完成对块的处理后解除分配 (请参阅 StreamClassDeviceNotification 或 StreamClassStreamNotification 了解详细信息) 。
CommandData
CommandData 是为特定于命令代码的数据提供的成员联合。
CommandData.DataBufferArray
指向 KSSTREAM_HEADER 结构的数组的指针。 此数组中的条目数在 NumberOfBuffers 中指定。 每个KSSTREAM_HEADER描述一个数据块。
SRB_READ_DATA或SRB_WRITE_DATA命令代码时使用此成员。
CommandData.StreamBuffer
指向微型驱动程序填充的 HW_STREAM_DESCRIPTOR 结构,并说明它支持的内核流式处理语义。
微型驱动程序在其 PORT_CONFIGURATION_INFORMATION 结构的 StreamDescriptorSize 成员中指定此缓冲区的大小。
SRB_GET_STREAM_INFO命令代码时使用此成员。
CommandData.StreamState
流状态。 有关详细信息 ,请参阅KSPROPERTY_CONNECTION_STATE 。
SRB_GET_STREAM_STATE或SRB_SET_STREAM_STATE命令代码时使用此成员。
CommandData.TimeReference
指向STREAM_TIME_REFERENCE结构的指针。
CommandData.PropertyInfo
指向 STREAM_PROPERTY_DESCRIPTOR 结构,该结构指定属性 get 或 set 操作的参数。
当命令代码 SRB_GET_DEVICE_PROPERTY、 SRB_SET_DEVICE_PROPERTY、 SRB_GET_STREAM_PROPERTY或 SRB_SET_STREAM_PROPERTY时,使用此成员。
CommandData.OpenFormat
指向 KSDATAFORMAT 结构的指针,该结构指定格式。
在 命令代码SRB_OPEN_STREAM 或 SRB_PROPOSE_DATA_FORMAT时使用此成员。
CommandData.ConfigInfo
指向用于初始化设备的 PORT_CONFIGURATION_INFORMATION 结构的指针
SRB_INITIALIZE_DEVICE命令代码时使用此成员。
CommandData.MasterClockHandle
现在用作主时钟的时钟对象的句柄。
SRB_OPEN_MASTER_CLOCK或SRB_INDICATE_MASTER_CLOCK命令代码时使用此成员。
CommandData.DeviceState
指定新的电源状态。
SRB_CHANGE_POWER_STATE命令代码时使用此成员。
CommandData.IntersectInfo
指向描述此操作参数 的STREAM_DATA_INTERSECT_INFO 结构的指针。
SRB_GET_DATA_INTERSECTION命令代码时使用此成员。
CommandData.MethodInfo
指向将从中读取或写入方法数据的缓冲区的指针。
CommandData.FilterTypeIndex
SRB_OPEN_DEVICE_INSTANCE的筛选器类型索引。
CommandData.Idle
如果设备没有打开的句柄,则此成员设置为 TRUE 。 如果设备不再处于空闲状态,则此成员将设置为 FALSE , () 打开设备的句柄。
SRB_NOTIFY_IDLE_STATE命令代码时使用此成员。
_CommandData
CommandData 是为特定于命令代码的数据提供的成员联合。
NumberOfBuffers
如果 Command 是SRB_READ_DATA或SRB_WRITE_DATA,则指定从 CommandData.DataBufferArray 指向的地址开始的KSSTREAM_HEADER结构数组中的条目数。 否则,此参数未使用。
TimeoutCounter
此请求超时之前的秒数。类驱动程序每秒递减一次。 如果类驱动程序在微型驱动程序完成此请求之前将 TimeoutCounter 递减为零,它将调用微型驱动程序的 StrMiniRequestTimeout 例程。 如果微型驱动程序将此设置为零,则请求不会超时。
TimeoutOriginal
类驱动程序在创建 SRB 时将其设置为 TimeoutCounter 的原始值。
NextSRB
指向另一个流请求块。 微型驱动程序可以使用此成员将流请求块排队。
Irp
指向请求的 IRP 的指针。 大多数微型驱动程序不需要使用此成员。
Flags
指定请求的类型。 类驱动程序和微型驱动程序可以使用此成员来确定类驱动程序将此流请求块传递到的回调。
值 | 使用的回调 |
---|---|
无 | StrMiniReceiveDevicePacket |
SRB_HW_FLAGS_STREAM_REQUEST | StrMiniReceiveStreamControlPacket |
SRB_HW_FLAGS_DATA_TRANSFER | StrMiniReceiveStreamDataPacket |
SRB_HW_FLAGS_STREAM_REQUEST | StrMiniReceiveStreamDataPacket |
SRB_HW_FLAGS_STREAM_REQUEST位是为流特定的请求设置的, (这些请求传递到微型驱动程序的 StrMiniReceiveStreamXxx数据包 例程) 。 SRB_HW_FLAGS_DATA_TRANSFER位是为传递到微型驱动程序) 的数据传输请求 (设置的。
HwInstanceExtension
指向微型驱动程序的实例扩展的指针。 微型驱动程序可以使用此缓冲区将全局私人信息记录到微型驱动程序的此实例。 微型驱动程序在通过 StreamClassRegisterMinidriver 注册自身时,在传递的HW_INITIALIZATION_DATA结构中设置此缓冲区的大小。
NumberOfBytesToTransfer
对于SRB_READ_DATA或SRB_WRITE_DATA请求,需要传输的字节数。
ActualBytesTransferred
对于控制请求,实际传输的字节数。
ScatterGatherBuffer
指向KSSCATTER_GATHER结构的数组,其形式如下:
typedef struct {
PHYSICAL_ADDRESS PhysicalAddress;
ULONG Length;
} KSSCATTER_GATHER, *PKSSCATTER_GATHER;
数组描述微型驱动程序可用于执行 DMA 的散点/收集列表。 不需要探测、锁定、映射或刷新内存。 流类驱动程序为微型驱动程序执行这些操作。
NumberOfPhysicalPages
指定在 ScatterGatherBuffer 成员中传递的数组的大小。
NumberOfScatterGatherElements
指定 ScatterGatherBuffer 指向的物理元素数。
Reserved[1]
Reserved[1] 字段保留供系统使用。 请勿使用。
注解
流类驱动程序将指向HW_STREAM_REQUEST_BLOCK结构的指针传递给微型驱动程序的 StrMiniReceiveStreamDataPacket、 StrMiniReceiveStreamControlPacket 和 StrMiniReceiveDevicePacket 例程。
微型驱动程序拥有此流请求块,直到请求超时或完成请求。 微型驱动程序通过调用 StreamClassDeviceNotification (DeviceRequestComplete、pSrb-HwDeviceExtension>、pSRB) (针对特定于设备的请求调用 StreamClassStreamNotification (StreamRequestComplete、pSrb-StreamObject、pSrb-StreamObject>、pSrb) )向类驱动程序发出信号,表明它已完成请求。 (微型驱动程序还可以通过调用 StreamClassCompleteRequestAndMarkQueueReady (pSrb) 来完成请求。 有关详细信息,请参阅该例程。)
如果类驱动程序超时请求,它将调用微型驱动程序的 StrMiniRequestTimeout 例程,该例程负责终止对请求的处理。 如果微型驱动程序将请求排队等待后续处理,它应将 TimeoutCounter 成员设置为零,这将防止类驱动程序超时请求。 微型驱动程序准备好继续处理请求后,它应将 TimeoutCounter 成员重置为 TimeoutOriginal 的值。
要求
要求 | 值 |
---|---|
Header | strmini.h (包括 Strmini.h) |