| | |
| | | return result; |
| | | } |
| | | |
| | | //http://www.ok-soft-gmbh.com/ForStackOverflow/EnumMassStorage.c |
| | | //http://stackoverflow.com/questions/3098696/same-code-returns-diffrent-result-on-windows7-32-bit-system |
| | | // 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 |
| | | //bug check return with diskinfos == null func_ret_ok |
| | | FUNCTION_RETURN getDiskInfos(DiskInfo * diskInfos, size_t * disk_info_size) { |
| | | // bug check return with diskinfos == null func_ret_ok |
| | | FUNCTION_RETURN getDiskInfos(std::vector<DiskInfo>& diskInfos) { |
| | | DWORD fileMaxLen; |
| | | size_t ndrives = 0; |
| | | DWORD fileFlags; |
| | | char volName[MAX_PATH], fileSysName[MAX_PATH]; |
| | | DWORD volSerial = 0; |
| | | const DWORD dwSize = MAX_PATH; |
| | | char szLogicalDrives[MAX_PATH] = { 0 }; |
| | | |
| | | char szLogicalDrives[MAX_PATH] = {0}; |
| | | |
| | | FUNCTION_RETURN return_value = FUNC_RET_NOT_AVAIL; |
| | | const DWORD dwResult = GetLogicalDriveStrings(dwSize, szLogicalDrives); |
| | | |
| | | if (dwResult > 0 && dwResult <= MAX_PATH) { |
| | | if (dwResult > 0) { |
| | | return_value = FUNC_RET_OK; |
| | | char* szSingleDrive = szLogicalDrives; |
| | | while (*szSingleDrive && ndrives < MAX_UNITS) { |
| | | |
| | | // get the next drive |
| | | UINT driveType = GetDriveType(szSingleDrive); |
| | | if (driveType == DRIVE_FIXED) { |
| | | BOOL success = GetVolumeInformation(szSingleDrive, volName, MAX_PATH, |
| | | &volSerial, &fileMaxLen, &fileFlags, fileSysName, |
| | | MAX_PATH); |
| | | BOOL success = GetVolumeInformation(szSingleDrive, volName, MAX_PATH, &volSerial, &fileMaxLen, |
| | | &fileFlags, fileSysName, MAX_PATH); |
| | | if (success) { |
| | | LOG_INFO("drive : %s", szSingleDrive); |
| | | LOG_INFO("Volume Name : %s", volName); |
| | | LOG_INFO("Volume Serial : 0x%x", volSerial); |
| | | LOG_DEBUG("Max file length : %d", fileMaxLen); |
| | | LOG_DEBUG("Filesystem : %s", fileSysName); |
| | | if (diskInfos != NULL) { |
| | | if (ndrives < (int)*disk_info_size) { |
| | | diskInfos[ndrives].id = (int)ndrives; |
| | | strncpy(diskInfos[ndrives].device, volName, |
| | | min(std::size_t{MAX_PATH}, sizeof(volName)) - 1); |
| | | strncpy(diskInfos[ndrives].label, fileSysName, |
| | | min(sizeof(diskInfos[ndrives].label), sizeof(fileSysName)) - 1); |
| | | memcpy(diskInfos[ndrives].disk_sn, &volSerial, sizeof(DWORD)); |
| | | diskInfos[ndrives].preferred = (szSingleDrive[0] == 'C'); |
| | | } else { |
| | | return_value = FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | } |
| | | DiskInfo diskInfo; |
| | | diskInfo.id = (int)ndrives; |
| | | strncpy(diskInfo.device, volName, min(std::size_t{MAX_PATH}, sizeof(volName)) - 1); |
| | | strncpy(diskInfo.label, fileSysName, |
| | | min(sizeof(diskInfos[ndrives].label), sizeof(fileSysName)) - 1); |
| | | memcpy(diskInfo.disk_sn, &volSerial, sizeof(DWORD)); |
| | | diskInfo.preferred = (szSingleDrive[0] == 'C'); |
| | | diskInfos.push_back(diskInfo); |
| | | ndrives++; |
| | | } else { |
| | | LOG_WARN("Unable to retrieve information of '%s'", szSingleDrive); |
| | | LOG_DEBUG("Unable to retrieve information of '%s'", szSingleDrive); |
| | | } |
| | | } else { |
| | | LOG_INFO("This volume is not fixed : %s, type: %d", szSingleDrive); |
| | | LOG_DEBUG("This volume is not fixed : %s, type: %d", szSingleDrive); |
| | | } |
| | | szSingleDrive += strlen(szSingleDrive) + 1; |
| | | } |
| | | } |
| | | if (diskInfos == NULL || *disk_info_size == 0) { |
| | | if (ndrives > 0) { |
| | | return_value = FUNC_RET_OK; |
| | | } else { |
| | | return_value = FUNC_RET_NOT_AVAIL; |
| | | LOG_INFO("No fixed drive was detected"); |
| | | } |
| | | *disk_info_size = ndrives; |
| | | if (diskInfos.size() > 0) { |
| | | return_value = FUNC_RET_OK; |
| | | } else { |
| | | *disk_info_size = min(ndrives, *disk_info_size); |
| | | return_value = FUNC_RET_NOT_AVAIL; |
| | | LOG_INFO("No fixed drive were detected"); |
| | | } |
| | | |
| | | return return_value; |
| | | } |
| | | |
| | | |
| | | FUNCTION_RETURN getModuleName(char buffer[MAX_PATH]) { |
| | | FUNCTION_RETURN result = FUNC_RET_OK; |
| | |
| | | } |
| | | return result; |
| | | } |
| | | |