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 结构中设置此缓冲区的大小。 类驱动程序还会将指针传递给 HwDeviceExtensionHW_STREAM_OBJECTHW_TIME_CONTEXT的此缓冲区,以及传递给微型驱动程序的 PORT_CONFIGURATION_INFORMATION 结构。

SRBExtension

指向类驱动程序为微型驱动程序分配的未初始化缓冲区,以便在处理此流请求块时使用。 此缓冲区在微型驱动程序完成对块的处理后解除分配(有关详细信息,请参阅 StreamClassDeviceNotificationStreamClassStreamNotification)。

CommandData

CommandData 是为特定于命令代码的数据提供的成员的联合。

CommandData.DataBufferArray

指向 KSSTREAM_HEADER 结构的数组的指针。 此数组中的条目数在 NumberOfBuffers中指定。 每个KSSTREAM_HEADER描述一个数据块。

当命令代码 SRB_READ_DATASRB_WRITE_DATA时,将使用此成员。

CommandData.StreamBuffer

指向微型驱动程序填充的 HW_STREAM_DESCRIPTOR 结构,其中包含它支持的内核流式处理语义的说明。

微型驱动程序指定 StreamDescriptorSize 中此缓冲区的大小PORT_CONFIGURATION_INFORMATION 结构的成员。

当命令代码 SRB_GET_STREAM_INFO时,将使用此成员。

CommandData.StreamState

流状态。 有关详细信息,请参阅 KSPROPERTY_CONNECTION_STATE

当命令代码 SRB_GET_STREAM_STATESRB_SET_STREAM_STATE时,将使用此成员。

CommandData.TimeReference

指向STREAM_TIME_REFERENCE结构的指针。

CommandData.PropertyInfo

指向 STREAM_PROPERTY_DESCRIPTOR 结构,该结构指定属性获取或设置作的参数。

当命令代码 SRB_GET_DEVICE_PROPERTYSRB_SET_DEVICE_PROPERTYSRB_GET_STREAM_PROPERTYSRB_SET_STREAM_PROPERTY时,将使用此成员。

CommandData.OpenFormat

指向指定格式的 KSDATAFORMAT 结构的指针。

当命令代码 SRB_OPEN_STREAMSRB_PROPOSE_DATA_FORMAT时,将使用此成员。

CommandData.ConfigInfo

指向用于初始化设备的 PORT_CONFIGURATION_INFORMATION 结构的指针

当命令代码 SRB_INITIALIZE_DEVICE时,将使用此成员。

CommandData.MasterClockHandle

现在用作主时钟的时钟对象的句柄。

当命令代码 SRB_OPEN_MASTER_CLOCKSRB_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_DATASRB_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]

保留[1] 字段供系统使用。 请勿使用。

言论

流类驱动程序将指向HW_STREAM_REQUEST_BLOCK结构的指针传递给微型驱动程序的 StrMiniReceiveStreamDataPacketStrMiniReceiveStreamControlPacket,以及 StrMiniReceiveDevicePacket 例程。

微型驱动程序拥有此流请求块,直到请求超时或完成请求。 微型驱动程序通过调用 StreamClassDeviceNotification(DeviceRequestComplete)向类驱动程序发出信号,指示它已完成请求 pSrb->HwDeviceExtension、pSRB)用于特定于设备的请求,或者为流特定的请求调用 StreamClassStreamNotification(StreamRequestComplete、pSrb->StreamObject、pSrb)。 (微型驱动程序还可以通过调用 StreamClassCompleteRequestAndMarkQueueReady(pSrb)来完成请求。 有关详细信息,请参阅该例程。

如果类驱动程序超时请求,它将调用微型驱动程序的 StrMiniRequestTimeout 例程,该例程负责终止请求的处理。 如果微型驱动程序将请求排入队列供以后处理,则应将 TimeoutCounter 成员设置为零,这会阻止类驱动程序超时请求。 微型驱动程序准备好恢复处理请求后,应将 TimeoutCounter 成员重置为 TimeoutOriginal的值。

要求

要求 价值
标头 strmini.h (包括 Strmini.h)