使用IOCTL_DISK_SET_DRIVE_LAYOUT创建分区后,如何在新分区中创建新卷?

2 投票
1 回答
1781 浏览
提问于 2025-04-18 04:01

我正在尝试通过Python的ctypes库来创建一个新的分区,格式化它,并给它分配一个新的驱动器字母,使用的是IOCTL_SET_DRIVE_LAYOUT。我最初的编码尝试是参考了这个StackOverflow页面:Python ctypes结构在分配更多内存时被覆盖。你可以在那看到class DeviceIoControl的定义。

我成功地使用IOCTL_DISK_CREATE_DISK初始化了磁盘,并使用IOCTL_DISK_SET_DRIVE_LAYOUT创建了一个特定大小的新分区,下面是磁盘管理中的结果:

分区创建成功

.. 但是,我该如何在新创建的分区中创建新的卷呢?

我尝试使用Win32_Volume的格式化方法,但Win32_Volume只返回所有已存在的分区的驱动器字母,而在我的情况下,这个驱动器字母还没有被分配。

有没有什么建议呢?

1 个回答

1

长话短说(其实真的是个长故事!),结果是我错误地选择了一个不对的分区类型。之前我用的是 PARTITION_EXTENDED 0x05,后来我试了另一个值:PARTITION_IFS 0x07,结果Windows直接让我格式化这个分区。为了避免这种情况,正如这里所说,我们需要等几秒钟,让新的驱动器字母可用,然后调用kernel32.GetLogicalDriveStringsA来查询新的驱动器(你必须在创建分区之前调用这个,然后对比一下,你就能得到新的驱动器字母)。当驱动器字母可用后,我们可以很容易地调用Win32_Volume Format方法来格式化这个驱动器。

这是一个结合了低级的kernel32调用和WMI的解决方案,成功解决了这个问题。如果所有的功能都能在WMI中使用,那就简单多了。不过,现实情况并不是这样。

撰写回答