| 327 | } |
| 328 | |
| 329 | static int fxFindPortFromVIDPID(int VID, int PID) |
| 330 | { |
| 331 | HDEVINFO info; |
| 332 | SP_DEVINFO_DATA data; |
| 333 | DEVPROPTYPE propertyType; |
| 334 | DWORD index = 0; |
| 335 | DWORD size = 0; |
| 336 | char buffer[1024] = {0}; |
| 337 | int portNum = -1; |
| 338 | |
| 339 | char searchName[25]; |
| 340 | sprintf(searchName, "VID_%04X&PID_%04X&", VID, PID); |
| 341 | |
| 342 | info = SetupDiGetClassDevs(NULL, "USB", NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT); |
| 343 | if (info == INVALID_HANDLE_VALUE) |
| 344 | return -1; |
| 345 | |
| 346 | data.cbSize = sizeof(SP_DEVINFO_DATA); |
| 347 | |
| 348 | while (SetupDiEnumDeviceInfo(info, index, &data)) { |
| 349 | index++; |
| 350 | |
| 351 | if (SetupDiGetDeviceRegistryProperty(info, &data, SPDRP_HARDWAREID, &propertyType, buffer, sizeof(buffer), &size)) { |
| 352 | if ( !strstr(buffer, searchName)) |
| 353 | continue; |
| 354 | |
| 355 | HKEY key = SetupDiOpenDevRegKey(info, &data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); |
| 356 | |
| 357 | if (key == INVALID_HANDLE_VALUE) |
| 358 | continue; |
| 359 | |
| 360 | char portName[20]; |
| 361 | DWORD type = 0; |
| 362 | |
| 363 | if ( (RegQueryValueEx(key, "PortName", NULL, &type, portName, &size) == ERROR_SUCCESS) && type == REG_SZ) { |
| 364 | if ( strncmp( portName, "COM", 3) == 0) { |
| 365 | portNum = atoi( portName + 3); |
| 366 | } |
| 367 | } |
| 368 | |
| 369 | RegCloseKey(key); |
| 370 | } |
| 371 | } |
| 372 | |
| 373 | if (info) |
| 374 | SetupDiDestroyDeviceInfoList(info); |
| 375 | |
| 376 | return portNum; |
| 377 | } |
| 378 | |
| 379 | int main(int argc, char* argv[]) |
| 380 | { |