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


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

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

// Prototype for the synchronous
// notification callback function
VOID
  SyncProcessorCallback(
    IN PVOID CallbackContext,
    IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
    IN PNTSTATUS OperationStatus
    );

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

PVOID CallbackRegistrationHandle;
NTSTATUS CallbackStatus = STATUS_SUCCESS;

// The driver's DriverEntry routine
NTSTATUS  DriverEntry(
    PDRIVER_OBJECT DriverObject,
    PUNICODE_STRING RegistryPath
    )
{
  ...

  // Register the callback function
  CallbackRegistrationHandle =
    KeRegisterProcessorChangeCallback(
      SyncProcessorCallback,
      &CallbackStatus,
      KE_PROCESSOR_CHANGE_ADD_EXISTING
      );

  // Check the result
  if (CallbackRegistrationHandle == NULL)
  {
    // Perform any necessary cleanup
    ...

    // Check the callback status
    if (CallbackStatus != STATUS_SUCCESS)
    {
      // Return the error status from the callback function
      return CallbackStatus;
    }
    else
    {
      // Return a generic error status
      return STATUS_UNSUCCESSFUL;
    }
  }

  ...

  return STATUS_SUCCESS;
}

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

// The driver's Unload routine
VOID
  Unload(
    IN PDRIVER_OBJECT DriverObject
    );
{
  ...

  // Unregister the callback function
  KeDeregisterProcessorChangeCallback(
    CallbackRegistrationHandle
    );

  ...
}