流指针和 IRP 取消

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

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

如果需要。。 操作 注释

对单个访问点中的数据流数据的简要访问

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

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

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

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

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

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

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

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

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

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

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

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