2012-12-18 15 views
12

Próbuję użyć funkcji SetupDi do wyliczenia wszystkich ścieżek urządzeń podłączonego urządzenia USB. Ścieżka urządzenia jest ścieżką używaną w CreateFile(), dzięki czemu mogę komunikować się z urządzeniem.Windows - Jak wyliczyć wszystkie ścieżki urządzeń podłączonego urządzenia USB?

Jednak SetupDiGetDeviceInterface wymaga interfejsu GUID interfejsu, ale nie szukam konkretnego interfejsu (innego niż wszystkie podłączone USB). Ta część została skomentowana jako/* ??? */w źródle poniżej.

Próby rozwiązania:

Próbowałem dostarczyć GUID_DEVCLASS_UNKNOWN = {0x4d36e97e, 0xe325, 0x11ce {0xbf, 0xC1, 0x08, 0x00, 0x2b, 0xE1, 0x03, 0x18}}; ale to spowodowało błąd "nie więcej interfejsów".

Próbowałem również dostarczyć deviceInfoData.ClassGuid do SetupDiGetDeviceInterface, ale pojawia się ten sam błąd, jak powyżej, "nie ma więcej interfejsów".

Pytania:

istnieje ogólna klasa interfejs, który obejmie wszystkie urządzenia USB? (HID, ogólne, itp.)

A może jest alternatywna funkcja, która da mi ścieżkę do urządzenia? (Odczyt struktury SP_DEVICE_INTERFACE_DETAIL_DATA zwróconej przez SetupDiGetDeviceInterfaceDetail).

Źródło:

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

Wypróbowałem kod podany w odpowiedzi, ale otrzymałem komunikat "Wybierz prawidłową maszynę docelową do wdrożenia na stronie właściwości projektu". Jest zbudowany, ale nie mogę go uruchomić. Czy masz ten sam problem? Używam VS 2015 i WDK 10 na Windows 7 – lads

Odpowiedz

16

MSDN mówi, że istnieje klasa interfejs urządzenia generic USB o nazwie GUID_DEVINTERFACE_USB_DEVICE z GUID {A5DCBF10-6530-11D2-901F-00C04FB951ED}:

Kierowca hub USB System dostarczony rejestruje przypadki GUID_DEVINTERFACE_USB_DEVICE do powiadom system i aplikacje o obecności urządzeń USB podłączonych do koncentratora USB.

Here's a code example który wydaje się robić to, co chcesz zrobić, używając identyfikatora GUID DEVINTERFACE_USB_DEVICE.

+0

Właśnie wypróbowałem to i właśnie tego szukałem! Dzięki! – Daniel

+0

Uwaga dla przyszłych czytelników: Zachowaj ostrożność, używając interfejsu ** urządzenia ** GUID klasy, a nie urządzenia ** ustawienia ** klasy, to nie to samo. [Zobacz ten artykuł, aby uzyskać więcej informacji.] (Https://docs.microsoft.com/en-us/windows-hardware/drivers/install/setup-classes-versus-interface-classes) – jrh

Powiązane problemy