1

我正在开展一个项目,该项目要求我在 Windows 驱动器上进行低级别操作,并且主要使用 Windows API 调用来执行此操作。但在我可以对驱动器进行操作之前,我需要知道其上存在的分区类型。

这在 MBR 格式化的磁盘上相当简单,因为

DeviceIoControl(...,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,...);

返回格式为的结构DRIVE_LAYOUT_INFORMATION_EX,其中包含 的数组PARTITION_INFORMATION_EX。在 MBR 磁盘上,该PARTITION_INFORMATION_EX.Mbr.PartitionType元素包含分区类型的唯一标识符,例如 for NTFSit is 0x07,for Extendedit is 0x05

但是,这在 GPT 磁盘上并不是那么简单。我知道我可以从 partition 的开头读取标识符,但我更喜欢使用 API 调用来处理这个问题,例如DeviceIoControl. 当我DeviceIoControl在 GPT 磁盘上运行时,它PARTITION_INFORMATION_EX.Mbr.PartitionType包含的值与通常存在的值完全不同。

请注意,GUID 对我来说毫无用处,因为它只告诉我分区的用途,而不告诉我它是什么类型的分区。我正在尝试确定驱动器是否为 NTFS、FAT 等。

4

3 回答 3

1

对于代码中的 GPT 分区,当您调用 DeviceIoControl() 时,此调用将返回PARTITION_INFORMATION_EX对象中的分区信息。如果您看到PARTITION_INFORMATION_EX结构,则 MBR 和 GPT 磁盘有两个独立的结构。所以当你获取PARTITION_INFORMATION_EX对象中的信息时,你首先要确认磁盘类型是GPT还是MBR,如果是GPT你可以通过比较它的GUID得到具体的分区类型。

于 2017-08-12T11:37:19.203 回答
0

查看 Microsoft 的PARTITION_INFORMATION_GPTGPT 分区结构。

于 2014-08-07T19:48:10.130 回答
0

我发现查找卷的文件系统的最佳方法是调用GetVolumeInformation,而不是通过 PARTITION_INFORMATION_EX 。在 Vista+ 上,这似乎只是GetVolumeInformationByHandleW的包装。如果您已经有音量句柄,后者可能最适合您。

两者都适用于 MBR 或 GPT 磁盘。结果是文件系统名称字符串而不是类型 ID,但应该很容易适应。

于 2015-08-18T18:48:49.933 回答