Inscription à la notification de pilote synchrone
Pour utiliser la notification de pilote synchrone, un pilote de périphérique implémente une fonction de rappel que le système d’exploitation appelle lorsque vous ajoutez dynamiquement un nouveau processeur à la partition matérielle. L’exemple de code suivant est un prototype pour une fonction de rappel de ce type :
// Prototype for the synchronous
// notification callback function
VOID
SyncProcessorCallback(
IN PVOID CallbackContext,
IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
IN PNTSTATUS OperationStatus
);
Un pilote de périphérique s’inscrit pour la notification de pilote synchrone en appelant la fonction KeRegisterProcessorChangeCallback . Un pilote de périphérique appelle généralement la fonction KeRegisterProcessorChangeCallback à partir de sa fonction DriverEntry . Si le pilote de périphérique spécifie l’indicateur KE_PROCESSOR_CHANGE_ADD_EXISTING, la fonction de rappel est immédiatement appelée pour chaque processeur actif qui existe actuellement dans la partition matérielle, en plus d’être appelée lorsqu’un nouveau processeur est ajouté à la partition matérielle. L’exemple de code suivant montre comment s’inscrire aux notifications de pilote synchrones :
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;
}
Lorsqu’un pilote de périphérique doit cesser de recevoir des notifications de pilote synchrones, par exemple lorsqu’il est déchargé, il doit désinscrire la fonction de rappel en appelant la fonction KeDeregisterProcessorChangeCallback . Un pilote de périphérique appelle généralement la fonction KeDeregisterProcessorChangeCallback à partir de sa fonction Unload . L’exemple de code suivant montre comment annuler l’inscription de la fonction de rappel :
// The driver's Unload routine
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
);
{
...
// Unregister the callback function
KeDeregisterProcessorChangeCallback(
CallbackRegistrationHandle
);
...
}