USBCAMD2相机迷你驱动程序通常的工作方式如下:
相机微型驱动程序在其DriverEntry例程中调用USBCAMD_DriverEntry。 当微型驱动程序 调用USBCAMD_DriverEntry时,它会传递给USBCAMD2微型驱动程序的 AdapterReceivePacket 回调函数。 然后,USBCAMD2向 stream.sys 类驱动程序注册微型驱动程序。
然后,相机微型驱动程序可以在其 AdapterReceivePacket 回调函数中接收各种流请求块(SRB),包括:
相机微型驱动程序负责确定如何处理每个 SRB。 微型驱动程序可以调用USBCAMD2微型驱动程序库中的例程,以帮助处理 SRB。 这些例程通常以 USBCAMD_ 前缀开头。
例如,若要使用 USBCAMD2 指定相机微型驱动程序的其他回调函数,相机微型驱动程序在 USBCAMD_DEVICE_DATA2 结构中指定其入口点。 然后,微型驱动程序调用 USBCAMD_InitializeNewInterface ,将初始化的USBCAMD_DEVICE_DATA2结构传递给USBCAMD2。 然后,USBCAMD2在必要时调用微型驱动程序的回调函数。
注释
USBCAMD2仅出于向后兼容性的目的,支持USBCAMD_DEVICE_DATA结构。
微型驱动程序必须调用 USBCAMD_AdapterReceivePacket 来发送任何它无法处理的 SRB 以 USBCAMD2 进行处理。
USBCAMD 库回调函数 描述微型驱动程序实现的回调函数,以及它们是可选的还是必需的。
以下过程列表说明了发送到相机微型驱动程序的 SRB 的一般处理流程:
微型驱动程序的 SRB_INITIALIZE_DEVICE 处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 通过调用 USBCAMD_InitializeNewInterface 来初始化 USBCAMD2,以指示内核模式下的视频或静态图像原始处理要求,例如启用设备事件。 |
| 相机微型驱动程序 | 调用 USBCAMD_AdapterReceivePacket。 |
| USBCAMD2 | 获取 USB 设备和配置描述符。 |
| USBCAMD2 | 调用微型驱动程序的 CamConfigureEx 回调函数。 |
| 相机微型驱动程序 | 完成配置。 选择备用设置和最大传输大小。 填写 USBCAMD_Pipe_Config_Descriptor 结构的数组。 |
| USBCAMD2 | 分析 USBCAMD_Pipe_Config_Descriptor 结构的数组。 |
| USBCAMD2 | 调用微型驱动程序的 CamInitialize 回调函数。 |
| 相机迷你驱动程序 | 完成初始化。 设置设备电源并激活相机上的默认设置。 |
| USBCAMD2 | 向stream.sys类驱动程序提供流的数量和流描述符的大小。 |
微型驱动程序的SRB_GET_STREAM_INFO处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 将 HW_STREAM_INFORMATION 流信息结构提供给 stream.sys 类驱动程序。 |
| 相机微型驱动程序 | 在 stream.sys 类驱动程序 HW_STREAM_HEADER结构中 填写指向设备属性集数组的指针。 |
| 相机微型驱动程序 | 调用 USBCAMD_AdapterReceivePacket。 |
| USBCAMD2 | 填写流标头中的引脚数。 |
| USBCAMD2 | 公开设备事件表(如果有)。 |
| USBCAMD2 | 修复流信息表中的条目值。 设置类别名称(捕获或静止)。 |
| USBCAMD2 | 填写指向流属性数组的指针。 |
微型驱动程序的SRB_INITIALIZATION_COMPLETE处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 使用 IRP_MJ_PNP 和 IRP_MN_QUERY_INTERFACE 为 USBCAMD2 获取 GUID_USBCAMD_INTERFACE。 |
微型驱动程序的SRB_GET_DEVICE_PROPERTY处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 获取相机微型驱动程序处理的属性,例如 PROPSETID_VIDCAP_VIDEOPROCAMP、 PROPSETID_VIDCAP_CAMERACONTROL和 PROPSETID_VIDCAP_VIDEOCONTROL,以及任何其他自定义属性集。 |
微型驱动程序的 SRB_SET_DEVICE_PROPERTY 处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 通过获取 PROPSETID_VIDCAP_VIDEOPROCAMP、 PROPSETID_VIDCAP_CAMERACONTROL和 PROPSETID_VIDCAP_VIDEOCONTROL和其他任何自定义属性集的参数,设置相机微型驱动程序处理的属性。 |
微型驱动程序的SRB_GET_DATA_INTERSECTION处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 从 KSDATARANGE 结构返回 KSDATAFORMAT 结构。 |
| 相机微型驱动程序 | 检查请求的帧速率(VideoInfoHeader.AvgTimePerFrame)是否处于所请求视频格式的上限和下限。 如果超出限制,微型驱动程序应更正以下 pSrb-CommandData.IntersectInfo-Datarange 中的值:VideoInfoHeader.AvgTimePerFrame,以及 VideoInfoHeader.dwBitRate。 |
微型驱动程序的 SRB_OPEN_STREAM 处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 验证视频格式。 |
| 相机微型驱动程序 | 调用 USBCAMD_AdapterReceivePacket。 |
| USBCAMD2 | 保存相机微型驱动程序接受的视频格式。 |
| USBCAMD2 | 调用微型驱动程序的 CamAllocateBandwidthEx 回调函数,根据视频格式数据分配带宽,并获取视频格式的最大缓冲区大小。 |
| 相机微型驱动程序 | 计算满足所请求帧速率和输出窗口大小的时序通道的最大数据包大小。 |
| 相机微型驱动程序 | 通过调用 USBCAMD_SelectAlternateInterface选择最近的备用设置。 微型驱动程序应为USBCAMD2提供相机可以生成的最大帧大小。 |
| 相机微型驱动程序 | 在相机上设置硬件缩放。 将相机控件设置为注册表中的存储值,或设置为默认设置(如果第一次)。 |
| 相机微型驱动程序 | 确保帧速率(VideoInfoHeader.AvgTimePerFrame)在视频格式的限制范围内,如果不在范围内,请进行更正。 |
| USBCAMD2 | 调用微型驱动程序的 CamStartCaptureEx 回调函数。 |
| 相机微型驱动程序 | 将硬件设置为捕获模式。 |
| USBCAMD2 | 初始化同步或批量传输。 |
微型驱动程序的SRB_CLOSE_STREAM处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 调用 USBCAMD_AdapterReceivePacket。 |
| USBCAMD2 | 取消提交到USBCAMD2的挂起的I/O请求包 (IRP)。 将任何挂起的数据 SRB 返回到 stream.sys 类驱动程序。 |
| USBCAMD2 | 调用微型驱动程序的 CamStopCaptureEx 回调函数。 |
| 相机微型驱动程序 | 将停止捕获指令发送到相机。 |
| USBCAMD2 | 如果适用,请调用微型驱动程序的 CamFreeBandwidthEx 回调函数以释放非时序总线带宽。 |
| 相机微型驱动程序 | 选择空闲的备用设置。 |
| USBCAMD2 | 与 USB 管道关联的免费资源。 |
微型驱动程序的SRB_UNINITIALIZE_DEVICE处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 调用 USBCAMD_AdapterReceivePacket。 |
| USBCAMD2 | 如果任何流仍处于打开状态,请通过为每个流调用微型驱动程序的 CamStopCaptureEx 和 CamFreeBandwidthEx 回调函数来关闭它们。 |
| USBCAMD2 | 调用微型驱动程序的 CamUnInitialize 回调函数。 |
| 相机微型驱动程序 | 清理和释放资源。 |
微型驱动程序的SRB_SURPRISE_REMOVAL处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 调用 USBCAMD_AdapterReceivePacket。 |
| USBCAMD2 | 取消挂起的数据SRB,并返回状态为STATUS_CANCELLED的SRB。 |
| USBCAMD2 | 在所有打开的流上调用微型驱动程序的 CamStopCaptureEx 和 CamFreeBandwidthEx 回调函数。 |
| USBCAMD2 | 在 SRB_SURPRISE_REMOVAL 后,对任何到达的读/写 SRB 返回 STATUS_CANCELLED。 |
微型驱动程序的SRB_SET_DATA_FORMAT处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 验证新的视频格式。 |
| 相机微型驱动程序 | 调用 USBCAMD_SetVideoFormat。 |
| USBCAMD2 | 使用关联的流扩展保存新格式。 |
用于微型驱动程序从开机到关机的电源状态更改处理程序SRB_CHANGE_POWER_STATE
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 调用 USBCAMD_AdapterReceivePacket。 |
| USBCAMD2 | 如果适用,请停止在等时管道上的流式传输,或者取消挂起的批量传输或中断传输。 |
| USBCAMD2 | 调用微型驱动程序的 CamStopCaptureEx 回调函数。 |
| 相机微型驱动程序 | 将停止捕获命令发送到硬件。 |
微型驱动程序的SRB_CHANGE_POWER_STATE从 Power OFF 到 Power ON 处理程序
| 组件 | 行动 |
|---|---|
| 相机微型驱动程序 | 调用 USBCAMD_AdapterReceivePacket。 |
| USBCAMD2 | 如果适用,请在时序管道上重启流式处理,或者重新提交批量传输或中断传输到 USB 类。 |
| 相机微型驱动程序 | 将相机设置和相机电量还原到正常级别。 |
| USBCAMD2 | 调用微型驱动程序的 CamStopCaptureEx 回调函数。 |
| USBCAMD2 | 调用微型驱动程序的 CamStartCaptureEx 回调函数。 |