gpt4 book ai didi

c# - 打开、附加和分配 VHD

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:25 27 4
gpt4 key购买 nike

我的用例如下:我有一个现成的 vhd 镜像,需要将其安装到路径 f.e. D:\vhd\事件。目前我的解决方案是 Powershell Hyper-V 和 diskpart 命令的组合,但这看起来非常肮脏和被黑客攻击:

Mount-VHD -Path D:\vhd-file.vhd -NoDriveLetter 
diskpart> select vdisk file="D:\vhd-file.vhd"
diskpart> sel par 1
diskpart> assign mount="D:\vhd\active

如您所见,我使用了“NoDriveLetter”,因为我不想自动分配。我必须执行“sel par 1”,因为我发现没有更简单的方法来选择正确的卷(其他想法是在 Mount-VHD 之前和之后检查“lis vol”......但是,是的,我总是只有一个分区所以“sel par”ftw!)

我找到了Microsoft Dev VHD Reference并可以通过 C# pinvoke 代码“打开”和“附加”VHD 镜像。我什至可以使用 kernel32.dll 中的 CreateFile 和带有 CREATE_DISK 参数的 DeviceIoControl 的组合来初始化它。但我发现没有办法将其挂载到文件夹路径。我尝试了 kernel32.dll 中的 SetVolumeMountPoint 和 GetVolumeNameForVolumeMountPoint,但我的 VHD 的 Guid 或 VirtualDiskIdentifier 似乎不是这些函数的正确参数。

我的问题是,是否有人可以向我指出正确的函数/方法来实现与我使用脚本解决方案但在代码中获得的相同结果。在代码中意味着 C/C++ 或 C# ...如果用纯 C 或 C++ 更容易完成此任务,我可以编写自己的 C# 包装器。

最佳答案

SetVolumeMountPoint() 需要已安装卷的 GUID; VirtualDiskIdentifier 在这里不起作用,因为它是相对于磁盘的。

解决此问题的一种方法是运行 FindFirstVolume/FindNextVolume 循环两次。一次,在安装之前,一次在安装之后。两个结果之间的差异应该为您提供已安装卷的 GUID。

此外,如果您要创建基于 GPT 的虚拟磁盘,则可以直接传递嵌入在您尝试挂载的 vhd 文件的 GPT 分区表条目中的“唯一分区 GUID”。含义:在 Windows 上,安装 GPT 磁盘后,生成的卷 GUID 与 VHD/LUN 的相应 GPT 分区表条目中嵌入的卷 GUID 相同。请参见下图。为此,您必须读取一些原始 VHD 文件 block 并进行一些解析。 mountvol output - embedded PTE unique GUID comparision

关于c# - 打开、附加和分配 VHD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31849488/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com