使用VirtualDisk API创建VHD文件

时间:2011-06-26 17:38:05

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

我正在尝试使用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似乎没有太多示例代码。

THX ++

杰里。

1 个答案:

答案 0 :(得分:0)

杰里,

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

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

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