Verwenden einer benutzerdefinierten PnP-Benachrichtigung
Ein Treiber kann den Änderungsbenachrichtigungsmechanismus des Zielgeräts verwenden, um über benutzerdefinierte Ereignisse auf einem Gerät benachrichtigt zu werden.
Der Programmierer, der das benutzerdefinierte Ereignis definiert, muss folgendes tun:
Definieren Sie eine neue GUID für das benutzerdefinierte Ereignis.
Generieren Sie die GUID mit Uuidgen oder Guidgen (die im Microsoft Windows SDK enthalten sind). Veröffentlichen Sie die GUID in einer entsprechenden Headerdatei und Dokumentation.
Schreiben Sie Code, um das benutzerdefinierte Ereignis auszulösen.
Im Kernelmodus ruft ein Treiber IoReportTargetDeviceChange mit der benutzerdefinierten GUID und einem Zeiger auf die PDO für das Gerät auf. Benutzerdefinierte Ereignisse können nur im Kernelmodus ausgelöst werden.
Ein Treiberschreiber verwendet benutzerdefinierte Benachrichtigungen mit einer Prozedur wie der folgenden:
Der Treiber (oder die Anwendung) registriert sich für die Benachrichtigung über das benutzerdefinierte Ereignis.
Im Kernelmodus ruft ein Treiber IoRegisterPlugPlayNotification auf und registriert sich für eine EventCategoryTargetDeviceChange auf dem Gerät.
Im Benutzermodus registriert sich eine Anwendung mithilfe von RegisterDeviceNotification. Weitere Informationen finden Sie im Windows SDK.
Eine Kernelmoduskomponente löst das benutzerdefinierte Ereignis aus.
Der PnP-Manager ruft Benachrichtigungsroutinen auf, die auf dem Gerät registriert sind.
Der PnP-Manager ruft die registrierten Rückrufroutinen im Benutzermodus auf und ruft dann die Kernelmodus-Rückrufroutinen auf.
Wenn die Benachrichtigung im Benutzermodus abgeschlossen ist, reagieren die Rückrufroutine des Kernelmodustreibers auf das benutzerdefinierte Ereignis.
Allgemeine Richtlinien für Benachrichtigungsrückrufroutinen finden Sie unter Richtlinien zum Schreiben von PnP-Benachrichtigungsrückrufroutinen . Zusätzlich zu diesen Richtlinien darf eine benutzerdefinierte Benachrichtigungsrückrufroutine kein Handle für ein Gerät innerhalb des Rückrufroutinethreads öffnen.