2011-06-26 16 views
2

CreateVirtualDisk()のソースとしてVSSスナップショットを使用しようとしています。環境/ツールはW7x64UltimateVirtualDisk APIを使用したVHDファイルの作成

上の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と異なる方法で失敗。パラメータは

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); 

"HarddiskVolumeShadowCopy64 \ \?\ GLOBALROOTの\デバイス" のルートパスで以下の任意のアイデアですか?仮想ディスクAPIは多くのサンプルコードを持っていないようです。

thx ++

Jerry。

+0

、あなたが移動する必要があります。

は、以下のリンクを参照してください。下の新しい答えにそれを受け入れて受け入れてください。 – BoltClock

+0

ありがとうございます。しましょう。 –

答えて

0

ジェリー、

使用CreateVirtualDisk API uは右のパラメータを送信してください、VHDや差分VHDを作成します。親ハードディスクを指定する必要がありますが、ソースハードディスクは指定しないでください。フラグを使用している間は注意が必要です。 「http://code.msdn.microsoft.com/windowshardware/CppVhdAPI-4412d182

http://code.msdn.microsoft.com/windowsdesktop/Virtual-hard-disk-03108ed3」あなたはあなたの質問に追加されたコードが実際に質問に答えるか、あなたが持っていた問題が解決した場合

関連する問題