windows - C++ - WinAPI get list of all connected USB devices -


i'm trying create program categorize connected usb devices , port guid.

i found example of how information connected input devices:

#include <windows.h> #include <iostream>  // namespace using namespace std;  // main int main() {     // program     cout << "usb device lister." << endl;      // number of devices     uint ndevices = 0;     getrawinputdevicelist(null, &ndevices, sizeof(rawinputdevicelist));      // got any?     if (ndevices < 1)     {         // exit         cout << "err: 0 devices?";         cin.get();         return 0;     }      // allocate memory device list     prawinputdevicelist prawinputdevicelist;     prawinputdevicelist = new rawinputdevicelist[sizeof(rawinputdevicelist) * ndevices];      // got memory?     if (prawinputdevicelist == null)     {         // error         cout << "err: not allocate memory device list.";         cin.get();         return 0;     }      // fill device list buffer     int nresult;     nresult = getrawinputdevicelist(prawinputdevicelist, &ndevices, sizeof(rawinputdevicelist));      // got device list?     if (nresult < 0)     {         // clean         delete[] prawinputdevicelist;          // error         cout << "err: not device list.";         cin.get();         return 0;     }      // loop through device list     (uint = 0; < ndevices; i++)     {         // character count device name         uint nbuffersize = 0;         nresult = getrawinputdeviceinfo(prawinputdevicelist[i].hdevice, // device             ridi_devicename,                // device name             null,                           // no buff, want count!             &nbuffersize);                 // char count here!                                             // got device name?         if (nresult < 0)         {             // error             cout << "err: unable device name character count.. moving next device." << endl << endl;              // next             continue;         }          // allocate memory device name         wchar* wcdevicename = new wchar[nbuffersize + 1];          // got memory         if (wcdevicename == null)         {             // error             cout << "err: unable allocate memory device name.. moving next device." << endl << endl;              // next             continue;         }          // name         nresult = getrawinputdeviceinfo(prawinputdevicelist[i].hdevice, // device             ridi_devicename,                // device name             wcdevicename,                   // name!             &nbuffersize);                 // char count                                             // got device name?         if (nresult < 0)         {             // error             cout << "err: unable device name.. moving next device." << endl << endl;              // clean             delete[] wcdevicename;              // next             continue;         }          // set device info & buffer size         rid_device_info rdideviceinfo;         rdideviceinfo.cbsize = sizeof(rid_device_info);         nbuffersize = rdideviceinfo.cbsize;          // device info         nresult = getrawinputdeviceinfo(prawinputdevicelist[i].hdevice,             ridi_deviceinfo,             &rdideviceinfo,             &nbuffersize);          // got buffer?         if (nresult < 0)         {             // error             cout << "err: unable read device info.. moving next device." << endl << endl;              // next             continue;         }          // mouse         if (rdideviceinfo.dwtype == rim_typemouse)         {             // current device             cout << endl << "displaying device " << + 1 << " information. (mouse)" << endl;             wcout << l"device name: " << wcdevicename << endl;             cout << "mouse id: " << rdideviceinfo.mouse.dwid << endl;             cout << "mouse buttons: " << rdideviceinfo.mouse.dwnumberofbuttons << endl;             cout << "mouse sample rate (data points): " << rdideviceinfo.mouse.dwsamplerate << endl;             if (rdideviceinfo.mouse.fhashorizontalwheel)             {                 cout << "mouse has horizontal wheel" << endl;             }             else             {                 cout << "mouse not have horizontal wheel" << endl;             }         }          // keyboard         else if (rdideviceinfo.dwtype == rim_typekeyboard)         {             // current device             cout << endl << "displaying device " << + 1 << " information. (keyboard)" << endl;             wcout << l"device name: " << wcdevicename << endl;             cout << "keyboard mode: " << rdideviceinfo.keyboard.dwkeyboardmode << endl;             cout << "number of function keys: " << rdideviceinfo.keyboard.dwnumberoffunctionkeys << endl;             cout << "number of indicators: " << rdideviceinfo.keyboard.dwnumberofindicators << endl;             cout << "number of keys total: " << rdideviceinfo.keyboard.dwnumberofkeystotal << endl;             cout << "type of keyboard: " << rdideviceinfo.keyboard.dwtype << endl;             cout << "subtype of keyboard: " << rdideviceinfo.keyboard.dwsubtype << endl;         }          // hid         else // (rdi.dwtype == rim_typehid)         {             // current device             cout << endl << "displaying device " << + 1 << " information. (hid)" << endl;             wcout << l"device name: " << wcdevicename << endl;             cout << "vendor id:" << rdideviceinfo.hid.dwvendorid << endl;             cout << "product id:" << rdideviceinfo.hid.dwproductid << endl;             cout << "version no:" << rdideviceinfo.hid.dwversionnumber << endl;             cout << "usage device: " << rdideviceinfo.hid.ususage << endl;             cout << "usage page device: " << rdideviceinfo.hid.ususagepage << endl;         }          // delete name memory!         delete[] wcdevicename;     }      // clean - free memory     delete[] prawinputdevicelist;      // exit     cout << endl << "finnished.";     cin.get();     return 0; } 

i tried convert code connected usb devices failed. question best way collect data i'm looking for?

if want usb devices, not "input" devices, need use same apis device manager does.

for example, devices shown device manager can listed of setupdigetclassdevs function.

for listing usb devices, you'll want use enumerator parameter set "usb" (the enumerator bus device attached, example can "pci", "pcmcia", "usb" main computer busses, , can secondary bus provided expansion device, e.g. "scsi", "ftdibus", , on). may find you're more interested in child devices usb-attached parent device itself.


Comments