Compartir a través de


Registro para la notificación del controlador sincrónico

Para usar la notificación de controladores sincrónicos, un controlador de dispositivo implementa una función de devolución de llamada a la que el sistema operativo llama al agregar dinámicamente un nuevo procesador a la partición de hardware. El ejemplo de código siguiente es un prototipo para esta función de devolución de llamada:

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

Un controlador de dispositivo registra la notificación de controlador sincrónica llamando a la función KeRegisterProcessorChangeCallback . Normalmente, un controlador de dispositivo llama a la función KeRegisterProcessorChangeCallback desde su función DriverEntry . Si el controlador de dispositivo especifica la marca KE_PROCESSOR_CHANGE_ADD_EXISTING, se llama inmediatamente a la función de devolución de llamada para cada procesador activo que existe actualmente en la partición de hardware, además de llamarse cuando se agrega un nuevo procesador a la partición de hardware. En el ejemplo de código siguiente se muestra cómo registrarse para las notificaciones de controlador sincrónicas:

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

Cuando un controlador de dispositivo debe dejar de recibir notificaciones de controlador sincrónicas, como cuando se descarga, debe anular el registro de la función de devolución de llamada llamando a la función KeDeregisterProcessorChangeCallback . Normalmente, un controlador de dispositivo llama a la función KeDeregisterProcessorChangeCallback desde su función Unload . En el ejemplo de código siguiente se muestra cómo anular el registro de la función de devolución de llamada:

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

  // Unregister the callback function
  KeDeregisterProcessorChangeCallback(
    CallbackRegistrationHandle
    );

  ...
}