Поделиться через


Регистрация для асинхронного уведомления драйвера

Чтобы использовать асинхронное уведомление драйвера, драйвер устройства реализует функции обратного вызова, которые операционная система вызывает при динамическом добавлении процессора или модуля памяти в аппаратный раздел. В следующем примере кода показаны прототипы для таких функций обратного вызова:

// 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
    );