diff --git a/usbSearch.c b/usbSearch.c index 501b3b0..8bab23d 100644 --- a/usbSearch.c +++ b/usbSearch.c @@ -1,4 +1,20 @@ /* + * usbSearch -- Search for USB devices by VID and PID, shows serial numbers + * + * http://github.com/todbot/usbSearch/ + * + * 2012, Tod E. Kurt, http://todbot.com/blog/ + * + * + * Uses DispHealper : http://disphelper.sourceforge.net/ + * Also see: + * http://blogs.msdn.com/b/powershell/archive/2007/02/24/displaying-usb-devices-using-wmi.aspx + * http://technet.microsoft.com/en-us/library/ee156618.aspx + * + * Notable VIDs & PIDs combos: + * VID 0403 - FTDI + * + * VID 0403 / PID 6001 - Arduino Diecimila * */ @@ -21,23 +37,22 @@ // void usage(void) { - fprintf(stderr, "Usage: usbSearch [-w] [-h] [-n] [-v] \n"); - fprintf(stderr, "\t-w : Wait for device to appear\n"); - fprintf(stderr, "\t-r : Use hard reboot if device not online\n"); - fprintf(stderr, "\t-n : No reboot after programming\n"); - fprintf(stderr, "\t-v : Verbose output\n"); - fprintf(stderr, "\n = atmega32u4 | at90usb162 | at90usb646 | at90usb1286\n"); - fprintf(stderr, "\nFor more information, please visit:\n"); + fprintf(stderr, "Usage: usbSearch [-h] [-v] [-vid ] [-pid ]\n"); + fprintf(stderr, "\t-vid : Search by Vendor ID\n"); + fprintf(stderr, "\t-pid : Search by Product ID\n"); + fprintf(stderr, "\t-v : Verbose output (more for more output)\n"); + fprintf(stderr, "\t-h : This help message\n"); + fprintf(stderr, "\nFor more info, https://github.com/todbot/usbSearch\n"); exit(1); } // command-line options - int verbose = 0; char* VIDstr; char* PIDstr; +void do_silly_test(void); // void parse_options(int argc, char **argv) @@ -83,7 +98,8 @@ int do_usbSearch(void) sprintf( vidpidstr, "VID_%s&PID_%s", VIDstr, PIDstr); } - if(verbose) printf("Searching for '%s'...\n", vidpidstr); + if(verbose) + printf("Searching for '%s'...\n", vidpidstr); DISPATCH_OBJ(wmiSvc); DISPATCH_OBJ(colDevices); @@ -97,6 +113,10 @@ int do_usbSearch(void) L".ExecQuery(%S)", L"Select * From Win32_USBControllerDevice"); + + if(0) do_silly_test(); + + int match_count = 0; FOR_EACH(objDevice, colDevices, NULL) { @@ -105,16 +125,16 @@ int do_usbSearch(void) char* pch; dhGetValue(L"%s", &str1, objDevice, L".Dependent"); - - if(verbose>1) printf("\n'%s'.\n\n", str1); + + if(verbose>1) printf("'%s'.\n", str1); pch = strtok( str1, "\""); pch = strtok( NULL, "\""); - if(verbose>1) printf("'%s'\n", pch); + if(verbose>2) printf("'%s'\n", pch); char* word; int i; int match = 0; - char vpstr[1000]; + char vpstr[1000]; // FIXME: hack // pos 0 = "USB", pos 1 = "VID_01234&PID=ABCD", pos 2 = serial number for (word = strtok( pch, "\\" ), i=0; word; @@ -122,7 +142,7 @@ int do_usbSearch(void) if( i==0 && strstr( word, "USB" ) != NULL ) { // match match = 1; } - if( i==1 && match==1 && strstr( word, vidpidstr ) != NULL ) { // match + if( i==1 && match==1 && strstr( word, vidpidstr ) != NULL ) { match = 2; strcpy(vpstr,word); } @@ -132,7 +152,7 @@ int do_usbSearch(void) printf("Found VID:%s PID:%s serial:%s\n", vstr, pstr, word); match_count++; } - if(verbose>1) printf("%d:'%s'\n", i,word ); + if(verbose>2) printf("%d:'%s'\n", i,word ); } dhFreeString(str1); @@ -144,7 +164,8 @@ int do_usbSearch(void) dhUninitialize(TRUE); - if(verbose) printf("Found %d match%s\n", match_count,(match_count==1)?"":"es"); + if(verbose) + printf("Found %d match%s\n", match_count,(match_count==1)?"":"es"); return 0; } @@ -160,3 +181,59 @@ int main(int argc, char **argv) return 0; } + + + +void do_silly_test(void) +{ +// could do something like this too, once you get a list of Dependents +// from Win32_USBControllerDevice +// see: http://msdn.microsoft.com/en-us/library/windows/desktop/aa387884(v=vs.85).aspx +// and: http://msdn.microsoft.com/en-us/library/windows/desktop/aa394353(v=vs.85).aspx + DISPATCH_OBJ(aDevice); + char *str2 = NULL; + // dhGetObject( L"winmgmts:\\\\BOKBOKXP\\root\\cimv2:Win32_PnPEntity.DeviceID=\"USBPRINT\\\\HPHP_COLOR_LASERJET_8500_PS\\\\6&10299E26&0&USB009\"", + // arduino diecimilia + dhGetObject( L"winmgmts:\\\\BOKBOKXP\\root\\cimv2:Win32_PnPEntity.DeviceID=\"USB\\\\VID_0403&PID_6001\\\\A6004CCF\"", + NULL, &aDevice ); + dhGetValue(L"%s", &str2, aDevice, L".Caption"); + printf("Caption:%s\n",str2); + dhGetValue(L"%s", &str2, aDevice, L".CreationClassName"); + printf("CreationClassName:%s\n",str2); + dhGetValue(L"%s", &str2, aDevice, L".Description"); + printf("Description:%s\n",str2); + dhGetValue(L"%s", &str2, aDevice, L".DeviceID"); + printf("DeviceID:%s\n",str2); + dhGetValue(L"%s", &str2, aDevice, L".Name"); + printf("Name:%s\n",str2); + dhGetValue(L"%s", &str2, aDevice, L".PNPDeviceID"); + printf("PNPDeviceID:%s\n",str2); + dhGetValue(L"%s", &str2, aDevice, L".Status"); + printf("Status:%s\n",str2); + dhGetValue(L"%s", &str2, aDevice, L".SystemCreationClassName"); + printf("SystemCreationClassName:%s\n",str2); + dhGetValue(L"%s", &str2, aDevice, L".SystemName"); + printf("SystemName:%s\n",str2); + //dhGetValue(L"%s", &str2, aDevice, L".HardwareID"); // no work arrays + //printf("HardwareID:%s\n",str2); + dhGetValue(L"%s", &str2, aDevice, L".Service"); + printf("Service:%s\n",str2); + + printf("\n\n"); +} + + +/* + +// getWmiStr: +// Helper function to create wmi moniker incorporating computer name. +static LPWSTR getWmiStr(LPCWSTR str) +{ + static WCHAR szWmiStr[256]; + + wcscpy(szWmiStr, L"winmgmts:{impersonationLevel=impersonate}!\\\\"); + wcsncat(szWmiStr, str, 128); + + return szWmiStr; +} +*/ diff --git a/usbSearch.exe b/usbSearch.exe old mode 100755 new mode 100644 index 217f79a..ecf17af Binary files a/usbSearch.exe and b/usbSearch.exe differ