使用系统定义的回调对象
系统定义三个回调对象供驱动程序使用:
\Callback\SetSystemTime
\Callback\PowerState
\Callback\ProcessorAdd
例如,使用系统时间的驱动程序 (文件系统驱动程序) 可能会注册 \Callback\SetSystemTime 回调对象。 此回调在系统时间更改时提供通知。
\Callback\PowerState 回调对象在发生以下情况之一时提供通知:
系统从交流电源切换到 DC 电源,反之亦然。
系统电源策略会因用户或应用程序请求而更改。
即将过渡到系统睡眠或关闭状态。 驱动程序可以请求通知,以便它可以在预期关闭时将代码锁定到内存中。 在电源管理器发送系统设置电源 IRP 之前,将通知回调例程。
\Callback\ProcessorAdd 回调在将新处理器添加到系统时提供通知。
若要使用系统定义的回调,驱动程序会通过使用回调的名称调用 InitializeObjectAttributes 来初始化属性块,然后 (ExCreateCallback) 打开回调对象,就像对驱动程序定义的回调一样。 驱动程序不应请求创建回调对象。
使用 ExCreateCallback 返回的句柄,驱动程序调用 ExRegisterCallback 来注册通知例程,传递指向任意上下文的指针和指向其例程的指针。 驱动程序可以随时注册其回调例程。 当指定条件发生时,系统会在 IRQL<=DISPATCH_LEVEL 调用已注册的回调例程。
当驱动程序不再需要通知时,它应调用 ExUnregisterCallback 以从已注册的回调列表中删除其回调例程并删除其对回调对象的引用。