Registrando-se para notificação de driver assíncrono
Para usar a notificação de driver assíncrono, um driver de dispositivo implementa funções de retorno de chamada que o sistema operacional chama quando você adiciona dinamicamente um módulo de processador ou memória à partição de hardware. O exemplo de código a seguir mostra protótipos para essas funções de retorno de chamada:
// Prototypes for the asynchronous
// notification callback functions
NTSTATUS
AsyncProcessorCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
NTSTATUS
AsyncMemoryCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
Um driver de dispositivo registra para notificação assíncrona chamando a função IoRegisterPlugPlayNotification , uma vez para cada uma das funções de retorno de chamada do driver de dispositivo, especificando um ponteiro para um dos seguintes GUIDs para o parâmetro EventCategoryData :
GUID_DEVICE_PROCESSOR
Registre-se para ser notificado quando um processador for adicionado dinamicamente à partição de hardware.
GUID_DEVICE_MEMORY
Registre-se para ser notificado quando a memória for adicionada dinamicamente à partição de hardware.
Esses GUIDs são definidos no arquivo de cabeçalho Poclass.h.
O exemplo de código a seguir mostra como se registrar para ambas as notificações:
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
);
Nota Se um driver de dispositivo precisar ser notificado apenas sobre processadores, ele não precisará implementar uma função de retorno de chamada para memória ou registrar para notificação sobre memória. Da mesma forma, se um driver de dispositivo precisar ser notificado apenas sobre memória, ele não precisará implementar uma função de retorno de chamada para processadores ou registrar-se para notificação sobre processadores.
Quando um driver de dispositivo deve parar de receber notificações de driver assíncronas, como quando está sendo descarregado, ele deve cancelar o registro de cada função de retorno de chamada chamando a função IoUnregisterPlugPlayNotification . O exemplo de código a seguir mostra como cancelar o registro das funções de retorno de chamada:
// Unregister for asynchronous notifications
Status =
IoUnregisterPlugPlayNotification(
ProcessorNotificationEntry
);
Status =
IoUnregisterPlugPlayNotification(
MemoryNotificationEntry
);