Мой вариант использования следующий:
У меня есть готовый образ VHD, и мне нужно смонтировать его по пути к файлу. 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» мне нужно сделать, потому что я не нашел более простого способа выбрать правильный том (другие идеи заключались в проверке «lis vol» до Mount-VHD и после него … но да, у меня всегда есть только один раздел так что «sel par» ftw!)
Я нашел Microsoft Dev VHD Ссылка и может «Открыть» и «Присоединить» образ VHD через код пинвока C #. Я мог бы даже инициализировать его комбинацией CreateFile из kernel32.dll и DeviceIoControl с параметрами CREATE_DISK. Но я не нашел способа смонтировать его в путь к папке. Я пробовал SetVolumeMountPoint и GetVolumeNameForVolumeMountPoint из kernel32.dll, но Guid моего виртуального жесткого диска или VirtualDiskIdentifier, похоже, не являются правильными параметрами для этих функций.
Мой вопрос заключается в том, может ли кто-то указать мне правильные функции / методы для достижения того же результата, что и у меня с помощью скриптового решения, но в коде. В коде означает C / C ++ или C # … Я могу написать свои собственные C # -рапперы, если проще выполнить эту задачу на простом C или C ++.
SetVolumeMountPoint () потребует GUID подключенного тома; VirtualDiskIdentifier не будет работать здесь, так как это относительно диска.
Один из способов обойти это — дважды запустить цикл FindFirstVolume / FindNextVolume. Один раз перед креплением и один раз сразу после крепления. Разница между двумя результатами должна дать вам GUID подключенного тома.
Кроме того, если вы создаете виртуальный диск на основе GPT, вы можете напрямую передать «Уникальный идентификатор GUID раздела», который встроен в запись таблицы разделов GPT VHD-файла, который вы пытаетесь смонтировать. Значение: в Windows после монтирования диска GPT результирующий GUID тома будет таким же, как тот, который встроен в соответствующую запись таблицы разделов GPT VHD / LUN. Смотрите изображение ниже. Для этого вам нужно прочитать несколько блоков сырых VHD-файлов и выполнить некоторый анализ.