CHAR* lpdrives = new CHAR[MAX_PATH];
// 获取盘符,返回字符串的长度。(我理解的格式应该是 {c:\\\0d:\\\0......},所以一个盘符占据 4 个字符)
DWORD _count = GetLogicalDriveStringsA(MAX_PATH, lpdrives);
std::string sDrives[26]={""}; //设备盘符路径集
HANDLE hDeviceHandle[26]; //设备句柄集
DWORD hDevice_Num = 0;
for(size_t i = 0; i < _count/4; ++i)
{
// 获取磁盘的类型 DRIVE_FIXED 固定磁盘, DRIVE_REMOVABLE 可移动磁盘
if(GetDriveTypeA(lpdrives + 4*i) == DRIVE_FIXED ||
GetDriveTypeA(lpdrives + 4*i) == DRIVE_REMOVABLE)
{
sDrives[i] = lpdrives + 4*i;
std::string temp = "\\\\?\\";
sDrives[i] = temp + (sDrives[i].substr(0, 2));
char ch = sDrives[i][4];
printf("%c ", ch);
hDeviceHandle[hDevice_Num] = CreateFileA(sDrives[i].c_str(), GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(hDeviceHandle[hDevice_Num] == INVALID_HANDLE_VALUE)
printf("failed reason is %lu\n", GetLastError());
hDevice_Num ++;
}
}
STORAGE_DEVICE_NUMBER stn;
DWORD lpbuffer;
for(size_t i = 0; i < hDevice_Num; ++i)
{
//检索设备类型、设备数量,可分区的设备,设备的分区号
DeviceIoControl(hDeviceHandle[i], IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &stn, sizeof(stn), &lpbuffer, NULL);
CloseHandle(hDeviceHandle[i]);
printf("%d ,%d ", stn.DeviceNumber, stn.DeviceType);
}