筛选特定分配器

需要分配器用于板载内存或其他设备依赖存储方法的筛选器可以通过支持分配器 属性方法来提供特定的分配器。 有关详细信息,请参阅 KSPROPERTY_STREAM_ALLOCATOR

筛选器接收一个IRP_MJ_CREATE请求,其类型是KSCREATE_REQUEST_ALLOCATOR,指定分配器的框架选项。 minidriver 的分配器创建例程通过调用 KsValidateAllocatorCreateRequest 来验证创建请求。 如果调用成功,此例程将返回指向相关 KSALLOCATOR_FRAMING 结构的指针。

如果筛选器无法满足框架要求,则会返回一个故障代码来响应 IRP。 否则,筛选器会将一个指向特定结构的指针附加到文件对象的 FsContext 成员,然后处理从而产生的分配器请求。

如果传递给流式处理接口的缓冲区应由筛选器就地修改,则在相关的 KSALLOCATOR_FRAMING 结构上,用户模式客户端会设置 KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 标志。

分配器有两个接口。 首先,所有分配器必须支持基于 IRP 的KSMETHODSETID_StreamAllocator。 使用此机制的分配器限制为可分配的最大帧数。 分配超出此限制的帧的请求将被标记为挂起。

其次,如果分配池类型能够在 DISPATCH_LEVEL 上进行服务,微型驱动程序可以支持访问功能表。 提供函数表访问权限是可选的。 为此,请支持 KSPROPSETID_StreamAllocator中的属性。

DISPATCH_LEVEL接口按如下所示运行:

将分配请求提交到分配器时,如果有可用的帧,分配器将返回指向帧的指针。 否则,它将立即返回 NULL

向分配器提交免费请求时,分配器会向流分配器发出“免费帧”事件信号,通知客户端可用免费帧。 此外,如果分配请求 IRP 等待完成,则分配器必须计划工作项(如果当前 IRQL 未 PASSIVE_LEVEL),并使用空闲帧完成请求。

DISPATCH_LEVEL接口和基于IRP的接口都有可能争夺空闲帧。 KS 使用取消旋转锁同步此队列。