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