KS相机驱动
+ -

AVStreaml架构

2025-02-12 23 0

AVStream描述符架构

AVStream迷你端口驱动提供以下的层级对象,各个层级对象通过其描述符来创建其工厂对象,再由工厂对象创建其对应的层级对象。故重点就是通过提供描述符创建其工厂对象。

工厂对象的创建分为静态创建和动态创建:

  • 静态创建是直接在DriverEntry函数中调用KsInitializeDriver,其第三个参数就是描述符。
  • 动态创建是在驱动运行过程中调用KsCreateFilterFactory函数来创建,动态创建Node通过KsFilterCreateNode,动态建Pin通过KsFilterCreatePinFactory.

Pin和Node不管是动态还是静态创建,都不能单独删除,只能随着Filter对象一起删除。

静态创建

在静态创建时,其描述符类型为:KSDEVICE_DESCRIPTOR。设备描述符KSDEVICE_DESCRIPTOR内包含了多个FilterFactory描述符,而FilterFactory描述符中又包含了多个PinFactory及其它描述符。

设备描述符

typedef struct {
  const KSDEVICE_DISPATCH*  Dispatch;//仅用于PNP相关的系统回调

  ULONG  FilterDescriptorsCount;
  const  KSFILTER_DESCRIPTOR*const* FilterDescriptors;
  ULONG  Version;
  ULONG  Flags;
} KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;

FilerFactory描述符

typedef struct {
  const KSFILTER_DISPATCH*  Dispatch; //Filter本身的通知函数-create-close-reset-process
  const KSAUTOMATION_TABLE*  AutomationTable;//filter支持的通知事件、方法、属性
  ULONG  Version;
  ULONG  Flags;
  const GUID*  ReferenceGuid;//Filter类型GUID

  ULONG  PinDescriptorsCount;
  ULONG  PinDescriptorSize;
  const KSPIN_DESCRIPTOR_EX*  PinDescriptors;

  ULONG  CategoriesCount;
  const GUID*  Categories;//filter category GUIDs 

  ULONG  NodeDescriptorsCount;
  ULONG  NodeDescriptorSize;
  const KSNODE_DESCRIPTOR*  NodeDescriptors;

  ULONG  ConnectionsCount;
  const KSTOPOLOGY_CONNECTION*  Connections;

  const KSCOMPONENTID*  ComponentId;
} KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;

如下图的TopologyFilter,拥有2个Pin和一个Node.数据从左边的KSPIN_WAVEOUT_SRC pin流入到该Filter,这个Pin与唯一的Volume Node之间有一个Connection结构体,然后数据再从KSPIN_SPEAKER_DST pin流出,而Volume Node和这个Pin之间也有一个Connection结构体。
101830148349

这个Filter的两个Connection结构体定义如下:

KSTOPOLOGY_CONNECTION connect[]={
    {PCFILTER_NODE,KSPIN_WAREOUT_SRC,KSNODE_WAVEOUT_VOUME,1}
    {KSNODE_WAVEOUT_VOUME,0,PCFILTER_NODE,KPIN_SPEAKERS_DST}
}
  • PIN其实是该Filter对外暴露的惟一接口
  • Node内部进行数据处理,但和PIN需要Connection

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!