Registrieren für asynchrone Treiberbenachrichtigungen
Um asynchrone Treiberbenachrichtigungen zu verwenden, implementiert ein Gerätetreiber Rückruffunktionen, die vom Betriebssystem aufgerufen werden, wenn Sie der Hardwarepartition dynamisch ein Prozessor- oder Speichermodul hinzufügen. Das folgende Codebeispiel zeigt Prototypen für solche Rückruffunktionen:
// Prototypes for the asynchronous
// notification callback functions
NTSTATUS
AsyncProcessorCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
NTSTATUS
AsyncMemoryCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
Ein Gerätetreiber registriert sich für asynchrone Benachrichtigungen, indem er die IoRegisterPlugPlayNotification-Funktion aufruft. Dabei wird einmal für jede Rückruffunktion des Gerätetreibers ein Zeiger auf eine der folgenden GUIDs für den EventCategoryData-Parameter angegeben:
GUID_DEVICE_PROCESSOR
Registrieren Sie sich, um benachrichtigt zu werden, wenn der Hardwarepartition dynamisch ein Prozessor hinzugefügt wird.
GUID_DEVICE_MEMORY
Registrieren Sie sich, um benachrichtigt zu werden, wenn der Hardwarepartition dynamisch Arbeitsspeicher hinzugefügt wird.
Diese GUIDs sind in der Headerdatei Poclass.h definiert.
Im folgenden Codebeispiel wird gezeigt, wie Sie sich für beide Benachrichtigungen registrieren:
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
);
Hinweis Wenn ein Gerätetreiber nur über Prozessoren benachrichtigt werden muss, muss er keine Rückruffunktion für den Arbeitsspeicher implementieren oder sich für Benachrichtigungen über den Arbeitsspeicher registrieren. Wenn ein Gerätetreiber nur über den Arbeitsspeicher benachrichtigt werden muss, muss er keine Rückruffunktion für Prozessoren implementieren oder sich für Benachrichtigungen über Prozessoren registrieren.
Wenn ein Gerätetreiber den Empfang asynchroner Treiberbenachrichtigungen beenden muss, z. B. wenn er entladen wird, muss er die Registrierung jeder Rückruffunktion aufheben, indem er die IoUnregisterPlugPlayNotification-Funktion aufruft . Im folgenden Codebeispiel wird gezeigt, wie Sie die Registrierung der Rückruffunktionen aufheben:
// Unregister for asynchronous notifications
Status =
IoUnregisterPlugPlayNotification(
ProcessorNotificationEntry
);
Status =
IoUnregisterPlugPlayNotification(
MemoryNotificationEntry
);