Как создать, разбить на разделы, отформатировать диск VHDX и назначить ему букву диска?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как создать, разбить на разделы, отформатировать диск VHDX и назначить ему букву диска?

Сообщение Anonymous »

Я пытаюсь программно создать VHD/VHDX и выполнить те же «шаги», которые показаны в следующем фрагменте vbscript, используя C++, WINAPI и без< /strong> на основе diskpart:
diskpartScriptPath = fso.GetSpecialFolder(2) & "\diskpart.txt"
Set file = fso.CreateTextFile(diskpartScriptPath, True)
file.WriteLine "select disk=0"
file.WriteLine "clean"
file.WriteLine "convert gpt"
file.WriteLine "create partition efi size=100"
file.WriteLine "format quick fs=fat32 label=""System""" ' EFI partition drive letter
file.WriteLine "create partition msr size=16"
file.WriteLine "create partition primary"
file.WriteLine "format quick fs=ntfs label=""Windows"""
file.WriteLine "assign letter C"

Мне удалось создать диск, подключить его, отформатировать, но когда я пытаюсь присвоить ему букву с помощью SetVolumeMountPointW, возникает ошибка:

0x57 Неверный параметр.

Создание диска с использованием CREATE_VIRTUAL_DISK_PARAMETERS Version1 работает, но когда я пробую версию 2, я всегда получаю:

ошибка: 0x00000057: параметр неверен.:

CREATE_VIRTUAL_DISK_PARAMETERS createParams = {};
createParams.Version = CREATE_VIRTUAL_DISK_VERSION_2;
createParams.Version2.UniqueId = GUID_NULL;
createParams.Version2.MaximumSize = sizeInBytes;
createParams.Version2.BlockSizeInBytes = 0; // Default block size
createParams.Version2.SectorSizeInBytes = 512; // Standard sector size
createParams.Version2.ParentPath = NULL;
createParams.Version2.SourcePath = NULL;
createParams.Version2.PhysicalSectorSizeInBytes = 4096;
createParams.Version2.OpenFlags = OPEN_VIRTUAL_DISK_FLAG_NONE;
createParams.Version2.ParentVirtualStorageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
createParams.Version2.ParentVirtualStorageType.VendorId = GUID_NULL;
createParams.Version2.SourceVirtualStorageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
createParams.Version2.SourceVirtualStorageType.VendorId = GUID_NULL;
createParams.Version2.ResiliencyGuid = GUID_NULL;

HANDLE diskHandle = INVALID_HANDLE_VALUE;
VIRTUAL_STORAGE_TYPE storageType =
{
VIRTUAL_STORAGE_TYPE_DEVICE_VHDX,
VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT
};

HRESULT hr = CreateVirtualDisk(
&storageType,
filePath.c_str(),
VIRTUAL_DISK_ACCESS_CREATE,
NULL,
CREATE_VIRTUAL_DISK_FLAG_NONE,
0,
&createParams,
NULL,
&diskHandle
);

Я хотел бы понять, почему он не работает в версии 2.
Код находится в стадии разработки, я полностью потерялся в разбиении на разделы часть, я имею в виду, как правильно создать все разделы
, аналогичные предыдущему упомянутому коду, с помощью diskpart.
Диск будет использоваться для развертывания настроенный образ Windows с помощью dism /apply-image перед применением его к виртуальная машина.
Следите за моей текущей реализацией с помощью этого вопроса.
#include
#include
#include
#include
#include
#pragma comment(lib, "virtdisk.lib")
#pragma comment(lib, "Ole32.lib")

#define GUID_NULL {0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}

class VHDXCreator
{
public:

static bool CreateVHDX(const std::wstring& filePath, ULONGLONG sizeInBytes)
{
CREATE_VIRTUAL_DISK_PARAMETERS createParams = {};
createParams.Version = CREATE_VIRTUAL_DISK_VERSION_2;
createParams.Version2.UniqueId = GUID_NULL;
createParams.Version2.MaximumSize = sizeInBytes;
createParams.Version2.BlockSizeInBytes = 0; // Default block size
createParams.Version2.SectorSizeInBytes = 512; // Standard sector size
createParams.Version2.ParentPath = NULL;
createParams.Version2.SourcePath = NULL;

createParams.Version2.PhysicalSectorSizeInBytes = 4096;
createParams.Version2.OpenFlags = OPEN_VIRTUAL_DISK_FLAG_NONE;
createParams.Version2.ParentVirtualStorageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
createParams.Version2.ParentVirtualStorageType.VendorId = GUID_NULL;
createParams.Version2.SourceVirtualStorageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
createParams.Version2.SourceVirtualStorageType.VendorId = GUID_NULL;
createParams.Version2.ResiliencyGuid = GUID_NULL;

// ----- Create the VHDX ----------

HANDLE diskHandle = INVALID_HANDLE_VALUE;
VIRTUAL_STORAGE_TYPE storageType =
{
VIRTUAL_STORAGE_TYPE_DEVICE_VHDX,
VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT
};

HRESULT hr = CreateVirtualDisk(
&storageType,
filePath.c_str(),
VIRTUAL_DISK_ACCESS_CREATE,
NULL,
CREATE_VIRTUAL_DISK_FLAG_NONE,
0,
&createParams,
NULL,
&diskHandle
);

CloseHandle(diskHandle);

if (hr != S_OK)
{
std::wcerr

Подробнее здесь: https://stackoverflow.com/questions/792 ... ive-letter
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Измените заглавную букву B в изображении svg, но сохраните букву B как букву для Google.
    Anonymous » » в форуме Jquery
    0 Ответы
    53 Просмотры
    Последнее сообщение Anonymous
  • Могу ли я запустить файл образа диска WSA (userdata.vhdx) на своей виртуальной машине Hyper-V?
    Anonymous » » в форуме Android
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Polars – заменить букву в строке на прописную букву.
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Polars – заменить букву в строке на прописную букву.
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Docker Desktop на Windows/WSL2-Grew Docker_Data.VHDX от 1 ТБ до 6 ТБ, но root FS внутри Docker-Desktop по-прежнему показ
    Anonymous » » в форуме Linux
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»