如何在没有Windows分配驱动器号的情况下创建分区?

时间:2012-05-04 23:13:20

标签: c++ winapi windows-7

我正在尝试通过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 个答案:

答案 0 :(得分:2)

我能找到解决此问题的唯一可靠方法是在创建和格式化卷时停止“Shell硬件检测”服务。然而,这种方法非常愚蠢,我拒绝将其纳入代码。

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

由于这个软件作为一个系统服务运行,我宁愿不使代码复杂化只在系统生命周期中发生过一次或两次的事情,我只是不得不接受有时会偶尔出现一个<创建分区时,会弹出“交互式服务检测”窗口片段。

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

答案 1 :(得分:0)

自从我使用这个API以来已经有一段时间了,但是从内存中你不能这样做。但是事实并没有阻止你removing the drive letter assignment

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

答案 2 :(得分:0)

我刚刚解决了这个问题,等待几秒钟让驱动器可用,然后直接发出格式化操作。请参阅我的回答here

答案 3 :(得分:0)

Rufus有一个有趣的解决方法:它安装一个窗口事件挂钩,用于检测&#34;您要格式化此驱动器吗?&#34;提示并立即关闭它们。 See source code here

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