OnDeviceChange liefert nicht
-
Hallo,
ich habe einen Treiber für ein eigens Gerät, und alles ist wunderbar.
Ein MFC-Anwenderfenster hat für dieses Gerät eine DeviceChange Notification vereinbart (RegisterMessage)
//USB DEVICE CHANGE m_pDevIF = (DEV_BROADCAST_DEVICEINTERFACE *)malloc(sizeof(DEV_BROADCAST_DEVICEINTERFACE)); memset(m_pDevIF, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE)); m_pDevIF->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); m_pDevIF->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; m_pDevIF->dbcc_classguid = guid; m_hNotifyDev = RegisterDeviceNotification(this->m_hWnd, m_pDevIF, DEVICE_NOTIFY_WINDOW_HANDLE);
Hier kommt nun auch das Event an, wenn das Gerät ein oder aus gesteckt wird.
Leider ist der übertragende Parameter nEventType an die Methode:
OnDeviceChange(UINT nEventType, DWORD dwData)Immer nur: DBT_DEVTYP_DEVINST (0x000007)
Erwartet wird für ein und ausstecken ein jeweils anderer Code.
Was ist schief gelaufen, muss mein DeviceDescriptor in der Hardware noch
was explizites ansagen ?Danke für Hinweise
Karsten
-
Wie man aus der Doku leicht entnehmen kann steht 7 an der Stelle nicht für
DBT_DEVTYP_DEVINST
sondern fürDBT_DEVNODES_CHANGED
("A device has been added to or removed from the system"). Siehe: https://msdn.microsoft.com/library/windows/desktop/aa363480
Wie du aufDBT_DEVTYP_DEVINST
kommst ist mir ein Rätsel. In der Doku zuDBT_DEVNODES_CHANGED
steht dann auch dass eine Message mit diesem Code keine weiteren Informationen beinhaltet - weder darüber ob das Gerät neu angekommen ist oder entfernt wurde, noch darüber um was für ein Gerät es sich denn überhaupt handelt. Siehe: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363211Und diese Notification (
DBT_DEVNODES_CHANGED
) wird soweit ich weiss auch immer an alle Top-Level Windows geschickt. Man muss sich dafür nicht registrieren. Könnte es sein dass vielleicht deine Class-GUID nicht stimmt? Da muss die Device Interface Class rein, nicht die Device (Setup) Class.
Device Interface Classes:
https://msdn.microsoft.com/en-us/library/windows/hardware/ff553412(v=vs.85).aspx
Device Setup Classes:
https://msdn.microsoft.com/en-us/library/windows/hardware/ff553426(v=vs.85).aspxFalls es nicht daran liegt, probier's einfach mal mit
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES
(Flag zusätzliches zuDEVICE_NOTIFY_WINDOW_HANDLE
). Dann wird laut Doku die Interface Class GUID ignoriert und du solltest Notifications für alle Geräte bekommen. Dann weisst du zumindest schonmal ob's an der Class GUID liegt oder nicht.ps: Ich bin mir grad nicht sicher ob ein Gerät (Treiber) überhaupt ein Device Interface anmelden muss. Schliesslich kann man über DeviceIoControl beliebige Codes an beliebige Treiber schicken. Und so lange Anwendung und Treiber wissen was damit gemeint ist, wäre es nicht notwendig dass ein Treiber überhaupt irgend ein Device Interface anmeldet. Und falls dein Treiber keines anmeldet, wäre auch gut möglich dass du trotz
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES
keine Notification bekommst.
-
Und wenn es der Treiber dann auch noch versäumt, IoRegisterDeviceInterface aufzurufen, wird das in dieser Form sowieso nichts. Usbser.sys war so ein Kandidat, so ich das richtig erinnere...
-
Hi,
ja mit dem Flag DEVICE_NOTIFY_ALL_INTERFACE_CLASSES kommen
mehr Informationen, aber nur wenn der Treiber bereits bekannt war.Sonnst erfolgen einige DBT_DEVTYP_DEVINST (0x000007) die nicht
auf das ein / ausstecken hinweisen sondern nur das ein oder aus gesteckt worden ist.Heißt über WinUSB kann ich ein Gerät nur dann erfolgreich installieren,
wenn es eingesteckt ist. Nur dann lässt sich zb. über devcon.exe update ....
Das Gerät verzeichnen.Ein devcon.exe install funktioniert zwar, lässt das Gerät
beim einstecken dann aber als fehlerhaft erscheinen.Aber kein Problem, wenn ein registered Gerät MSG:ARRIVED vorliegt wird ein re-update und ein reopen versucht, und so geht das dann auch ohne Zusatz Infos.
Danke für die Hinweise
Karsten