c++ - 使用 VirtualDisk API 创建 VHD 文件

标签 c++ winapi windows-7 virtual-disk

我正在尝试使用 VSS 快照作为 CreateVirtualDisk() 的源。环境/工具是 C++ VS2008SP1 和 W7x64Ultimate 上的 7.1 SDK

[已编辑]

这适用于 Windows 7 x64

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, 
        &params, 
        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;
}

[已编辑] - 现在以 ERROR_INVALID_PARAMETER 的不同方式失败。参数如下,根路径为“\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy64”

    VIRTUAL_STORAGE_TYPE storageType =
    {
        VIRTUAL_STORAGE_TYPE_DEVICE_VHD,
        // do not use any other GUID else you get an unknown provider error
        VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT // **critical!**
    };

    VIRTUAL_DISK_ACCESS_MASK vdam = (VIRTUAL_DISK_ACCESS_MASK)(VIRTUAL_DISK_ACCESS_CREATE); // |VIRTUAL_DISK_ACCESS_WRITABLE|VIRTUAL_DISK_ACCESS_READ|VIRTUAL_DISK_ACCESS_GET_INFO);
    CREATE_VIRTUAL_DISK_FLAG flags = CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION; // CREATE_VIRTUAL_DISK_FLAG_NONE;
    CREATE_VIRTUAL_DISK_PARAMETERS parameters;
    //
    parameters.Version = CREATE_VIRTUAL_DISK_VERSION_1;
    parameters.Version1.UniqueId = GUID_NULL;
    parameters.Version1.MaximumSize = 0;
    parameters.Version1.BlockSizeInBytes = CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_BLOCK_SIZE;
    parameters.Version1.ParentPath = 0;
    parameters.Version1.SourcePath = root.c_str();
    parameters.Version1.SectorSizeInBytes = CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_SECTOR_SIZE;
    ULONG ProviderSpecificFlags = 0;

HANDLE handle = 0;
dwRet = CreateVirtualDisk(&storageType,
_T("t:\\test.vhd"),
vdam,
NULL,
flags,
ProviderSpecificFlags,
&parameters,0,&handle);

有什么想法吗?虚拟磁盘API似乎没有太多示例代码。

感谢++

杰瑞。

最佳答案

杰瑞,

使用 CreateVirtualDisk API 创建 VHD 或差异 VHD,确保您发送正确的参数。您必须指定父硬盘而不是源硬盘。使用标志时也必须小心。

引用以下链接: "http://code.msdn.microsoft.com/windowshardware/CppVhdAPI-4412d182 "

"http://code.msdn.microsoft.com/windowsdesktop/Virtual-hard-disk-03108ed3 "

关于c++ - 使用 VirtualDisk API 创建 VHD 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6485579/

相关文章:

c++ - 使用 Apache Thrift 使用 HTTP 协议(protocol)实现服务器/客户端

c++ - 如何知道是否有任何可供安装的 Windows 操作系统更新?

visual-studio-2010 - 在 Windows 7 中更改程序文件的默认位置

c++ - 如何进行 size_t 乘法

c++ - std::string 复制构造函数是否自行在末尾添加空字符?

c++ - 禁用特定进程的注册表访问 (WinAPI)

c# - Win 7 在没有 qtcore4.dll 的情况下 Winforms 崩溃

mysql 年份低于 1900

c++ - 在 C++ 中,是否定义了通过 char* 删除基本类型(例如 uint32_t)的行为?

c++ - 如何将 HRESULT 转换为错误描述?