can be compiled directly (set to: Use multibyte character set)
Transferred, code:
/*http://www.experts-exchange.com/programming/editors_ides/q_24506125.html*/#include <stdio.h> #include <windows.h> #include <setupapi.h> #include <devguid.h> #include <winioctl.h> #include < regstr.h> #include <tchar.h> #include <string>using namespace std; #pragma comment (lib, "Setupapi.lib")/ * Get device number path: such as G: Number of devices */bool Getdevicenumber (LPCTSTR pszdevpath, dword& dwdevnum) {BOOL BRC = FALSE; HANDLE hdrive = CreateFile (Pszdevpath,0,file_share_read | File_share_write,null,open_existing, NULL, NULL); if (invalid_handle_value! = hdrive) {Storage_device_number Sdn;DWORD dwbytesreturned = 0;BRC = DeviceIoControl (hdrive,ioctl_storage_get_device_number,null, 0, &SDN, sizeof (SDN),& dwbytesreturned, NULL), if (BRC) Dwdevnum = Sdn. DeviceNumber; CloseHandle (hdrive);} else printf ("error:[%d" (%s) \ n ", GetLastError (), Pszdevpath); return BRC; }int getdevicedescription (LPCTSTR pszdrive, tchar* pszdesc, const size_t szdescsize) {TCHAR acdevname[max_path];//QueryDosdevice (Pszdrive,acdevname,max_path);//printf ("Test:%s\n", acdevname); _stprintf (Acdevname, "\\\\.\\%s", pszdrive);D Word dwnumofinterest =-1;; Getdevicenumber (acdevname,dwnumofinterest);//printf ("devicenumber:[%d]\n", dwnumofinterest); guid* guid = (guid*) &guid_devinterface_disk;//Get Device Interface info set handle//for all devices attached to Syst Emhdevinfo Hdevinfo = Setupdigetclassdevs (GUID, NULL, Null,digcf_present | Digcf_deviceinterface); if (hdevinfo = = invalid_handle_value) {return 0;} Retrieve a context structure for a device interface//of a device information set. DWORD dwindex = 0; BOOL bRet = FALSE; BYTE buf[1024]; Psp_device_interface_detail_data Pspdidd = (psp_device_interface_detail_data) Buf; Sp_device_interface_data Spdid; Sp_devinfo_data Spdd;dword dwsize;spdid.cbsize = sizeof (Spdid); while (true) {BRet = Setupdienumdeviceinterfaces (Hdevinfo, Null,guid, Dwindex, &spdid); if (!bret) {break;} dwsize = 0; SetupdigEtdeviceinterfacedetail (hdevinfo,&spdid, NULL, 0, &dwsize, null); if (dwsize!=0 && dwsize<=sizeof ( Buf)) {pspdidd->cbsize = sizeof (*PSPDIDD);//5 bytes! ZeroMemory ((PVOID) &spdd, sizeof (SPDD)), spdd.cbsize = sizeof (SPDD), Long res =setupdigetdeviceinterfacedetail ( Hdevinfo, &spdid, Pspdidd,dwsize, &DWSIZE,&SPDD);p rintf ("result:[%s]\n", Pspdidd->devicepath); <---------here! DWORD dwtype; LPTSTR buffer = Null;dword buffersize = 0;while (! Setupdigetdeviceregistryproperty (Hdevinfo,&spdd,spdrp_friendlyname,&dwtype, (PBYTE) Buffer,buffersize, &buffersize) {if (GetLastError () = = Error_insufficient_buffer) {//change the buffer size.if (buffer) LocalFree ( buffer);//Double the size to avoid problems on//W2K MBCS systems per KB 888609. Buffer = (LPTSTR) LocalAlloc (lptr,buffersize * 2);} else{//Insert error handling here.break;}} DWORD dwnum = 0;; Getdevicenumber (Pspdidd->devicepath,dwnum);//printf ("devicenumber:[%d]\n", Dwnum);//if (DwNumOfIntereSt = = dwnum) _stprintf (pszdesc,_t ("%s"), buffer), if (dwnumofinterest = = Dwnum) _stprintf (pszdesc,_t ("%s"),pspdidd-> DevicePath);//printf ("result:[%s]\n", buffer); if (buffer) localfree (buffer); }dwindex++;} Setupdidestroydeviceinfolist (hdevinfo); return 0;} void Main (int argc, char** argv) {TCHAR acdesc[1024] = "<unknown>"; tchar* pszdrive;if (2! = argc) {printf ("Usage:usbdev.exe <drive letter> (ex.: ' Usbdev f: ') \ n"); pszdrive = * (argv + 1); Getdevicedescription (pszdrive, Acdesc, 1024x768) _tprintf ("\ndescription for%s\n\n\t%s\n", Pszdrive, AcDesc); System (" Pause ");}
C + + get device pid,vid information