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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| struct VOLUME_INFO { char driver;
char type; };
struct DISK_INFO { DWORD number;
bool readOnly;
char type;
std::vector<VOLUME_INFO> volumes; };
static std::vector<DISK_INFO> EnumDisk() { std::vector<VOLUME_INFO> volumes; std::vector<DISK_INFO> result;
DWORD dwLen = GetLogicalDriveStringsA(0, NULL); char* pszDriver = new char[dwLen]; GetLogicalDriveStringsA(dwLen, pszDriver);
for (; *pszDriver != '\0'; pszDriver += strlen(pszDriver) + 1) { VOLUME_INFO vi = { 0 }; vi.driver = pszDriver[0]; vi.type = GetDriveTypeA(pszDriver);
std::string buffer = "\\\\.\\"; buffer += pszDriver[0]; buffer += ':';
HANDLE hVol = CreateFileA(buffer.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hVol == INVALID_HANDLE_VALUE) { printf("无法打开卷 %s 错误码 %d\n", buffer.c_str(), GetLastError()); continue; }
STORAGE_DEVICE_NUMBER sdn = { 0 }; DWORD dwBytesReturned; BOOL success = DeviceIoControl(hVol, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdn, sizeof(sdn), &dwBytesReturned, NULL);
VOLUME_DISK_EXTENTS PVolDiskExtent = { 0 }; DWORD cbBytes; success |= DeviceIoControl(hVol, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &PVolDiskExtent, sizeof(VOLUME_DISK_EXTENTS), &cbBytes, NULL); CloseHandle(hVol); if (success == 0) { printf("无法获取卷信息 %s 错误码 %d\n", buffer.c_str(), GetLastError()); continue; }
bool matched = false; for (auto& disk : result) { if (disk.number == PVolDiskExtent.Extents[0].DiskNumber) { disk.volumes.push_back(vi); matched = true; } }
if (!matched) { DISK_INFO di = { 0 }; di.number = PVolDiskExtent.Extents[0].DiskNumber; di.type = sdn.DeviceType; di.volumes.push_back(vi); result.push_back(di); } }
for (auto& disk : result) { HANDLE hDisk = OpenPhysicalDrive(disk.number); if (hDisk == INVALID_HANDLE_VALUE) { printf("无法打开物理磁盘 %d 错误码 %d\n", disk.number, GetLastError()); continue; }
disk.readOnly = IsDiskReadOnly(hDisk);
CloseHandle(hDisk); }
return result; }
|