微型驱动程序为要实例化的每种引脚提供 KSPIN_DESCRIPTOR 结构。 引脚描述符结构被称为引脚生成器。 每个引脚工厂都可以实例化特定类型的一个或多个引脚实例。 引脚工厂包含多个数组,这些数组描述此描述符实例化的引脚类型。
微型驱动程序在 KSPIN_DESCRIPTOR 的 Categories 成员中指定了一个或多个此描述符创建的引脚所属的 KS 类别。 KS 使用类别来连接引脚实例,以生成筛选器图。 KSPROPERTY_TOPOLOGY_CATEGORIES属性用于查询驱动程序所支持功能类别的数组。
微型驱动程序提供一个 INF 文件,用于注册一个或多个引脚设备名称。 在安装时,作系统会将名称和相应的类别加载到系统注册表中。 然后,客户端可以使用这些设备名称进行创建文件调用,以实例化引脚。
用户模式客户端使用设备名称调用 Win32 函数 CreateFile 。 例如,“\\.\filters\audio\default renderer”可以是已为默认输出配置的音频设备的链接。 内核模式客户端从内核模式调用 ZwCreateFile 。 创建文件例程返回文件句柄后,KS 客户端通过 KS 属性与引脚实例通信。
在引脚描述符结构中,微型驱动程序布局 KSPIN_INTERFACE 结构和 KSPIN_MEDIUM 结构数组,这些结构指定该引脚工厂支持的 接口 和 介质 。 KSPIN_DESCRIPTOR 也是微型驱动程序指定该工厂创建的引脚的有效数据范围的位置。 它通过提供一个指向KSDATARANGE结构数组的指针来实现此功能。 微型驱动程序还指定此引脚工厂创建的新引脚的数据和通信流方向。
微型驱动程序通过支持 KSPROPSETID_Pin 属性集来在运行时发现引脚工厂。
若要创建引脚连接,请调用 KsCreatePin 例程。 在此调用中,微型驱动程序将指针传递给描述所请求连接 KSPIN_CONNECT 类型的结构。 创建引脚后,筛选器会将新引脚视为与该筛选器的文件对象从属的文件对象。
微型驱动程序使用生成的IRP_MJ_CREATE中提供的描述符结构调用 KsValidateConnectRequest 。 此例程验证这些结构,并返回指向连接结构和根文件对象的指针。
微型驱动程序使用KSPIN_DESCRIPTOR结构的数据流和通信成员来定义以下引脚细节:
IRP 源引脚与 IRP 接收器引脚
IRP 源引脚发出 IRP;IRP 接收器引脚接收它们。 用户模式的客户端通过相关文件句柄直接将 I/O 请求发送到 IRP 接收引脚。 客户端使用 KSPROPERTY_PIN_COMMUNICATION 检查数据是流入还是流出引脚类型。
数据源引脚与数据接收器引脚
数据源引脚是筛选器上的输出引脚;数据接收器引脚是输入引脚。 作为数据源或接收器的属性与作为 IRP 源或接收器的属性无关。 例如,客户端可以将数据源的 IRP 汇聚引脚连接到数据接收器的 IRP 源引脚。 客户端使用 KSPROPERTY_PIN_DATAFLOW 来检查数据是否流入或流出管脚类型。
终止连接时,必须先关闭源端的句柄,然后才能销毁底层文件对象。 如果源引脚依赖于接收器引脚提供的资源,则接收器引脚负责在连接终止时通知源。
客户端通过调用 DeviceIoControl 例程(在 Microsoft Windows SDK 文档中描述)与内核流式处理针脚交互,此例程使用 IRP_MJ_DEVICE_CONTROL 参数。 调用方通过 I/O 控件代码在 I/O 堆栈位置结构中的 Parameters.DeviceIoControl.IoControlCode 中标识其请求。
为了支持请求,微型驱动程序在调用 KsAllocateObjectHeader 时提供指向KSDISPATCH_TABLE结构的指针。
写入请求包含指向 KSSTREAM_HEADER 结构体数组的指针,而这些结构体又各自包含指向流数据的指针。 读取请求包含一个指向由空标头结构组成的数组的指针,读取数据应返回到此处。