Регистрация для асинхронного уведомления драйвера
Чтобы использовать асинхронное уведомление драйвера, драйвер устройства реализует функции обратного вызова, которые операционная система вызывает при динамическом добавлении процессора или модуля памяти в аппаратный раздел. В следующем примере кода показаны прототипы для таких функций обратного вызова:
// Prototypes for the asynchronous
// notification callback functions
NTSTATUS
AsyncProcessorCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
NTSTATUS
AsyncMemoryCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
Драйвер устройства регистрирует асинхронное уведомление, вызывая функцию IoRegisterPlugPlayNotification по одному разу для каждой функции обратного вызова драйвера устройства, указывая указатель на один из следующих GUID для параметра EventCategoryData :
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
);