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