微型驱动程序同步

流媒体微型驱动程序开发人员可以选择允许类驱动程序处理同步。 当微型驱动程序向类驱动程序注册自己时,他们可以通过将 HW_INITIALIZATION_DATATurnOffSynchronization 成员设置为 FALSE 来选择类驱动程序提供的同步。

当类驱动程序处理同步时,它可确保永远不会同时执行两段微型驱动程序代码。 类驱动程序将所有流请求排队,并依次传递给微型驱动程序。

此同步的一个目的是让微型驱动程序开发者不必处理驱动程序同步的所有详细信息,并在多任务、可重入、多处理器环境中处理请求排队。 但是,某些微型驱动程序不应使用它。 同步示例主题中提供了两个示例,这些示例说明了微型驱动程序在同步方面需要执行的作。

关闭流类同步意味着,在 PASSIVE_LEVEL 下,所有请求会在提交线程的上下文中被立即和异步调用到微型驱动程序。 上述规则的例外是 HwCancelPacket、TimeoutHandler 和 Timer 例程。 这些函数在DISPATCH_LEVEL调用。 最后一个例外是中断处理程序,它在 DIRQL 中调用。

同步关闭时,微型驱动程序负责按照 WDM 模型执行同步。 如果在PASSIVE_LEVEL调用微型驱动程序,则可以被任何更高的 IRQL 事件(如 DPC 或中断)抢占。 类似地,如果一个微型驱动程序在DISPATCH_LEVEL被回调,它随后可能会被中断抢占。 操作共享资源的微型驱动程序函数必须同步访问。

当流类同步关闭时,可以同时向相同或不同的流发出多个请求。 微型驱动程序必须对其自己的请求进行排队,并处理与其他线程和 ISR 的任何硬件同步。 旋转锁、互斥体和 KeSynchronizeExecution 是一些同步对象,可用于运行无需流类同步的流微型驱动程序。