2011-06-26 36 views
2

我试图使用VSS快照作为CreateVirtualDisk()的源。环境/工具是C++ VS2008SP1和7.1 SDK上W7x64Ultimate使用VirtualDisk API创建VHD文件

[编辑]

这适用于Windows 7 64位

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 \设备\ 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 ++

杰里。

+0

如果您添加到您问题的代码实际上回答了这个问题还是可以解决你有问题,你应该将将其转换为下面的新答案并将其标记为已接受。 – BoltClock

+0

谢谢。会做。 –

回答