Freigeben über


Registrieren für die Benachrichtigung über den Empfang der Geräteschnittstelle und das Entfernen von Geräten

In diesem Thema wird beschrieben, wie sich Anwendungen oder Treiber im Benutzermodus registrieren, um Benachrichtigungen über den Empfang von Geräteschnittstellen und das Entfernen von Geräten zu erhalten.

Wenn Sie dieses Verfahren für einen UMDF 2-Treiber durchführen, finden Sie unter Verwenden von Geräteschnittstellen ein Codebeispiel.

In der Regel ruft eine Benutzermoduskomponente CM_Register_Notification auf, um eine Geräteschnittstelle zu finden. Anschließend sendet sie E/A-Anforderungen an die Schnittstelle. Dazu registriert sich die Komponente sowohl für CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE als auch für CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE, um Benachrichtigungen über den Empfang von Geräteschnittstellen und das Entfernen von Geräten zu erhalten. Die Aufrufsequenz könnte wie folgt aussehen.

Registrieren für die Benachrichtigung über den Empfang der Geräteschnittstelle und das Entfernen von Geräten

  1. Rufen Sie zur Registrierung für Benachrichtigungen zum Empfang von Geräteschnittstellen CM_Register_Notification mit CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE auf. Wenn künftig Schnittstellen in der angegebenen Klasse eingehen, benachrichtigt das System die Komponente.

  2. Da die Schnittstelle, an die Sie E/A senden möchten, möglicherweise bereits im System vorhanden ist, rufen Sie CM_Get_Device_Interface_List oder SetupDiGetClassDevs auf, um eine Liste vorhandener Schnittstellen abzurufen. Hinweis: Wenn eine Schnittstelle zwischen Schritt 1 und Schritt 2 eintrifft, wird sie zweimal aufgeführt, von der Registrierung in Schritt 1 und in der Schnittstellenliste in Schritt 2.

  3. Nachdem Sie die gewünschte Schnittstelle gefunden haben, rufen Sie CreateFile auf, um ein Handle für das Gerät zu öffnen.

  4. Nachdem in Schritt 3 ein Gerätehandle erstellt wurde, rufen Sie CM_Register_Notification ein zweites Mal auf. Dieses Mal führen Sie die Registrierung für Benachrichtigungen vom Typ CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE aus. Hierbei geben Sie das neue Gerätehandle an, für das Benachrichtigungen empfangen werden sollen. Wenn das durch die Schnittstelle dargestellte Gerät eine Anforderung für eine Entfernen-Abfrage empfängt, benachrichtigt das System die Komponente.

  5. Verwenden Sie beim Implementieren des Gerätehandle-Benachrichtigungsrückrufs die folgende Tabelle.

Vom Rückruf empfangener Aktionswert Empfohlene Reaktion der Komponente
CM_NOTIFY_ACTION_DEVICEQUERYREMOVE Rufen Sie CloseHandle auf, um das Gerätehandle zu schließen. Wenn Sie dies nicht tun, verhindert das geöffnete Handle, dass die Entfernen-Abfrage für dieses Geräts erfolgreich ausgeführt wird.
CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED Bei der Entfernen-Abfrage ist ein Fehler aufgetreten, sodass das Gerät und seine Schnittstelle noch vorhanden sind. Öffnen Sie ein neues Handle, um das Senden von E/A an die Schnittstelle fortzusetzen. Die Benachrichtigungsregistrierung auf dem Gerät über den ursprünglichen Handle bleibt gültig, obwohl dieses Handle geschlossen wurde, sodass die Registrierung der Benachrichtigung nicht aufgehoben und eine neue Registrierung unter dem neuen Handle für die Geräteschnittstelle erstellt werden muss.

Wenn Sie die Registrierung für Benachrichtigungen auf einem Gerät durchführen, für das gerade eine Entfernen-Abfrage nach dem Senden von CM_NOTIFY_ACTION_DEVICEQUERYREMOVE-Benachrichtigungen erfolgt, erhalten Sie möglicherweise eine CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED-Benachrichtigung ohne vorherige CM_NOTIFY_ACTION_DEVICEQUERYREMOVE-Benachrichtigung.
CM_NOTIFY_ACTION_DEVICEREMOVEPENDING Rufen Sie CM_Unregister_Notification auf, um die Registrierung der Benachrichtigungen für Ihr Handle aufzuheben. Das muss aus einer verzögerten Routine heraus erfolgen. Weitere Informationen finden Sie im Abschnitt Hinweise unter CM_Unregister_Notification. Wenn noch immer ein Handle für das Gerät geöffnet ist, rufen Sie CloseHandle auf, um das Gerätehandle zu schließen.
CM_NOTIFY_ACTION_DEVICEREMOVECOMPLETE Rufen Sie CM_Unregister_Notification auf, um die Registrierung der Benachrichtigungen für Ihr Handle aufzuheben. Das muss aus einer verzögerten Routine heraus erfolgen. Weitere Informationen finden Sie im Abschnitt Hinweise unter CM_Unregister_Notification. Wenn noch immer ein Handle für das Gerät geöffnet ist, rufen Sie CloseHandle auf, um das Gerätehandle zu schließen.
  1. Nachdem Sie mit dem Gerät fertig sind, rufen Sie CM_Unregister_Notification auf, um die in Schritt 1 vorgenommene Registrierung des Benachrichtigungsrückrufs für die Schnittstellen aufzuheben.

Ein UMDF 2-Treiber kann die Schritte 1 bis 4 in der EvtDevicePrepareHardware-Rückrufroutine des Treibers und Schritt 6 in einer der Rückrufroutinen zum Entfernen von Geräten des Treibers ausführen.

CM_Register_Notification

CM_Unregister_Notification

Verwenden von Geräteschnittstellen