1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| int find_devices(GUID guid, TCHAR *devpath, size_t len_devpath) { HDEVINFO dev_info = SetupDiGetClassDevs((LPGUID) &guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (dev_info == INVALID_HANDLE_VALUE) { fprintf(stderr, "GetDevices INVALID_HANDLE_VALUE\n"); exit(-1); }
SP_DEVICE_INTERFACE_DATA dev_interface; dev_interface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
DWORD index; for (index = 0; SetupDiEnumDeviceInterfaces(dev_info, NULL, &guid, index, &dev_interface); ++index) {
ULONG detail_size = 0; if (!SetupDiGetDeviceInterfaceDetail(dev_info, &dev_interface, NULL, 0, &detail_size, NULL) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { fprintf(stderr, "SetupDiGetDeviceInterfaceDetail - get length failed\n"); break; }
PSP_DEVICE_INTERFACE_DETAIL_DATA dev_detail = (PSP_DEVICE_INTERFACE_DETAIL_DATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, detail_size); if (!dev_detail) { fprintf(stderr, "HeapAlloc failed\n"); break; } dev_detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(dev_info, &dev_interface, dev_detail, detail_size, NULL, NULL)) { fprintf(stderr, "SetupDiGetDeviceInterfaceDetail - get detail failed\n"); HeapFree(GetProcessHeap(), 0, dev_detail); break; }
StringCchCopy(devpath, len_devpath, dev_detail->DevicePath); HeapFree(GetProcessHeap(), 0, dev_detail); }
SetupDiDestroyDeviceInfoList(dev_info);
return index; }
HANDLE open_device(TCHAR *path, TCHAR *device) { HANDLE handle; TCHAR device_path[MAX_PATH + 1]; strcpy_s(device_path, sizeof device_path, path); strcat_s(device_path, sizeof device_path, device); fprintf(stdout,"device_path: %s\r\n",device); handle = CreateFile(device_path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (handle == INVALID_HANDLE_VALUE) { fprintf(stderr, "Error opening device, win32 error code: %d\n", GetLastError()); }
return handle; }
|