2

我的用例如下:我有一个现成的 vhd 映像,需要将其挂载到路径 fe D:\vhd\active。目前,我的解决方案是 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 或 VirtualDiskIdentifier 的 Guid 似乎不是这些函数的正确参数。

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

4

1 回答 1

0

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

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

此外,如果您正在创建基于 GPT 的虚拟磁盘,那么您可以直接传递嵌入在您尝试挂载的 vhd 文件的 GPT 分区表条目中的“唯一分区 GUID”。含义:在 Windows 上,挂载 GPT 磁盘后,生成的卷 GUID 与嵌入在 VHD/LUN 的相应 GPT 分区表条目中的卷 GUID 相同。见下图。为此,您必须读取几个原始 VHD 文件块并进行一些解析。 mountvol 输出 - 嵌入式 PTE 唯一 GUID 比较

于 2018-01-27T11:34:23.250 回答