定义回调对象

驱动程序可以创建回调对象,其他驱动程序可以通过该对象请求创建驱动程序定义的条件的通知。 下图显示了定义回调对象所涉及的步骤。

说明定义回调对象的示意图。

在创建对象之前,驱动程序会调用 InitializeObjectAttributes 来设置其属性。 回调对象必须具有一个名称,该名称与系统定义的回调的名称不匹配;它可以具有其创建者认为适当的任何其他属性,通常OBJ_CASE_INSENSITIVE。 接下来,驱动程序调用 ExCreateCallback,传递指向初始化属性的指针以及接收回调对象的句柄的位置。 它还传递两个布尔值,指示系统是否应创建回调对象(如果此类命名对象尚不存在),以及该对象是否应允许多个已注册的回调例程。

驱动程序定义调用已注册回调例程的条件。 条件采用两个参数的形式,每个参数指向由创建回调的驱动程序定义的参数。 对于驱动程序的客户端,应记录这些条件,以及回调对象的名称及其请求通知的 IRQL。

出现回调条件时,驱动程序调用 ExNotifyCallback,将其句柄传递给回调对象和两个参数。 然后,系统按照注册顺序调用为回调对象注册的所有回调例程,传递两个参数和一个指向注册例程时提供的上下文的指针。 驱动程序必须在 IRQL <= DISPATCH_LEVEL 处调用 ExNotifyCallback;系统会在驱动程序进行此调用的同一 IRQL 调用回调例程。

使用回调对象完成所有操作后,创建回调的驱动程序应调用 ObDereferenceObject 来减少其引用计数并确保删除该对象。