Registrieren für synchrone Treiberbenachrichtigungen
Um synchrone Treiberbenachrichtigungen zu verwenden, implementiert ein Gerätetreiber eine Rückruffunktion, die das Betriebssystem aufruft, wenn Sie der Hardwarepartition dynamisch einen neuen Prozessor hinzufügen. Das folgende Codebeispiel ist ein Prototyp für eine solche Rückruffunktion:
// Prototype for the synchronous
// notification callback function
VOID
SyncProcessorCallback(
IN PVOID CallbackContext,
IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
IN PNTSTATUS OperationStatus
);
Ein Gerätetreiber registriert sich für synchrone Treiberbenachrichtigungen, indem die KeRegisterProcessorChangeCallback-Funktion aufgerufen wird. Ein Gerätetreiber ruft in der Regel die KeRegisterProcessorChangeCallback-Funktion aus seiner DriverEntry-Funktion auf. Wenn der Gerätetreiber das flag KE_PROCESSOR_CHANGE_ADD_EXISTING angibt, wird die Rückruffunktion sofort für jeden aktiven Prozessor aufgerufen, der derzeit in der Hardwarepartition vorhanden ist, und wird nicht nur aufgerufen, wenn der Hardwarepartition ein neuer Prozessor hinzugefügt wird. Im folgenden Codebeispiel wird gezeigt, wie Sie sich für die synchronen Treiberbenachrichtigungen registrieren:
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;
}
Wenn ein Gerätetreiber den Empfang synchroner Treiberbenachrichtigungen beenden muss, z. B. beim Entladen, muss er die Registrierung der Rückruffunktion aufheben, indem er die KeDeregisterProcessorChangeCallback-Funktion aufruft . Ein Gerätetreiber ruft in der Regel die KeDeregisterProcessorChangeCallback-Funktion aus seiner Unload-Funktion auf. Im folgenden Codebeispiel wird gezeigt, wie Sie die Registrierung der Rückruffunktion aufheben:
// The driver's Unload routine
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
);
{
...
// Unregister the callback function
KeDeregisterProcessorChangeCallback(
CallbackRegistrationHandle
);
...
}