2017-09-08 2 views
0

Ich frage mich, ob es möglich ist, den USB-Gerätedeskriptor mit den SetupAPI-Funktionen (wie SetupDiGetDeviceRegistryProperty) zu bekommen? Vielen Dank!Windows SetupAPI verwenden, um USB-Gerätedeskriptor zu erhalten

EDIT

Bisher bin ich nur in der Lage, die Fenster freundlich Namen zu erhalten:

SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, 
      &dwPropertyRegDataType, (BYTE*)szDesc, sizeof(szDesc), &dwSize) 
+0

, was Sie in der Eingabe haben? – RbMm

+0

@RbMm Ich erhalte den Namen des Treibers und nicht den USB-Gerätedeskriptor unter Verwendung des obigen Codes. – tzippy

+0

Ich frage - welche Daten Sie am Anfang haben. – RbMm

Antwort

0

brauchen wir haben/bekommen Zeichenfolge, die Device Instance ID eines Gerätes. damit erhält man zunächst eine Geräteinstanz an den Geräteknoten über CM_Locate_DevNode handhaben und dann ruft CM_Get_DevNode_Property mit DEVPKEY_NAME:

Der abgerufene Eigenschaftswert gleich den Wert der DEVPKEY_Device_FriendlyName Vorrichtungs-Eigenschaft ist, wenn DEVPKEY_Device_FriendlyName ist festgelegt. Andernfalls entspricht der Wert DEVPKEY_NAME dem Wert der Geräteeigenschaft DEVPKEY_Device_DeviceDesc .

static volatile UCHAR guz; 

CONFIGRET PrintFriendlyNameByDeviceID(PWSTR DeviceID) 
{ 
    DEVINST dnDevInst; 

    CONFIGRET status = CM_Locate_DevNodeW(&dnDevInst, DeviceID, CM_LOCATE_DEVNODE_NORMAL); 

    if (status == CR_SUCCESS) 
    { 
     ULONG cb = 0, rcb = 16; 

     PVOID stack = alloca(guz); 

     DEVPROPTYPE PropertyType; 

     union { 
      PVOID pv; 
      PWSTR sz; 
      PBYTE pb; 
     }; 

     do 
     { 
      if (cb < rcb) 
      { 
       rcb = cb = RtlPointerToOffset(pv = alloca(rcb - cb), stack); 
      } 

      status = CM_Get_DevNode_PropertyW(dnDevInst, &DEVPKEY_NAME, &PropertyType, pb, &rcb, 0); 

      if (status == CR_SUCCESS) 
      { 
       if (PropertyType == DEVPROP_TYPE_STRING) 
       { 
        DbgPrint("NAME = %S\n", sz); 
       } 
       else 
       { 
        status = CR_WRONG_TYPE; 
       } 
      } 

     } while (status == CR_BUFFER_SMALL); 
    } 

    return status; 
} 

wenn wir die Zeichenfolge, die die Geräteschnittstelleninstanz identifiziert - wir können die Geräteinstanz Kennung aus es über Call CM_Get_Device_Interface_Property mit DEVPKEY_Device_InstanceId Schlüssel zu erhalten, und rufen dann PrintFriendlyNameByDeviceID

CONFIGRET PrintFriendlyNameByInterface(PCWSTR pszDeviceInterface) 
{ 
    ULONG cb = 0, rcb = 64; 

    PVOID stack = alloca(guz); 
    DEVPROPTYPE PropertyType; 

    CONFIGRET status; 

    union { 
     PVOID pv; 
     PWSTR DeviceID; 
     PBYTE pb; 
    }; 

    do 
    { 
     if (cb < rcb) 
     { 
      rcb = cb = RtlPointerToOffset(pv = alloca(rcb - cb), stack); 
     } 

     status = CM_Get_Device_Interface_PropertyW(pszDeviceInterface, &DEVPKEY_Device_InstanceId, &PropertyType, pb, &rcb, 0); 

     if (status == CR_SUCCESS) 
     { 
      if (PropertyType == DEVPROP_TYPE_STRING) 
      { 
       DbgPrint("DeviceID = %S\n", DeviceID); 

       status = PrintFriendlyNameByDeviceID(DeviceID); 
      } 
      else 
      { 
       status = CR_WRONG_TYPE; 
      } 

      break; 
     } 

    } while (status == CR_BUFFER_SMALL); 

    return status; 
} 

und beginnen, Wir haben 2 Wahl: von nur ruft eine Liste der Geräteinstanz-IDs über Anruf CM_Get_Device_ID_List mit CM_GETIDLIST_FILTER_CLASS|CM_GETIDLIST_FILTER_PRESENT und verwenden Sie "{36fc9e60-c465-11cf-8056-444553540000}" als Filter - das ist String Darstellung der bekannten GUID_DEVCLASS_USB in devguid.h definiert:

