如何打开分区句柄以在动态磁盘上获取其信息?

时间:2015-10-28 06:35:52

标签: c++ c windows winapi kernel32

为了登录我的应用程序,我需要获取有关磁盘上物理分区的信息,例如PARTITION_INFORMATION_EX中提供的信息。对于"基本磁盘"我没有问题。使用以下方法:

首先让我们假设以下驱动器配置:

enter image description here

然后以下代码正常工作:

//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

所以问题是,如何在动态磁盘上检索分区信息?

1 个答案:

答案 0 :(得分:0)

阅读文档:

Basic and Dynamic Disks

特别是,本节提供了一个提示:

  

检测磁盘类型

     

没有特定的功能以编程方式检测特定文件或目录所在的磁盘类型。有间接的方法。

     

首先,致电GetVolumePathName。然后,使用路径调用CreateFile打开卷。接下来,将IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS与卷句柄一起使用以获取磁盘编号,并使用使用磁盘编号来构建磁盘路径,例如"\\?\PhysicalDriveX"。最后,使用IOCTL_DISK_GET_DRIVE_LAYOUT_EX获取分区列表,并检查分区列表中每个条目的PartitionType