Compartilhar via


Registrando-se para notificação de driver síncrono

Para usar a notificação de driver síncrono, um driver de dispositivo implementa uma função de retorno de chamada que o sistema operacional chama quando você adiciona dinamicamente um novo processador à partição de hardware. O exemplo de código a seguir é um protótipo para essa função de retorno de chamada:

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

Um driver de dispositivo registra para notificação de driver síncrono chamando a função KeRegisterProcessorChangeCallback . Um driver de dispositivo normalmente chama a função KeRegisterProcessorChangeCallback de dentro de sua função DriverEntry . Se o driver do dispositivo especificar o sinalizador KE_PROCESSOR_CHANGE_ADD_EXISTING, a função de retorno de chamada será imediatamente chamada para cada processador ativo que existe atualmente na partição de hardware, além de ser chamada quando um novo processador é adicionado à partição de hardware. O exemplo de código a seguir mostra como se registrar para as notificações de driver síncrono:

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;
}

Quando um driver de dispositivo deve parar de receber notificações de driver síncronas, como quando está sendo descarregado, ele deve cancelar o registro da função de retorno de chamada chamando a função KeDeregisterProcessorChangeCallback . Um driver de dispositivo normalmente chama a função KeDeregisterProcessorChangeCallback de dentro de sua função Unload . O exemplo de código a seguir mostra como cancelar o registro da função de retorno de chamada:

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

  // Unregister the callback function
  KeDeregisterProcessorChangeCallback(
    CallbackRegistrationHandle
    );

  ...
}