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


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

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

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

  ...
}