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ür DBT_DEVNODES_CHANGED ("A device has been added to or removed from the system"). Siehe: https://msdn.microsoft.com/library/windows/desktop/aa363480
    Wie du auf DBT_DEVTYP_DEVINST kommst ist mir ein Rätsel. In der Doku zu DBT_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/aa363211

    Und 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).aspx

    Falls es nicht daran liegt, probier's einfach mal mit DEVICE_NOTIFY_ALL_INTERFACE_CLASSES (Flag zusätzliches zu DEVICE_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


Log in to reply