Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
C

cazorla19

@cazorla19
About
Posts
5
Topics
1
Shares
0
Groups
0
Followers
0
Following
0

Posts

Recent Best Controversial

  • How to get allocated blocks for VHDx? queryChangesVirtualDisk gives ACCESS DENIED.
    C cazorla19

    Yes, I am trying to read the change tracking information when the Virtual machine is online.

    C / C++ / MFC database help tutorial question announcement

  • How to get allocated blocks for VHDx? queryChangesVirtualDisk gives ACCESS DENIED.
    C cazorla19

    Many thanks for your inputs. Tried your sample code in my environment, OpenVirtualDisk failed with 32 ERROR_SHARING_VIOLATION. Steps I have followed till now, 1. Create a production snapshot on the VM. 2. Convert the snapshot to the reference point(snapshot gets merged automatically) using wmi commands. 3. Added some files to VM disk. 4. Create another production snapshot on the VM so that any changes in VM will be written to avhdx file. 5. Try to open the parent vhdx using VHD APIs. 6. Get a resilient change tracking identifier using ChangeTrackingState.MostRecentId 7. Query for changed areas using VHD API QueryChangesVirtualDisk. So far I am able to get till step six by passing only VIRTUAL_DISK_ACCESS_GET_INFO flag for OpenVirtualDisk. step 7 gives ACCESS_DENIED.

    void openDiskEx()
    {
    HANDLE vhdHandle = NULL;
    VIRTUAL_STORAGE_TYPE storageType = {};
    ULONG status = 0L;

    storageType.DeviceId = VIRTUAL\_STORAGE\_TYPE\_DEVICE\_UNKNOWN;
    storageType.VendorId = VIRTUAL\_STORAGE\_TYPE\_VENDOR\_UNKNOWN;
    
    PCWSTR virtualDiskPath = L"C:\\\\Hyper-V\\\\Virtual Hard Disks\\\\Lacazette\\\\Windows2016.vhdx";
    
    OPEN\_VIRTUAL\_DISK\_PARAMETERS\* pOpenParameter = NULL;
    
    status = OpenVirtualDisk(&storageType, virtualDiskPath, VIRTUAL\_DISK\_ACCESS\_ATTACH\_RW | VIRTUAL\_DISK\_ACCESS\_GET\_INFO | VIRTUAL\_DISK\_ACCESS\_DETACH, OPEN\_VIRTUAL\_DISK\_FLAG\_NONE, pOpenParameter, &vhdHandle);
    std::cout << "opendisk:" << status<< std::endl;
    if (ERROR\_SUCCESS == status)
    {
        DWORD sizeUsed = GET\_VIRTUAL\_DISK\_INFO\_SIZE;
        WCHAR changeTrackingInfo\[sizeof(GET\_VIRTUAL\_DISK\_INFO) + sizeof(GUID)\];
        ::ZeroMemory(changeTrackingInfo, sizeof(changeTrackingInfo));
        PGET\_VIRTUAL\_DISK\_INFO virtualDiskInfo = (GET\_VIRTUAL\_DISK\_INFO\*)changeTrackingInfo;
        virtualDiskInfo->Version = (GET\_VIRTUAL\_DISK\_INFO\_VERSION)GET\_VIRTUAL\_DISK\_INFO\_CHANGE\_TRACKING\_STATE;
        ULONG virtualDiskInfoSize = sizeof(changeTrackingInfo);
    
        status = GetVirtualDiskInformation(vhdHandle, &virtualDiskInfoSize, virtualDiskInfo, &sizeUsed);
        std::cout << "GetVirtualDiskInformation:" << status << std::endl;
        if (ERROR\_SUCCESS == status)
        {
            ULONG64 virtualDiskSize = virtualDiskInfo->Size.VirtualSize;
            printf("Disk Infomation:\\n");
            GUID virtualDiskGuid = virtualDiskInfo->Identifier;
            wchar\_t szGUID\[64\] = { 0 };
            StringFromGUID2(virtualDiskGuid, szGUID, 64);
            wprintf(L"ChangeTrackingState.Enabled:%d
    
    C / C++ / MFC database help tutorial question announcement

  • How to get allocated blocks for VHDx? queryChangesVirtualDisk gives ACCESS DENIED.
    C cazorla19

    Hi Gerry, I am trying in a Windows2016 hyperV, and guest VM has windows 10. Also, I am able to get changed blocks by using WMI queries. But VHD API is giving ACCESS_DENIED_ERROR. Regards, Hari

    C / C++ / MFC database help tutorial question announcement

  • How to get allocated blocks for VHDx? queryChangesVirtualDisk gives ACCESS DENIED.
    C cazorla19

    Hi David, I have tried OpenVirtualDisk with VIRTUAL_DISK_ACCESS_GET_INFO as suggested in msdn portal. I also tried with VIRTUAL_DISK_ACCESS_READ, both times I got same error.

    OPEN\_VIRTUAL\_DISK\_PARAMETERS openParameters;
    openParameters.Version = OPEN\_VIRTUAL\_DISK\_VERSION\_1;
    openParameters.Version1.RWDepth = OPEN\_VIRTUAL\_DISK\_RW\_DEPTH\_DEFAULT;
    \_VIRTUAL\_STORAGE\_TYPE storageType;
    storageType.DeviceId = VIRTUAL\_STORAGE\_TYPE\_DEVICE\_UNKNOWN;
    storageType.VendorId = VIRTUAL\_STORAGE\_TYPE\_VENDOR\_UNKNOWN;
    

    DWORD res = OpenVirtualDisk(&storageType, path,
    VIRTUAL_DISK_ACCESS_GET_INFO,
    OPEN_VIRTUAL_DISK_FLAG_NONE,
    &openParameters,
    &vhdHandle);

    Also, I changed diskInfoSize as suggested but still got the same 'insufficient buffer size' error.

    ULONG diskInfoSize = sizeof(GET_VIRTUAL_DISK_INFO) + sizeof(GUID);

    Increasing the diskinfo size definitely helped me in getting rct id using GetVirtualDiskInformation,

    WCHAR changeTrackingInfo\[2048\];
    ZeroMemory(changeTrackingInfo, sizeof(changeTrackingInfo));
    
    PGET\_VIRTUAL\_DISK\_INFO diskInfo;
    ULONG diskInfoSize = sizeof(GET\_VIRTUAL\_DISK\_INFO) + sizeof(changeTrackingInfo);
    

    queryChangesVirtualDisk gives ACCESS DENIED is not resolved. Regards, Hari

    C / C++ / MFC database help tutorial question announcement

  • How to get allocated blocks for VHDx? queryChangesVirtualDisk gives ACCESS DENIED.
    C cazorla19

    I am trying out VirtualDisk APIs, So far I am able to Open a VHDX file, get some of the properties by using GetVirtualDiskInformation. But I am not able to get RCT information and ChangedAreas. 1)Opendisk is done with VIRTUAL_DISK_ACCESS_GET_INFO flag. 2)GetVirtualDiskInformation a. Works fine when version flag is set to GET_VIRTUAL_DISK_INFO_SIZE, able to fetch sector size and other information b. Gives ERROR_INSUFFICIENT_BUFFER(122) when version flag is set to GET_VIRTUAL_DISK_INFO_CHANGE_TRACKING_STATE to access diskInfo->ChangeTrackingState.MostRecentId

    PGET\_VIRTUAL\_DISK\_INFO diskInfo;
    ULONG diskInfoSize = sizeof(GET\_VIRTUAL\_DISK\_INFO);
    std::wcout << "size of diskinfo structure " << diskInfoSize << std::endl;
    diskInfo = (PGET\_VIRTUAL\_DISK\_INFO)malloc(diskInfoSize);
    
    diskInfo->Version = GET\_VIRTUAL\_DISK\_INFO\_SIZE;
    
    res = GetVirtualDiskInformation(vhdHandle, &diskInfoSize, diskInfo, NULL);
    long physicalSize = diskInfo->Size.PhysicalSize;
    long virtualSize = diskInfo->Size.VirtualSize;
    long sectorSize = diskInfo->Size.SectorSize;
    long blockSize = diskInfo->Size.BlockSize;
    std::wcout << "physicalSize :" << physicalSize << std::endl;
    std::wcout << "virtualSize :" << virtualSize << std::endl;
    std::wcout << "sectorSize :" << sectorSize << std::endl;
    std::wcout << "blockSize :" << blockSize << std::endl;
    
    diskInfo->Version = GET\_VIRTUAL\_DISK\_INFO\_CHANGE\_TRACKING\_STATE;
    
    res = GetVirtualDiskInformation(vhdHandle, &diskInfoSize, diskInfo, NULL);
    std::wcout << "\\nrct id:" << diskInfo->ChangeTrackingState.MostRecentId << std::endl;
    

    3)queryChangesVirtualDisk gives ACCESS DENIED.

    ULONG64   byteOffset = 0L;
    ULONG64   byteLength = 19327352832;
    QUERY\_CHANGES\_VIRTUAL\_DISK\_RANGE\* changedAreas = NULL;
    ULONG     rangeCount = 0L;
    ULONG64   processedLength = 0L;
    res = QueryChangesVirtualDisk(vhdHandle, "rctX:c2eb01d9:ccb1:405d:acb6:f0e76d055906:00000001", 
        byteOffset, byteLength,
        QUERY\_CHANGES\_VIRTUAL\_DISK\_FLAG\_NONE,
        changedAreas, &rangeCount, &processedLength);
    

    Can someone please give some ideas on what I am doing wrong?

    C / C++ / MFC database help tutorial question announcement
  • Login

  • Don't have an account? Register

  • Login or register to search.
  • First post
    Last post
0
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups