特定于筛选器的分配器
需要分配器用于板载内存或其他设备相关存储方法的筛选器可以通过支持分配器 属性 和 方法来提供特定的分配器。 有关详细信息,请参阅 KSPROPERTY_STREAM_ALLOCATOR。
筛选器接收类型KSCREATE_REQUEST_ALLOCATOR指定分配器的帧选项的IRP_MJ_CREATE。 微型驱动程序的分配器创建例程通过调用 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 使用取消旋转锁同步此队列。