Я пытаюсь программно создать 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
Как создать, разбить на разделы, отформатировать диск VHDX и назначить ему букву диска? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Измените заглавную букву B в изображении svg, но сохраните букву B как букву для Google.
Anonymous » » в форуме Jquery - 0 Ответы
- 53 Просмотры
-
Последнее сообщение Anonymous
-