2012-12-18 4 views
12

Ich versuche mit den SetupDi-Funktionen den Gerätepfad aller angeschlossenen USB-Geräte aufzulisten. Der Gerätepfad ist der Pfad, der in CreateFile() verwendet wird, damit ich mit dem Gerät kommunizieren kann.Windows - Wie wird der Gerätepfad aller angeschlossenen USB-Geräte aufgelistet?

Allerdings benötigt SetupDiGetDeviceInterface eine Schnittstelle GUID, aber ich bin nicht speziell auf der Suche nach einer bestimmten Schnittstelle (anders als alle angeschlossenen USBs). Dieser Teil wurde als/* ??? */in der Quelle unten.

Versuchte Lösungen:

Ich habe versucht, GUID_DEVCLASS_UNKNOWN = {0x4d36e97e, 0xe325, 0x11ce, {0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18}} zu liefern; aber das warf einen Fehler "keine Schnittstellen mehr".

Ich habe auch versucht, DeviceInfoData.ClassGuid in SetupDiGetDeviceInterface zu liefern, aber ich bekomme den gleichen Fehler wie oben, "keine Schnittstellen mehr".

Fragen:

Gibt es eine allgemeine Schnittstelle Klasse, die alle USB-Geräte abdecken? (HID, generic, etc.)

Oder gibt es eine alternative Funktion, die mir den Weg zum Gerät gibt? (Instlead der SP_DEVICE_INTERFACE_DETAIL_DATA-Struktur, die von SetupDiGetDeviceInterfaceDetail zurückgegeben wird).

Quelle:

HDEVINFO deviceInfoList 
SP_DEVINFO_DATA deviceInfoData; 
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); 
SP_DEVICE_INTERFACE_DATA deviceInterfaceData; 
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData = NULL; 
DWORD requiredLength = 0; 
char *hardwareID = 0; 

// Retrieve a list of all present devices 
deviceInfoList = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES); 

if (deviceInfoList == INVALID_HANDLE_VALUE) { 
    SetupDiDestroyDeviceInfoList(deviceInfoList); 
    return false; 
} 

// Iterate over the list 
for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) { 
    if (deviceInterfaceDetailData) LocalFree(deviceInterfaceDetailData); 

    requiredLength = 0; 

    SetupDiGetDeviceRegistryProperty(deviceInfoList, &deviceInfoData, SPDRP_HARDWAREID, &DataT, NULL, 0, &requiredLength); 

    if (requiredLength <= 0) { 
     SetupDiDestroyDeviceInfoList(deviceInfoList); 
     return false; 
    } 

    hardwareID = new char[requiredLength](); 

    SetupDiGetDeviceRegistryProperty(deviceInfoList, &deviceInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)hardwareID, requiredLength, NULL); 

    // Parse hardwareID for vendor ID and product ID 

    delete hardwareID; 
    hardwareID = 0; 

    deviceInterfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); 

    // Requires an interface GUID, for which I have none to specify 
    if (!SetupDiEnumDeviceInterfaces(deviceInfoList, &deviceInfoData, /* ??? */, 0, &deviceInterfaceData)) { 
     SetupDiDestroyDeviceInfoList(deviceInfoList); 
     return false; 
    } 

    if (!SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInterfaceData, NULL, 0, &requiredLength, NULL)) { 
     if (GetLastError() == ERROR_INSUFFICIENT_BUFFER && requiredLength > 0) { 
      deviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, requiredLength); 

      if (!deviceInterfaceDetailData) { 
       SetupDiDestroyDeviceInfoList(deviceInfoList); 
       return false; 
      } 
     } else { 
      SetupDiDestroyDeviceInfoList(deviceInfoList); 
      return false; 
     } 
    } 

    deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 

    if (!SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInterfaceData, deviceInterfaceDetailData, requiredLength, NULL, &deviceInfoData)) { 
     SetupDiDestroyDeviceInfoList(deviceInfoList); 
     return false; 
    } 

    SetupDiDestroyDeviceInfoList(deviceInfoList); 

    // deviceInterfaceDetailData->DevicePath yields the device path 
} 
+0

Ich habe versucht, den Code in der Antwort gegeben, aber ich bekomme eine 'Bitte wählen Sie eine gültige Zielmaschine für die Bereitstellung von der Projekt-Eigenschaftsseite'. Es baut, aber ich kann es nicht ausführen. Hattest du das gleiche Problem? Ich benutze VS 2015 und WDK 10 unter Windows 7 – lads

Antwort

16

MSDN sagt, dass es eine generische USB-Device-Schnittstelle Klasse GUID_DEVINTERFACE_USB_DEVICE mit der GUID {A5DCBF10-6530-11D2-901F-00C04FB951ED} benannt ist:

Das System bereitgestellte USB-Hub-Treiber registriert Instanzen GUID_DEVINTERFACE_USB_DEVICE zu Informieren Sie das System und die Anwendungen über das Vorhandensein von USB-Geräten, die an einen USB-Hub angeschlossen sind.

Here's a code example das scheint zu tun, was Sie tun möchten, mit dem DEVINTERFACE_USB_DEVICE GUID.

+0

Habe es einfach ausprobiert und es ist genau das, wonach ich gesucht habe! Vielen Dank! – Daniel

+0

Hinweis für zukünftige Leser: Seien Sie sehr vorsichtig, dass Sie ein Gerät ** Schnittstelle ** Klasse GUID und nicht ein Gerät ** Setup ** -Klasse verwenden, sie sind nicht das Gleiche. [Siehe diesen Artikel für weitere Details.] (Https://docs.microsoft.com/en-us/windows-hardware/drivers/install/setup-classes-versus-interface-classes) – jrh

Verwandte Themen