2

我正在尝试使用 VSS 快照作为 CreateVirtualDisk() 的源。环境/工具是 W7x64Ultimate 上的 C++ VS2008SP1 和 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 似乎没有太多示例代码。

谢谢++

杰瑞。

4

1 回答 1

0

杰瑞,

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

请参阅以下链接:“ http://code.msdn.microsoft.com/windowshardware/CppVhdAPI-4412d182

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

于 2013-03-04T08:42:28.537 回答