Condividi tramite


Registrazione per la notifica del driver sincrona

Per usare la notifica del driver sincrono, un driver di dispositivo implementa una funzione di callback che il sistema operativo chiama quando si aggiunge dinamicamente un nuovo processore alla partizione hardware. L'esempio di codice seguente è un prototipo per una funzione di callback di questo tipo:

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

Un driver di dispositivo esegue la registrazione per la notifica del driver sincrono chiamando la funzione KeRegisterProcessorChangeCallback . Un driver di dispositivo chiama in genere la funzione KeRegisterProcessorChangeCallback dall'interno della relativa funzione DriverEntry . Se il driver di dispositivo specifica il flag di KE_PROCESSOR_CHANGE_ADD_EXISTING, la funzione di callback viene immediatamente chiamata per ogni processore attivo attualmente presente nella partizione hardware, oltre a essere chiamato quando viene aggiunto un nuovo processore alla partizione hardware. L'esempio di codice seguente illustra come eseguire la registrazione per le notifiche del driver sincrone:

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 un driver di dispositivo deve interrompere la ricezione di notifiche del driver sincrone, ad esempio quando viene scaricato, deve annullare la registrazione della funzione di callback chiamando la funzione KeDeregisterProcessorChangeCallback . Un driver di dispositivo chiama in genere la funzione KeDeregisterProcessorChangeCallback dall'interno della funzione Unload . L'esempio di codice seguente illustra come annullare la registrazione della funzione di callback:

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

  // Unregister the callback function
  KeDeregisterProcessorChangeCallback(
    CallbackRegistrationHandle
    );

  ...
}