| | |
| | | namespace hw_identifier { |
| | | |
| | | static array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA> generate_id_by_sn(const DiskInfo &disk_info) { |
| | | array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA> a_disk_id; |
| | | a_disk_id.fill(0); |
| | | size_t size = min(a_disk_id.size(), sizeof(disk_info.disk_sn)); |
| | | array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA> a_disk_id = {}; |
| | | size_t size = min((size_t) HW_IDENTIFIER_PROPRIETARY_DATA, |
| | | sizeof(disk_info.disk_sn)); |
| | | memcpy(&a_disk_id[0], disk_info.disk_sn, size); |
| | | |
| | | return a_disk_id; |
| | | } |
| | | |
| | | static array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA> generate_id_by_label(const DiskInfo &disk_info) { |
| | | array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA> a_disk_id; |
| | | a_disk_id.fill(0); |
| | | array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA> a_disk_id = {}; |
| | | strncpy((char *)&a_disk_id[0], disk_info.label, a_disk_id.size() - 1); |
| | | return a_disk_id; |
| | | } |
| | |
| | | static FUNCTION_RETURN generate_disk_pc_id(vector<array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA>> &v_disk_id) { |
| | | std::vector<DiskInfo> disk_infos; |
| | | FUNCTION_RETURN result_diskinfos = getDiskInfos(disk_infos); |
| | | if (result_diskinfos != FUNC_RET_OK && result_diskinfos != FUNC_RET_BUFFER_TOO_SMALL) { |
| | | if (result_diskinfos != FUNC_RET_OK) { |
| | | return result_diskinfos; |
| | | } |
| | | if (disk_infos.size() == 0) { |
| | |
| | | |
| | | // http://www.ok-soft-gmbh.com/ForStackOverflow/EnumMassStorage.c |
| | | // http://stackoverflow.com/questions/3098696/same-code-returns-diffrent-result-on-windows7-32-bit-system |
| | | #define MAX_UNITS 30 |
| | | #define MAX_UNITS 40 |
| | | // bug check return with diskinfos == null func_ret_ok |
| | | FUNCTION_RETURN getDiskInfos(std::vector<DiskInfo>& diskInfos) { |
| | | DWORD fileMaxLen; |
| | | size_t ndrives = 0; |
| | | size_t ndrives = 0, drives_scanned = 0; |
| | | DWORD fileFlags; |
| | | char volName[MAX_PATH], fileSysName[MAX_PATH]; |
| | | DWORD volSerial = 0; |
| | |
| | | if (dwResult > 0) { |
| | | return_value = FUNC_RET_OK; |
| | | char* szSingleDrive = szLogicalDrives; |
| | | while (*szSingleDrive && ndrives < MAX_UNITS) { |
| | | while (*szSingleDrive && drives_scanned < MAX_UNITS) { |
| | | // get the next drive |
| | | UINT driveType = GetDriveType(szSingleDrive); |
| | | if (driveType == DRIVE_FIXED) { |
| | |
| | | if (success) { |
| | | LOG_DEBUG("drive: %s,volume Name: %s, Volume Serial: 0x%x,Filesystem: %s", szSingleDrive, volName, |
| | | volSerial, fileSysName); |
| | | DiskInfo diskInfo; |
| | | memset(&diskInfo, 0, sizeof(diskInfo)); |
| | | DiskInfo diskInfo = {}; |
| | | diskInfo.id = (int)ndrives; |
| | | diskInfo.label_initialized = true; |
| | | strncpy(diskInfo.device, volName, min(std::size_t{MAX_PATH}, sizeof(volName)) - 1); |
| | |
| | | } else { |
| | | LOG_DEBUG("This volume is not fixed : %s, type: %d", szSingleDrive); |
| | | } |
| | | szSingleDrive += strlen(szSingleDrive) + 1; |
| | | drives_scanned++; |
| | | } |
| | | } |
| | | if (diskInfos.size() > 0) { |