注册异步驱动程序通知

若要使用异步驱动程序通知,设备驱动程序将实现操作系统在向硬件分区动态添加处理器或内存模块时调用的回调函数。 下面的代码示例演示此类回调函数的原型:

// Prototypes for the asynchronous
// notification callback functions
NTSTATUS
  AsyncProcessorCallback(
    IN PVOID NotificationStructure,
    IN PVOID Context
    );

NTSTATUS
  AsyncMemoryCallback(
    IN PVOID NotificationStructure,
    IN PVOID Context
    );

设备驱动程序通过调用 IoRegisterPlugPlayNotification 函数注册异步通知,为每个设备驱动程序的回调函数调用一次,为 EventCategoryData 参数指定指向以下 GUID 之一的指针:

GUID_DEVICE_PROCESSOR
注册以在将处理器动态添加到硬件分区时收到通知。

GUID_DEVICE_MEMORY
注册以在将内存动态添加到硬件分区时收到通知。

这些 GUID 在头文件 Poclass.h 中定义。

下面的代码示例演示如何注册这两个通知:

PVOID ProcessorNotificationEntry;
PVOID MemoryNotificationEntry;
NTSTATUS Status;

Status =
  IoRegisterPlugPlayNotification(
    EventCategoryDeviceInterfaceChange,
    0,
    &GUID_DEVICE_PROCESSOR,
    DriverObject,
    AsyncProcessorCallback,
    NULL,
    &ProcessorNotificationEntry
    );

Status =
  IoRegisterPlugPlayNotification(
    EventCategoryDeviceInterfaceChange,
    0,
    &GUID_DEVICE_MEMORY,
    DriverObject,
    AsyncMemoryCallback,
    NULL,
    &MemoryNotificationEntry
    );

注意 如果设备驱动程序只需要收到有关处理器的通知,则它不必实现内存回调函数,也不必注册内存通知。 同样,如果设备驱动程序只需要收到有关内存的通知,则它不必为处理器实现回调函数,也不必注册有关处理器的通知。

当设备驱动程序必须停止接收异步驱动程序通知(例如卸载时),它必须通过调用 IoUnregisterPlugPlayNotification 函数取消注册每个回调函数。 下面的代码示例演示如何取消注册回调函数:

// Unregister for asynchronous notifications
Status =
  IoUnregisterPlugPlayNotification(
    ProcessorNotificationEntry
    );

Status =
  IoUnregisterPlugPlayNotification(
    MemoryNotificationEntry
    );