Registro para notificaciones de controladores asincrónicos
Para usar la notificación de controlador asincrónica, un controlador de dispositivo implementa funciones de devolución de llamada a las que llama el sistema operativo al agregar dinámicamente un módulo de procesador o memoria a la partición de hardware. En el ejemplo de código siguiente se muestran prototipos para estas funciones de devolución de llamada:
// Prototypes for the asynchronous
// notification callback functions
NTSTATUS
AsyncProcessorCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
NTSTATUS
AsyncMemoryCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
Un controlador de dispositivo se registra para recibir notificaciones asincrónicas mediante una llamada a la función IoRegisterPlugPlayNotification , una vez para cada una de las funciones de devolución de llamada del controlador de dispositivo, especificando un puntero a uno de los siguientes GUID para el parámetro EventCategoryData :
GUID_DEVICE_PROCESSOR
Regístrese para recibir una notificación cuando un procesador se agregue dinámicamente a la partición de hardware.
GUID_DEVICE_MEMORY
Regístrese para recibir notificaciones cuando la memoria se agregue dinámicamente a la partición de hardware.
Estos GUID se definen en el archivo de encabezado, Poclass.h.
En el ejemplo de código siguiente se muestra cómo registrarse para ambas notificaciones:
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 Si un controlador de dispositivo solo tiene que recibir notificaciones sobre los procesadores, no tiene que implementar una función de devolución de llamada para la memoria ni registrarse para recibir notificaciones sobre la memoria. De forma similar, si un controlador de dispositivo solo tiene que recibir notificaciones sobre la memoria, no tiene que implementar una función de devolución de llamada para procesadores o registrarse para recibir notificaciones sobre los procesadores.
Cuando un controlador de dispositivo debe dejar de recibir notificaciones de controlador asincrónicas, como cuando se descarga, debe anular el registro de cada función de devolución de llamada mediante una llamada a la función IoUnregisterPlugPlayNotification . En el ejemplo de código siguiente se muestra cómo anular el registro de las funciones de devolución de llamada:
// Unregister for asynchronous notifications
Status =
IoUnregisterPlugPlayNotification(
ProcessorNotificationEntry
);
Status =
IoUnregisterPlugPlayNotification(
MemoryNotificationEntry
);