流指针和 IRP 取消
如果帧具有引用它的锁定流指针,则无法取消与此帧对应的 IRP。 请参阅 锁定和解锁流指针。
下表列出了微型驱动程序可用于支持 IRP 取消的技术。 取消策略应基于微型驱动程序的流访问要求,如最左侧的列中所述。
如果需要。。 | 操作 | 注释 |
---|---|---|
在单个接入点对流式传输数据的简要访问 |
调用将 State 参数设置为 KSSTREAM_POINTER_STATE_LOCKED 的 KsPinGetLeadingEdgeStreamPointer。 然后,在处理完成后立即调用 KsStreamPointerUnlock 或 KsStreamPointerAdvanceOffsetsAndUnlock 。 |
提供对取消的快速响应,除非线程在获取指针和解锁指针之间阻止。 |
访问时间无限长,但可以在取消回调的上下文中放弃声明 |
调用 KsStreamPointerClone 克隆锁定的流指针 (通常是前缘) 、解锁它并响应 CancelCallback。 回调在保持队列的旋转锁的情况下发生,因此在DISPATCH_LEVEL。 因此,供应商提供的 CancelCallback 例程无法执行队列操作或调用获取互斥体的函数。 相反,在回调例程中,微型驱动程序验证以后不会访问关联的数据,然后调用 KsStreamPointerDelete。 |
可能更难实现,但通常会在高效访问和快速响应取消之间实现最佳平衡。 |
定期访问帧,并且可以容忍两次访问之间帧的消失 |
维护未锁定的克隆,并调用 KsStreamPointerLock 以在访问时锁定它。 如果取消帧,则下一次尝试锁定流指针会失败,微型驱动程序可以调用 KsStreamPointerDelete。 |
与第一个选项一样,对取消的响应是流指针锁定时间的函数。 |
访问时间无限长,无法放弃声明以响应回调 |
在任何时间长度内保留锁定的克隆流指针,以防止取消。 若要创建克隆流指针,请调用 KsStreamPointerClone。 然后调用 KsStreamPointerLock 和 KsStreamPointerUnlock 以锁定或解锁克隆。 |
对取消的响应可能很差。 请考虑通过此方法使用 流指针超时 。 |
如果帧具有引用它的流指针,微型驱动程序可以调用 KsStreamPointerGetIrp 来访问与此帧对应的 IRP。 若要检索与帧关联的 MDL) (内存描述符列表,请调用 KsStreamPointerGetMdl。