void PrintFriendlyNames(PCWSTR pszFilter) 
{ 
    CONFIGRET status; 
    ULONG len = 0, cb = 0, rcb; 
    PVOID stack = alloca(guz); 
    PWSTR buf = 0; 

    do 
    { 
     if (status = CM_Get_Device_ID_List_SizeW(&len, pszFilter, CM_GETIDLIST_FILTER_CLASS|CM_GETIDLIST_FILTER_PRESENT)) 
     { 
      break; 
     } 

     if (cb < (rcb = len * sizeof(WCHAR))) 
     { 
      len = (cb = RtlPointerToOffset(buf = (PWSTR)alloca(rcb - cb), stack))/sizeof(WCHAR); 
     } 

     status = CM_Get_Device_ID_ListW(pszFilter, buf, len, CM_GETIDLIST_FILTER_CLASS|CM_GETIDLIST_FILTER_PRESENT); 

     if (status == CR_SUCCESS) 
     { 
      while (*buf) 
      { 
       DbgPrint("DeviceID = %S\n", buf); 

       PrintFriendlyNameByDeviceID(buf); 

       buf += 1 + wcslen(buf); 
      } 
     } 

    } while (status == CR_BUFFER_SMALL); 
} 
PrintFriendlyNames(L"{36fc9e60-c465-11cf-8056-444553540000}"); 

oder Geräteschnittstellen über CM_Get_Device_Interface_List aufzuzählen und PrintFriendlyNameByInterface für jede Geräteschnittstelle aufrufen.

void PrintFriendlyNames(PGUID InterfaceClassGuid) 
{ 
    CONFIGRET status; 
    ULONG len = 0, cb = 0, rcb; 
    PVOID stack = alloca(guz); 
    PWSTR buf = 0; 

    do 
    { 
     if (status = CM_Get_Device_Interface_List_SizeW(&len, InterfaceClassGuid, 0, CM_GET_DEVICE_INTERFACE_LIST_PRESENT)) 
     { 
      break; 
     } 

     if (cb < (rcb = len * sizeof(WCHAR))) 
     { 
      len = (cb = RtlPointerToOffset(buf = (PWSTR)alloca(rcb - cb), stack))/sizeof(WCHAR); 
     } 

     status = CM_Get_Device_Interface_ListW(InterfaceClassGuid, 0, buf, len, CM_GET_DEVICE_INTERFACE_LIST_PRESENT); 

     if (status == CR_SUCCESS) 
     { 
      while (*buf) 
      { 
       DbgPrint("Interface = %S\n", buf); 

       PrintFriendlyNameByInterface(buf); 

       buf += 1 + wcslen(buf); 
      } 
     } 

    } while (status == CR_BUFFER_SMALL); 
} 

können Sie verwenden, sagen GUID_DEVINTERFACE_USB_DEVICE

PrintFriendlyNames(const_cast<PGUID>(&GUID_DEVINTERFACE_USB_DEVICE)); 

das Ergebnis von Verfahren (die Geräte/Schnittstellen) aufgelistet werden können unterschiedlich sein. sagen om meine comp, wenn Enum von GUID_DEVINTERFACE_USB_DEVICE:

Interface = \\?\USB#VID_046D&PID_C52E#5&18d671f8&0&4#{a5dcbf10-6530-11d2-901f-00c04fb951ed} 
DeviceID = USB\VID_046D&PID_C52E\5&18d671f8&0&4 
NAME = USB Composite Device 
Interface = \\?\USB#VID_051D&PID_0002#5B1120T12418__#{a5dcbf10-6530-11d2-901f-00c04fb951ed} 
DeviceID = USB\VID_051D&PID_0002\5B1120T12418__ 
NAME = American Power Conversion USB UPS 
Interface = \\?\USB#VID_045E&PID_077B#5&18d671f8&0&3#{a5dcbf10-6530-11d2-901f-00c04fb951ed} 
DeviceID = USB\VID_045E&PID_077B\5&18d671f8&0&3 
NAME = USB Input Device 

und wenn Enum von GUID_DEVCLASS_USB String Filter:

DeviceID = USB\VID_1F75&PID_0916\120709860570000024 
NAME = USB Mass Storage Device 
DeviceID = USB\ROOT_HUB30\4&33ed72c&0&0 
NAME = USB Root Hub (xHCI) 
DeviceID = USB\VID_0951&PID_168F\001A92053B6A0CA101340008 
NAME = USB Mass Storage Device 
DeviceID = PCI\VEN_8086&DEV_A2AF&SUBSYS_7A741462&REV_00\3&11583659&0&A0 
NAME = Intel(R) USB 3.0 eXtensible Host Controller - 1.0 (Microsoft) 
DeviceID = USB\VID_046D&PID_C52E\5&18d671f8&0&4 
NAME = USB Composite Device 
Verwandte Themen