BOOL CreateVHD_Fixed(PCWSTR pszVhdPath, ULONG sizeInMB) { BOOL bRet = FALSE; HANDLE hvhd; CREATE_VIRTUAL_DISK_PARAMETERS params; VIRTUAL_DISK_ACCESS_MASK mask; VIRTUAL_STORAGE_TYPE vst = { VIRTUAL_STORAGE_TYPE_DEVICE_VHD, VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT }; wprintf(L"CreateVHD_Fixed %s, size (MB) %d\n", pszVhdPath, sizeInMB); params.Version1.UniqueId = GUID_NULL; params.Version1.BlockSizeInBytes = 0; params.Version1.MaximumSize = sizeInMB * 1024 * 1024; params.Version1.ParentPath = NULL; params.Version1.SourcePath = NULL; params.Version1.SectorSizeInBytes = 512; params.Version = CREATE_VIRTUAL_DISK_VERSION_1; mask = VIRTUAL_DISK_ACCESS_CREATE; DWORD ret = CreateVirtualDisk(&vst, pszVhdPath, mask, NULL, // To create a dynamic disk, use CREATE_VIRTUAL_DISK_FLAG_NONE instead. CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION, 0, ¶ms, NULL, &hvhd); if (ret == ERROR_SUCCESS) { bRet = TRUE; } else { bRet = FALSE; printf("failed to create vdisk...err 0x%x\n", ret); PrintErrorMessage(GetLastError()); } if (INVALID_HANDLE_VALUE != hvhd) { CloseHandle(hvhd); } return bRet; }
DWORD SampleCreateVirtualDisk( _In_ LPCWSTR VirtualDiskPath, _In_opt_ LPCWSTR ParentPath, _In_ CREATE_VIRTUAL_DISK_FLAG Flags, _In_ ULONGLONG FileSize, _In_ DWORD BlockSize, _In_ DWORD LogicalSectorSize, _In_ DWORD PhysicalSectorSize) { VIRTUAL_STORAGE_TYPE storageType; CREATE_VIRTUAL_DISK_PARAMETERS parameters; HANDLE vhdHandle = INVALID_HANDLE_VALUE; DWORD opStatus; GUID uniqueId; if (RPC_S_OK != UuidCreate((UUID*)&uniqueId)) { opStatus = ERROR_NOT_ENOUGH_MEMORY; goto Cleanup; } // // Specify UNKNOWN for both device and vendor so the system will use the // file extension to determine the correct VHD format. // storageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN; storageType.VendorId = VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN; memset(¶meters, 0, sizeof(parameters)); // // CREATE_VIRTUAL_DISK_VERSION_2 allows specifying a richer set a values and returns // a V2 handle. // // VIRTUAL_DISK_ACCESS_NONE is the only acceptable access mask for V2 handle opens. // // Valid BlockSize values are as follows (use 0 to indicate default value): // Fixed VHD: 0 // Dynamic VHD: 512kb, 2mb (default) // Differencing VHD: 512kb, 2mb (if parent is fixed, default is 2mb; if parent is dynamic or differencing, default is parent blocksize) // Fixed VHDX: 0 // Dynamic VHDX: 1mb, 2mb, 4mb, 8mb, 16mb, 32mb (default), 64mb, 128mb, 256mb // Differencing VHDX: 1mb, 2mb (default), 4mb, 8mb, 16mb, 32mb, 64mb, 128mb, 256mb // // Valid LogicalSectorSize values are as follows (use 0 to indicate default value): // VHD: 512 (default) // VHDX: 512 (for fixed or dynamic, default is 512; for differencing, default is parent logicalsectorsize), 4096 // // Valid PhysicalSectorSize values are as follows (use 0 to indicate default value): // VHD: 512 (default) // VHDX: 512, 4096 (for fixed or dynamic, default is 4096; for differencing, default is parent physicalsectorsize) // parameters.Version = CREATE_VIRTUAL_DISK_VERSION_2; parameters.Version2.UniqueId = uniqueId; parameters.Version2.MaximumSize = FileSize; parameters.Version2.BlockSizeInBytes = BlockSize; parameters.Version2.SectorSizeInBytes = LogicalSectorSize; parameters.Version2.PhysicalSectorSizeInBytes = PhysicalSectorSize; parameters.Version2.ParentPath = ParentPath; opStatus = CreateVirtualDisk( &storageType, VirtualDiskPath, VIRTUAL_DISK_ACCESS_NONE, NULL, Flags, 0, ¶meters, NULL, &vhdHandle); if (opStatus != ERROR_SUCCESS) { goto Cleanup; } Cleanup: if (opStatus == ERROR_SUCCESS) { wprintf(L"success\n"); } else { wprintf(L"error = %u\n", opStatus); } if (vhdHandle != INVALID_HANDLE_VALUE) { CloseHandle(vhdHandle); } return opStatus; }