为了登录我的应用程序,我需要获取有关磁盘上物理分区的信息,例如PARTITION_INFORMATION_EX中提供的信息。对于"基本磁盘"我没有问题。使用以下方法:
首先让我们假设以下驱动器配置:
然后以下代码正常工作:
//Say, if I want to get info for partion 1 on disk 0 (or volume C:)
HANDLE hPart = ::CreateFile(L"\\\\?\\GLOBALROOT\\Device\\Harddisk0\\Partition1",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if(hPart != INVALID_HANDLE_VALUE)
{
PARTITION_INFORMATION_EX pix = {0};
DWORD bytesReturned = 0;
if(::DeviceIoControl(hPart, IOCTL_DISK_GET_PARTITION_INFO_EX, NULL, 0, &pix, sizeof(pix), &bytesReturned, NULL))
{
//Got info OK
}
::CloseHandle(hPart);
}
但是,如果我尝试检索"动态分区"上的信息,比如磁盘2,分区1(或跨越卷F :)的下半部分,我尝试使用"\\\\?\\GLOBALROOT\\Device\\Harddisk2\\Partition1"
在致电CreateFile
时,它失败,错误代码为2,或ERROR_FILE_NOT_FOUND
。
所以问题是,如何在动态磁盘上检索分区信息?
答案 0 :(得分:0)
阅读文档:
特别是,本节提供了一个提示:
检测磁盘类型
没有特定的功能以编程方式检测特定文件或目录所在的磁盘类型。有间接的方法。
首先,致电
GetVolumePathName
。然后,使用路径调用CreateFile
打开卷。接下来,将IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
与卷句柄一起使用以获取磁盘编号,并使用使用磁盘编号来构建磁盘路径,例如"\\?\PhysicalDriveX"
。最后,使用IOCTL_DISK_GET_DRIVE_LAYOUT_EX
获取分区列表,并检查分区列表中每个条目的PartitionType
。