Registering for Synchronous Driver Notification
To use synchronous driver notification, a device driver implements a callback function that the operating system calls when you dynamically add a new processor to the hardware partition. The following code example is a prototype for such a callback function:
// Prototype for the synchronous
// notification callback function
VOID
SyncProcessorCallback(
IN PVOID CallbackContext,
IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
IN PNTSTATUS OperationStatus
);
A device driver registers for synchronous driver notification by calling the KeRegisterProcessorChangeCallback function. A device driver typically calls the KeRegisterProcessorChangeCallback function from within its DriverEntry function. If the device driver specifies the KE_PROCESSOR_CHANGE_ADD_EXISTING flag, the callback function is immediately called for each active processor that currently exists in the hardware partition, in addition to being called when a new processor is added to the hardware partition. The following code example shows how to register for the synchronous driver notifications:
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;
}
When a device driver must stop receiving synchronous driver notifications, such as when it is being unloaded, it must unregister the callback function by calling the KeDeregisterProcessorChangeCallback function. A device driver typically calls the KeDeregisterProcessorChangeCallback function from within its Unload function. The following code example shows how to unregister the callback function:
// The driver's Unload routine
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
);
{
...
// Unregister the callback function
KeDeregisterProcessorChangeCallback(
CallbackRegistrationHandle
);
...
}