流指针和 IRP 取消

如果帧具有引用它的锁定流指针,则无法取消与此帧对应的 IRP。 请参阅 锁定和解锁流指针

下表列出了微型驱动程序可用于支持 IRP 取消的技术。 取消策略应基于微型驱动程序的流访问要求,如最左侧的列中所述。

如果需要。。 操作 注释

在单个接入点对流式传输数据的简要访问

调用将 State 参数设置为 KSSTREAM_POINTER_STATE_LOCKED 的 KsPinGetLeadingEdgeStreamPointer。 然后,在处理完成后立即调用 KsStreamPointerUnlockKsStreamPointerAdvanceOffsetsAndUnlock

提供对取消的快速响应,除非线程在获取指针和解锁指针之间阻止。

访问时间无限长,但可以在取消回调的上下文中放弃声明

调用 KsStreamPointerClone 克隆锁定的流指针 (通常是前缘) 、解锁它并响应 CancelCallback。 回调在保持队列的旋转锁的情况下发生,因此在DISPATCH_LEVEL。 因此,供应商提供的 CancelCallback 例程无法执行队列操作或调用获取互斥体的函数。 相反,在回调例程中,微型驱动程序验证以后不会访问关联的数据,然后调用 KsStreamPointerDelete

可能更难实现,但通常会在高效访问和快速响应取消之间实现最佳平衡。

定期访问帧,并且可以容忍两次访问之间帧的消失

维护未锁定的克隆,并调用 KsStreamPointerLock 以在访问时锁定它。 如果取消帧,则下一次尝试锁定流指针会失败,微型驱动程序可以调用 KsStreamPointerDelete

与第一个选项一样,对取消的响应是流指针锁定时间的函数。

访问时间无限长,无法放弃声明以响应回调

在任何时间长度内保留锁定的克隆流指针,以防止取消。 若要创建克隆流指针,请调用 KsStreamPointerClone。 然后调用 KsStreamPointerLockKsStreamPointerUnlock 以锁定或解锁克隆。

对取消的响应可能很差。 请考虑通过此方法使用 流指针超时

如果帧具有引用它的流指针,微型驱动程序可以调用 KsStreamPointerGetIrp 来访问与此帧对应的 IRP。 若要检索与帧关联的 MDL) (内存描述符列表,请调用 KsStreamPointerGetMdl