Jus*_*ᚄᚒᚔ 8 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);
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能防止自动驱动器号分配?
我能找到解决此问题的唯一可靠方法是在创建和格式化卷时停止“Shell 硬件检测”服务。然而,这种方法实在是太愚蠢了,以至于我拒绝将其放入代码中。
另一个“hackish”选项是让服务启动,然后通过该CreateProcess()标志立即在隐藏窗口中生成自身(或“worker”可执行文件) CREATE_NO_WINDOW。
由于该软件作为系统服务运行,并且我不想使代码复杂化,因为在系统的生命周期中只发生一两次的事情,我不得不接受有时偶尔会出现交互式服务检测窗口创建分区时会弹出一段时间。
如果有人发现了一种在以编程方式创建和格式化驱动器时防止出现格式提示的好方法,我将很乐意更改已接受的答案(并欠您一杯啤酒)。
| 归档时间: |
|
| 查看次数: |
3028 次 |
| 最近记录: |