8

我正在尝试通过 Windows API 对附加的虚拟硬盘进行初始化和分区。我已经成功使用DeviceIoControl()来做到这一点,但是每当我应用所需的驱动器布局时,Windows 都会自动为分区分配一个驱动器号并弹出一个烦人的“你想格式化吗?” 对话。

我的意图是稍后在程序中处理此分区的格式化和挂载,但我不确定如何停止这种行为。我尝试设置RecognizedPartition为 FALSE,但这似乎没有效果。

相关代码:

Layout.PartitionStyle = PARTITION_STYLE_MBR;
Layout.PartitionCount = 4;
Layout.Mbr.Signature = MY_DISK_MBR_SIGNATURE;
Layout.PartitionEntry[0].PartitionStyle = PARTITION_STYLE_MBR;
Layout.PartitionEntry[0].PartitionNumber = 1;
Layout.PartitionEntry[0].StartingOffset.QuadPart = MY_DISK_OFFSET;
Layout.PartitionEntry[0].PartitionLength.QuadPart =
   (Geom.DiskSize.QuadPart - MY_DISK_OFFSET);
Layout.PartitionEntry[0].Mbr.PartitionType = PARTITION_IFS;
Layout.PartitionEntry[0].Mbr.BootIndicator = FALSE;
Layout.PartitionEntry[0].Mbr.RecognizedPartition = FALSE;
Layout.PartitionEntry[0].Mbr.HiddenSectors =
   (MY_DISK_OFFSET / Geom.Geometry.BytesPerSector);

for (int i = 0; i < 4; i++)
{
    Layout.PartitionEntry[i].RewritePartition = TRUE;
}

if (!DeviceIoControl(hDisk, IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
                     Layout, dwLayoutSz, NULL, 0, &dwReturn, NULL))
{
    // Handle error
}
DeviceIoControl(hDisk, IOCTL_DISK_UPDATE_PROPERTIES,
                NULL, 0, NULL, 0, &dwReturn, NULL);

我可以做些什么来防止自动分配驱动器号?

4

4 回答 4

2

我能找到解决此问题的唯一可靠方法是在创建和格式化卷时停止“Shell Hardware Detection”服务。但是,这种方法非常愚蠢,以至于我拒绝将其放入代码中。

另一个“hackish”选项是让服务启动,然后通过CreateProcess()带有CREATE_NO_WINDOW标志的隐藏窗口立即生成自身(或“worker”可执行文件)。

由于该软件作为系统服务运行,并且我不希望在系统生命周期内只发生一次或两次的事情的代码复杂化,我不得不接受有时会偶尔出现交互式服务检测窗口在创建分区时弹出片刻。

如果有人在以编程方式创建和格式化驱动器时发现了一种防止格式提示的好方法,我会很乐意更改接受的答案(并且欠你一杯啤酒)。

于 2012-08-08T14:42:50.663 回答
0

自从我使用这个 API 已经有一段时间了,但从记忆中你不能。但这并不能阻止您事后删除驱动器号分配。

我不确定它是否会停止格式提示,但在我执行此操作的所有时间,分区在我进行磁盘布局更新之前已经被正确格式化。

于 2012-05-04T23:37:48.607 回答
0

我刚刚解决了这个问题,等待几秒钟让驱动器可用,然后直接发出格式化操作。在这里查看我的答案。

于 2014-04-26T00:48:18.943 回答
0

Rufus有一个有趣的解决方法:它安装了一个窗口事件挂钩来检测“你想格式化这个驱动器吗?” 提示并立即关闭它们。在此处查看源代码

然后它继续安排只安装它关心的分区,但这是正交的。

于 2017-11-13T11:32:54.050 回答