ULONG GetSymbolicLink(void) { //OutputDebugString("GetSymbolicLink\r\n"); int found_index = 0; HDEVINFO hDevInfo; // obtain a handle to device information set for all // kernel streaming audio devices present on the system hDevInfo = SetupDiGetClassDevs( &CamacGuid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); if (hDevInfo == INVALID_HANDLE_VALUE) { // function returned 0 // No audio devices are present on the system return 0; } else { TCHAR HardwareID[512]; USHORT found_index = 0; // Enumerate first device of our class. SP_DEVICE_INTERFACE_DATA ifdata; ifdata.cbSize = sizeof(ifdata); for ( DWORD devindex = 0; SetupDiEnumInterfaceDevice(hDevInfo, NULL,&CamacGuid, devindex, &ifdata); ++devindex ) { // Determine the symbolic link name for this device instance. Since // this is variable in length, make an initial call to determine // the required length. DWORD needed; SetupDiGetDeviceInterfaceDetail(hDevInfo, &ifdata, NULL, 0, &needed, NULL); // this call determines the size of memory to allocate PSP_INTERFACE_DEVICE_DETAIL_DATA detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(needed); // zero the structure memset (detail,0,needed); // set the size of the structure without the string at the end detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); SP_DEVINFO_DATA did = {sizeof(SP_DEVINFO_DATA)}; SetupDiGetDeviceInterfaceDetail(hDevInfo, &ifdata, detail, needed, NULL, &did); // Determine the device's link name SetupDiGetDeviceRegistryProperty(hDevInfo, &did,SPDRP_HARDWAREID, NULL, (PBYTE) HardwareID, sizeof(HardwareID), NULL); memset(symbolic_link, 0, sizeof(symbolic_link)); strncpy(symbolic_link, detail->DevicePath, sizeof(symbolic_link)); free((PVOID) detail); ifdata.cbSize = sizeof(ifdata); // reinitialize for next use } SetupDiDestroyDeviceInfoList(hDevInfo); } return found_index; }
void PCUtils::GetPhysicalDisks( std::vector<PCUtils::DISK_DRIVE_INFORMATION>& OutVector ) { #ifdef _WIN32 unsigned i; DWORD dwSize, dwPropertyRegDataType = SPDRP_PHYSICAL_DEVICE_OBJECT_NAME; CONFIGRET r; HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; SP_DEVICE_INTERFACE_DATA interfaceData; TCHAR szDeviceInstanceID [MAX_DEVICE_ID_LEN]; TCHAR szDesc[1024]; GUID HddClass; HddClass = GUID_DEVINTERFACE_DISK;//GUID_DEVCLASS_DISKDRIVE; // List all connected disk drives hDevInfo = SetupDiGetClassDevs (&HddClass, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hDevInfo == INVALID_HANDLE_VALUE) return; // Find the ones that are driverless for (i = 0; ; i++) { DeviceInfoData.cbSize = sizeof (DeviceInfoData); // Get the next device info if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData)) break; interfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); // Get the next device interface if (!SetupDiEnumInterfaceDevice(hDevInfo, NULL, &HddClass, i, &interfaceData)) { break; } // Get the device ID r = CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID , MAX_PATH, 0); if (r != CR_SUCCESS) continue; // To add to the vector DISK_DRIVE_INFORMATION AddToVector; DWORD requiredSize = 0; // Get the path SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, NULL, NULL, &requiredSize, NULL); SP_INTERFACE_DEVICE_DETAIL_DATA* data = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc(requiredSize); data->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, data, requiredSize, NULL, NULL)) { continue; } AddToVector.Path = nowide::convert(std::wstring(data->DevicePath)); qDebug("Disk path: %s", AddToVector.Path.c_str()); // Friendly name (e.g. SanDisk Cruzer USB...) SetupDiGetDeviceRegistryProperty (hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, &dwPropertyRegDataType, (BYTE*)szDesc, sizeof(szDesc), // The size, in bytes &dwSize); AddToVector.FriendlyName = nowide::convert(std::wstring((TCHAR*)szDesc)); qDebug("Friendly name: %s", AddToVector.FriendlyName.c_str()); OutVector.push_back(AddToVector); delete data; } #else DIR *dir = NULL; dirent *ent = NULL; dir = opendir("/dev/"); if (dir != NULL) { // Read the shit while ((ent = readdir(dir)) != NULL) { // Check the directory name, and if it starts with "disk" then keep it! QRegExp exp("disk*"); exp.setPatternSyntax(QRegExp::Wildcard); exp.setCaseSensitivity(Qt::CaseInsensitive); if (exp.exactMatch(ent->d_name)) { DISK_DRIVE_INFORMATION curdir; std::ostringstream ss; ss << "/dev/r"; ss << ent->d_name; std::string diskPath = ss.str(); curdir.Path = diskPath; int device; if ((device = open(diskPath.c_str(), O_RDONLY)) > 0) { #ifdef __linux hd_driveid hd; if (!ioctl(device, HDIO_GET_IDENTITY, &hd)) { curdir.FriendlyName = hd.model; } #elif defined __APPLE__ curdir.FriendlyName = ent->d_name; #endif OutVector.push_back(curdir); } } } } if (dir) closedir(dir); if (ent) delete ent; #endif }
/** * @brief 打开HID设备 * @param None * @retval None */ HANDLE OpenMyHIDDevice(int overlapped) { HANDLE hidHandle; GUID hidGuid; HidD_GetHidGuid(&hidGuid); HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid,NULL,NULL,(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); if (hDevInfo == INVALID_HANDLE_VALUE) { return INVALID_HANDLE_VALUE; } SP_DEVICE_INTERFACE_DATA devInfoData; devInfoData.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA); int deviceNo = 0; SetLastError(NO_ERROR); while (GetLastError() != ERROR_NO_MORE_ITEMS) { if (SetupDiEnumInterfaceDevice (hDevInfo,0,&hidGuid,deviceNo,&devInfoData)) { ULONG requiredLength = 0; SetupDiGetInterfaceDeviceDetail(hDevInfo, &devInfoData, NULL, 0, &requiredLength, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*)malloc(requiredLength); devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if(!SetupDiGetInterfaceDeviceDetail(hDevInfo, &devInfoData, devDetail, requiredLength, NULL, NULL)) { free(devDetail); SetupDiDestroyDeviceInfoList(hDevInfo); return INVALID_HANDLE_VALUE; } if (overlapped) { hidHandle = CreateFile(devDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); } else { hidHandle = CreateFile(devDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hidHandle==INVALID_HANDLE_VALUE) hidHandle = CreateFile(devDetail->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); } free(devDetail); if (hidHandle==INVALID_HANDLE_VALUE) { SetupDiDestroyDeviceInfoList(hDevInfo); free(devDetail); return INVALID_HANDLE_VALUE; } _HIDD_ATTRIBUTES hidAttributes; if(!HidD_GetAttributes(hidHandle, &hidAttributes)) { CloseHandle(hidHandle); SetupDiDestroyDeviceInfoList(hDevInfo); return INVALID_HANDLE_VALUE; } if (USB_VID == hidAttributes.VendorID && USB_PID == hidAttributes.ProductID) { printf("找到了我想要的设备,哈哈哈....\n"); break; } else { CloseHandle(hidHandle); ++deviceNo; } } } SetupDiDestroyDeviceInfoList(hDevInfo); return hidHandle; }