Partager via


Inscription à la notification de pilote asynchrone

Pour utiliser la notification de pilote asynchrone, un pilote de périphérique implémente des fonctions de rappel que le système d’exploitation appelle lorsque vous ajoutez dynamiquement un processeur ou un module de mémoire à la partition matérielle. L’exemple de code suivant montre des prototypes pour ces fonctions de rappel :

// Prototypes for the asynchronous
// notification callback functions
NTSTATUS
  AsyncProcessorCallback(
    IN PVOID NotificationStructure,
    IN PVOID Context
    );

NTSTATUS
  AsyncMemoryCallback(
    IN PVOID NotificationStructure,
    IN PVOID Context
    );

Un pilote de périphérique s’inscrit pour une notification asynchrone en appelant la fonction IoRegisterPlugPlayNotification , une fois pour chacune des fonctions de rappel du pilote de périphérique, en spécifiant un pointeur vers l’un des GUID suivants pour le paramètre EventCategoryData :

GUID_DEVICE_PROCESSOR
Inscrivez-vous pour être averti lorsqu’un processeur est ajouté dynamiquement à la partition matérielle.

GUID_DEVICE_MEMORY
Inscrivez-vous pour être averti lorsque la mémoire est ajoutée dynamiquement à la partition matérielle.

Ces GUID sont définis dans le fichier d’en-tête Poclass.h.

L’exemple de code suivant montre comment s’inscrire aux deux notifications :

PVOID ProcessorNotificationEntry;
PVOID MemoryNotificationEntry;
NTSTATUS Status;

Status =
  IoRegisterPlugPlayNotification(
    EventCategoryDeviceInterfaceChange,
    0,
    &GUID_DEVICE_PROCESSOR,
    DriverObject,
    AsyncProcessorCallback,
    NULL,
    &ProcessorNotificationEntry
    );

Status =
  IoRegisterPlugPlayNotification(
    EventCategoryDeviceInterfaceChange,
    0,
    &GUID_DEVICE_MEMORY,
    DriverObject,
    AsyncMemoryCallback,
    NULL,
    &MemoryNotificationEntry
    );

Note Si un pilote de périphérique doit uniquement être averti des processeurs, il n’a pas besoin d’implémenter une fonction de rappel pour la mémoire ou de s’inscrire pour recevoir une notification sur la mémoire. De même, si un pilote de périphérique doit uniquement être averti de la mémoire, il n’a pas besoin d’implémenter une fonction de rappel pour les processeurs ou de s’inscrire pour recevoir une notification sur les processeurs.

Lorsqu’un pilote de périphérique doit cesser de recevoir des notifications de pilote asynchrones, par exemple lorsqu’il est déchargé, il doit annuler l’inscription de chaque fonction de rappel en appelant la fonction IoUnregisterPlugPlayNotification . L’exemple de code suivant montre comment annuler l’inscription des fonctions de rappel :

// Unregister for asynchronous notifications
Status =
  IoUnregisterPlugPlayNotification(
    ProcessorNotificationEntry
    );

Status =
  IoUnregisterPlugPlayNotification(
    MemoryNotificationEntry
    );