Changeset 66486 in vbox for trunk/src/VBox/Storage
- Timestamp:
- Apr 10, 2017 7:23:59 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 114481
- Location:
- trunk/src/VBox/Storage
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Storage/CUE.cpp
r66211 r66486 1590 1590 } 1591 1591 1592 /** @copydoc VDIMAGEBACKEND::pfnGetSectorSize */1593 static DECLCALLBACK(uint32_t) cueGetSectorSize(void *pBackendData)1594 {1595 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1596 PCUEIMAGE pThis = (PCUEIMAGE)pBackendData;1597 uint32_t cb = 0;1598 1599 AssertPtrReturn(pThis, 0);1600 1601 LogFlowFunc(("returns %u\n", cb));1602 return cb;1603 }1604 1605 /** @copydoc VDIMAGEBACKEND::pfnGetSize */1606 static DECLCALLBACK(uint64_t) cueGetSize(void *pBackendData)1607 {1608 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1609 PCUEIMAGE pThis = (PCUEIMAGE)pBackendData;1610 1611 AssertPtrReturn(pThis, 0);1612 1613 PCVDREGIONDESC pRegion = &pThis->pRegionList->aRegions[pThis->pRegionList->cRegions - 1];1614 uint64_t cb = pRegion->offRegion + pRegion->cRegionBlocksOrBytes;1615 1616 LogFlowFunc(("returns %llu\n", cb));1617 return cb;1618 }1619 1620 1592 /** @copydoc VDIMAGEBACKEND::pfnGetFileSize */ 1621 1593 static DECLCALLBACK(uint64_t) cueGetFileSize(void *pBackendData) … … 2015 1987 /* pfnGetVersion */ 2016 1988 cueGetVersion, 2017 /* pfnGetSectorSize */2018 cueGetSectorSize,2019 /* pfnGetSize */2020 cueGetSize,2021 1989 /* pfnGetFileSize */ 2022 1990 cueGetFileSize, -
trunk/src/VBox/Storage/DMG.cpp
r66212 r66486 371 371 /** Size of the buffer. */ 372 372 size_t cbDecompExtent; 373 /** The static region list. */ 374 VDREGIONLIST RegionList; 373 375 } DMGIMAGE; 374 376 /** Pointer to an instance of the DMG Image Interpreter. */ … … 1717 1719 RTMemFree(pszXml); 1718 1720 1719 if (RT_FAILURE(rc)) 1721 if (RT_SUCCESS(rc)) 1722 { 1723 PVDREGIONDESC pRegion = &pThis->RegionList.aRegions[0]; 1724 pThis->RegionList.fFlags = 0; 1725 pThis->RegionList.cRegions = 1; 1726 1727 pRegion->offRegion = 0; /* Disk start. */ 1728 pRegion->cbBlock = 2048; 1729 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 1730 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 1731 pRegion->cbData = 2048; 1732 pRegion->cbMetadata = 0; 1733 pRegion->cRegionBlocksOrBytes = pThis->cbSize; 1734 } 1735 else 1720 1736 dmgFreeImage(pThis, false); 1721 1737 return rc; … … 1855 1871 */ 1856 1872 int rc = VERR_NO_MEMORY; 1857 PDMGIMAGE pThis = (PDMGIMAGE)RTMemAllocZ( sizeof(*pThis));1873 PDMGIMAGE pThis = (PDMGIMAGE)RTMemAllocZ(RT_UOFFSETOF(DMGIMAGE, RegionList.aRegions[1])); 1858 1874 if (pThis) 1859 1875 { … … 2057 2073 } 2058 2074 2059 /** @interface_method_impl{VDIMAGEBACKEND,pfnGetSectorSize} */2060 static DECLCALLBACK(uint32_t) dmgGetSectorSize(void *pBackendData)2061 {2062 LogFlowFunc(("pBackendData=%#p\n", pBackendData));2063 PDMGIMAGE pThis = (PDMGIMAGE)pBackendData;2064 2065 AssertPtrReturn(pThis, 0);2066 2067 uint32_t cb = 0;2068 if (pThis->pStorage || pThis->hDmgFileInXar != NIL_RTVFSFILE)2069 cb = 2048;2070 2071 LogFlowFunc(("returns %u\n", cb));2072 return cb;2073 }2074 2075 /** @interface_method_impl{VDIMAGEBACKEND,pfnGetSize} */2076 static DECLCALLBACK(uint64_t) dmgGetSize(void *pBackendData)2077 {2078 LogFlowFunc(("pBackendData=%#p\n", pBackendData));2079 PDMGIMAGE pThis = (PDMGIMAGE)pBackendData;2080 2081 AssertPtrReturn(pThis, 0);2082 2083 uint64_t cb = 0;2084 if (pThis->pStorage || pThis->hDmgFileInXar != NIL_RTVFSFILE)2085 cb = pThis->cbSize;2086 2087 LogFlowFunc(("returns %llu\n", cb));2088 return cb;2089 }2090 2091 2075 /** @interface_method_impl{VDIMAGEBACKEND,pfnGetFileSize} */ 2092 2076 static DECLCALLBACK(uint64_t) dmgGetFileSize(void *pBackendData) … … 2181 2165 LogFlowFunc(("returns %Rrc\n", rc)); 2182 2166 return rc; 2167 } 2168 2169 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 2170 static DECLCALLBACK(int) dmgQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 2171 { 2172 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 2173 PDMGIMAGE pThis = (PDMGIMAGE)pBackendData; 2174 2175 AssertPtrReturn(pThis, VERR_VD_NOT_OPENED); 2176 2177 *ppRegionList = &pThis->RegionList; 2178 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 2179 return VINF_SUCCESS; 2180 } 2181 2182 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 2183 static DECLCALLBACK(void) dmgRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 2184 { 2185 RT_NOREF1(pRegionList); 2186 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 2187 PDMGIMAGE pThis = (PDMGIMAGE)pBackendData; 2188 AssertPtr(pThis); RT_NOREF(pThis); 2189 2190 /* Nothing to do here. */ 2183 2191 } 2184 2192 … … 2441 2449 /* pfnGetVersion */ 2442 2450 dmgGetVersion, 2443 /* pfnGetSectorSize */2444 dmgGetSectorSize,2445 /* pfnGetSize */2446 dmgGetSize,2447 2451 /* pfnGetFileSize */ 2448 2452 dmgGetFileSize, … … 2456 2460 dmgSetLCHSGeometry, 2457 2461 /* pfnQueryRegions */ 2458 NULL,2462 dmgQueryRegions, 2459 2463 /* pfnRegionListRelease */ 2460 NULL,2464 dmgRegionListRelease, 2461 2465 /* pfnGetImageFlags */ 2462 2466 dmgGetImageFlags, -
trunk/src/VBox/Storage/ISCSI.cpp
r66110 r66486 620 620 /** Release log counter. */ 621 621 unsigned cLogRelErrors; 622 /** The static region list. */ 623 VDREGIONLIST RegionList; 622 624 } ISCSIIMAGE; 623 625 … … 4684 4686 } 4685 4687 4686 if (RT_FAILURE(rc)) 4688 if (RT_SUCCESS(rc)) 4689 { 4690 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 4691 pImage->RegionList.fFlags = 0; 4692 pImage->RegionList.cRegions = 1; 4693 4694 pRegion->offRegion = 0; /* Disk start. */ 4695 pRegion->cbBlock = pImage->cbSector; 4696 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 4697 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 4698 pRegion->cbData = pImage->cbSector; 4699 pRegion->cbMetadata = 0; 4700 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 4701 } 4702 else 4687 4703 iscsiFreeImage(pImage, false); 4688 4704 return rc; … … 4720 4736 AssertReturn((VALID_PTR(pszFilename) && *pszFilename), VERR_INVALID_PARAMETER); 4721 4737 4722 PISCSIIMAGE pImage = (PISCSIIMAGE)RTMemAllocZ( sizeof(ISCSIIMAGE));4738 PISCSIIMAGE pImage = (PISCSIIMAGE)RTMemAllocZ(RT_UOFFSETOF(ISCSIIMAGE, RegionList.aRegions[1])); 4723 4739 if (RT_LIKELY(pImage)) 4724 4740 { … … 5113 5129 } 5114 5130 5115 /** @copydoc VDIMAGEBACKEND::pfnGetSectorSize */5116 static DECLCALLBACK(uint32_t) iscsiGetSectorSize(void *pBackendData)5117 {5118 LogFlowFunc(("pBackendData=%#p\n", pBackendData));5119 PISCSIIMAGE pImage = (PISCSIIMAGE)pBackendData;5120 5121 AssertPtrReturn(pImage, 0);5122 5123 return pImage->cbSector;5124 }5125 5126 /** @copydoc VDIMAGEBACKEND::pfnGetSize */5127 static DECLCALLBACK(uint64_t) iscsiGetSize(void *pBackendData)5128 {5129 LogFlowFunc(("pBackendData=%#p\n", pBackendData));5130 PISCSIIMAGE pImage = (PISCSIIMAGE)pBackendData;5131 5132 AssertPtrReturn(pImage, 0);5133 5134 return pImage->cbSize;5135 }5136 5137 5131 /** @copydoc VDIMAGEBACKEND::pfnGetFileSize */ 5138 5132 static DECLCALLBACK(uint64_t) iscsiGetFileSize(void *pBackendData) … … 5210 5204 LogFlowFunc(("returns %Rrc\n", rc)); 5211 5205 return rc; 5206 } 5207 5208 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 5209 static DECLCALLBACK(int) iscsiQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 5210 { 5211 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 5212 PISCSIIMAGE pImage = (PISCSIIMAGE)pBackendData; 5213 5214 AssertPtrReturn(pImage, VERR_VD_NOT_OPENED); 5215 5216 *ppRegionList = &pImage->RegionList; 5217 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 5218 return VINF_SUCCESS; 5219 } 5220 5221 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 5222 static DECLCALLBACK(void) iscsiRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 5223 { 5224 RT_NOREF1(pRegionList); 5225 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 5226 PISCSIIMAGE pImage = (PISCSIIMAGE)pBackendData; 5227 AssertPtr(pImage); RT_NOREF(pImage); 5228 5229 /* Nothing to do here. */ 5212 5230 } 5213 5231 … … 5528 5546 /* pfnGetVersion */ 5529 5547 iscsiGetVersion, 5530 /* pfnGetSectorSize */5531 iscsiGetSectorSize,5532 /* pfnGetSize */5533 iscsiGetSize,5534 5548 /* pfnGetFileSize */ 5535 5549 iscsiGetFileSize, … … 5543 5557 iscsiSetLCHSGeometry, 5544 5558 /* pfnQueryRegions */ 5545 NULL,5559 iscsiQueryRegions, 5546 5560 /* pfnRegionListRelease */ 5547 NULL,5561 iscsiRegionListRelease, 5548 5562 /* pfnGetImageFlags */ 5549 5563 iscsiGetImageFlags, -
trunk/src/VBox/Storage/Parallels.cpp
r66110 r66486 96 96 /** Current file size. */ 97 97 uint64_t cbFileCurrent; 98 /** The static region list. */ 99 VDREGIONLIST RegionList; 98 100 } PARALLELSIMAGE, *PPARALLELSIMAGE; 99 101 … … 248 250 } 249 251 252 if (RT_SUCCESS(rc)) 253 { 254 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 255 pImage->RegionList.fFlags = 0; 256 pImage->RegionList.cRegions = 1; 257 258 pRegion->offRegion = 0; /* Disk start. */ 259 pRegion->cbBlock = 512; 260 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 261 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 262 pRegion->cbData = 512; 263 pRegion->cbMetadata = 0; 264 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 265 } 266 250 267 LogFlowFunc(("returns %Rrc\n", rc)); 251 268 return rc; … … 336 353 pfnProgress(pvUser, uPercentStart + uPercentSpan); 337 354 338 if (RT_FAILURE(rc)) 355 if (RT_SUCCESS(rc)) 356 { 357 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 358 pImage->RegionList.fFlags = 0; 359 pImage->RegionList.cRegions = 1; 360 361 pRegion->offRegion = 0; /* Disk start. */ 362 pRegion->cbBlock = 512; 363 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 364 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 365 pRegion->cbData = 512; 366 pRegion->cbMetadata = 0; 367 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 368 } 369 else 339 370 parallelsFreeImage(pImage, rc != VERR_ALREADY_EXISTS); 340 371 return rc; … … 417 448 AssertReturn(VALID_PTR(pszFilename) && *pszFilename, VERR_INVALID_PARAMETER); 418 449 419 pImage = (PPARALLELSIMAGE)RTMemAllocZ( sizeof(PARALLELSIMAGE));450 pImage = (PPARALLELSIMAGE)RTMemAllocZ(RT_UOFFSETOF(PARALLELSIMAGE, RegionList.aRegions[1])); 420 451 if (RT_LIKELY(pImage)) 421 452 { … … 476 507 } 477 508 478 pImage = (PPARALLELSIMAGE)RTMemAllocZ( sizeof(PARALLELSIMAGE));509 pImage = (PPARALLELSIMAGE)RTMemAllocZ(RT_UOFFSETOF(PARALLELSIMAGE, RegionList.aRegions[1])); 479 510 if (RT_LIKELY(pImage)) 480 511 { … … 715 746 } 716 747 717 /** @copydoc VDIMAGEBACKEND::pfnGetSectorSize */718 static DECLCALLBACK(uint32_t) parallelsGetSectorSize(void *pBackendData)719 {720 LogFlowFunc(("pBackendData=%#p\n", pBackendData));721 PPARALLELSIMAGE pImage = (PPARALLELSIMAGE)pBackendData;722 uint32_t cb = 0;723 724 AssertPtrReturn(pImage, 0);725 726 if (pImage->pStorage)727 cb = 512;728 729 LogFlowFunc(("returns %llu\n", cb));730 return cb;731 }732 733 /** @copydoc VDIMAGEBACKEND::pfnGetSize */734 static DECLCALLBACK(uint64_t) parallelsGetSize(void *pBackendData)735 {736 LogFlowFunc(("pBackendData=%#p\n", pBackendData));737 PPARALLELSIMAGE pImage = (PPARALLELSIMAGE)pBackendData;738 uint64_t cb = 0;739 740 AssertPtrReturn(pImage, 0);741 742 if (pImage->pStorage)743 cb = pImage->cbSize;744 745 LogFlowFunc(("returns %llu\n", cb));746 return cb;747 }748 749 748 /** @copydoc VDIMAGEBACKEND::pfnGetFileSize */ 750 749 static DECLCALLBACK(uint64_t) parallelsGetFileSize(void *pBackendData) … … 838 837 LogFlowFunc(("returns %Rrc\n", rc)); 839 838 return rc; 839 } 840 841 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 842 static DECLCALLBACK(int) parallelsQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 843 { 844 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 845 PPARALLELSIMAGE pThis = (PPARALLELSIMAGE)pBackendData; 846 847 AssertPtrReturn(pThis, VERR_VD_NOT_OPENED); 848 849 *ppRegionList = &pThis->RegionList; 850 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 851 return VINF_SUCCESS; 852 } 853 854 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 855 static DECLCALLBACK(void) parallelsRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 856 { 857 RT_NOREF1(pRegionList); 858 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 859 PPARALLELSIMAGE pThis = (PPARALLELSIMAGE)pBackendData; 860 AssertPtr(pThis); RT_NOREF(pThis); 861 862 /* Nothing to do here. */ 840 863 } 841 864 … … 1099 1122 /* pfnGetVersion */ 1100 1123 parallelsGetVersion, 1101 /* pfnGetSectorSize */1102 parallelsGetSectorSize,1103 /* pfnGetSize */1104 parallelsGetSize,1105 1124 /* pfnGetFileSize */ 1106 1125 parallelsGetFileSize, … … 1114 1133 parallelsSetLCHSGeometry, 1115 1134 /* pfnQueryRegions */ 1116 NULL,1135 parallelsQueryRegions, 1117 1136 /* pfnRegionListRelease */ 1118 NULL,1137 parallelsRegionListRelease, 1119 1138 /* pfnGetImageFlags */ 1120 1139 parallelsGetImageFlags, -
trunk/src/VBox/Storage/QCOW.cpp
r66110 r66486 251 251 * (can be only one at a time). */ 252 252 PQCOWL2CACHEENTRY pL2TblAlloc; 253 253 /** The static region list. */ 254 VDREGIONLIST RegionList; 254 255 } QCOWIMAGE, *PQCOWIMAGE; 255 256 … … 1227 1228 pImage->pszFilename); 1228 1229 1229 if (RT_FAILURE(rc)) 1230 if (RT_SUCCESS(rc)) 1231 { 1232 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 1233 pImage->RegionList.fFlags = 0; 1234 pImage->RegionList.cRegions = 1; 1235 1236 pRegion->offRegion = 0; /* Disk start. */ 1237 pRegion->cbBlock = 512; 1238 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 1239 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 1240 pRegion->cbData = 512; 1241 pRegion->cbMetadata = 0; 1242 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 1243 } 1244 else 1230 1245 qcowFreeImage(pImage, false); 1231 1246 return rc; … … 1308 1323 vdIfProgress(pIfProgress, uPercentStart + uPercentSpan); 1309 1324 1310 if (RT_FAILURE(rc)) 1325 if (RT_SUCCESS(rc)) 1326 { 1327 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 1328 pImage->RegionList.fFlags = 0; 1329 pImage->RegionList.cRegions = 1; 1330 1331 pRegion->offRegion = 0; /* Disk start. */ 1332 pRegion->cbBlock = 512; 1333 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 1334 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 1335 pRegion->cbData = 512; 1336 pRegion->cbMetadata = 0; 1337 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 1338 } 1339 else 1311 1340 qcowFreeImage(pImage, rc != VERR_ALREADY_EXISTS); 1312 1341 return rc; … … 1528 1557 AssertReturn((VALID_PTR(pszFilename) && *pszFilename), VERR_INVALID_PARAMETER); 1529 1558 1530 PQCOWIMAGE pImage = (PQCOWIMAGE)RTMemAllocZ( sizeof(QCOWIMAGE));1559 PQCOWIMAGE pImage = (PQCOWIMAGE)RTMemAllocZ(RT_UOFFSETOF(QCOWIMAGE, RegionList.aRegions[1])); 1531 1560 if (RT_LIKELY(pImage)) 1532 1561 { … … 1575 1604 && VALID_PTR(pLCHSGeometry), VERR_INVALID_PARAMETER); 1576 1605 1577 PQCOWIMAGE pImage = (PQCOWIMAGE)RTMemAllocZ( sizeof(QCOWIMAGE));1606 PQCOWIMAGE pImage = (PQCOWIMAGE)RTMemAllocZ(RT_UOFFSETOF(QCOWIMAGE, RegionList.aRegions[1])); 1578 1607 if (RT_LIKELY(pImage)) 1579 1608 { … … 1918 1947 } 1919 1948 1920 /** @copydoc VDIMAGEBACKEND::pfnGetSectorSize */1921 static DECLCALLBACK(uint32_t) qcowGetSectorSize(void *pBackendData)1922 {1923 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1924 PQCOWIMAGE pImage = (PQCOWIMAGE)pBackendData;1925 uint32_t cb = 0;1926 1927 AssertPtrReturn(pImage, 0);1928 1929 if (pImage->pStorage)1930 cb = 512;1931 1932 LogFlowFunc(("returns %u\n", cb));1933 return cb;1934 }1935 1936 /** @copydoc VDIMAGEBACKEND::pfnGetSize */1937 static DECLCALLBACK(uint64_t) qcowGetSize(void *pBackendData)1938 {1939 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1940 PQCOWIMAGE pImage = (PQCOWIMAGE)pBackendData;1941 uint64_t cb = 0;1942 1943 AssertPtrReturn(pImage, 0);1944 1945 if (pImage->pStorage)1946 cb = pImage->cbSize;1947 1948 LogFlowFunc(("returns %llu\n", cb));1949 return cb;1950 }1951 1952 1949 /** @copydoc VDIMAGEBACKEND::pfnGetFileSize */ 1953 1950 static DECLCALLBACK(uint64_t) qcowGetFileSize(void *pBackendData) … … 2044 2041 LogFlowFunc(("returns %Rrc\n", rc)); 2045 2042 return rc; 2043 } 2044 2045 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 2046 static DECLCALLBACK(int) qcowQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 2047 { 2048 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 2049 PQCOWIMAGE pThis = (PQCOWIMAGE)pBackendData; 2050 2051 AssertPtrReturn(pThis, VERR_VD_NOT_OPENED); 2052 2053 *ppRegionList = &pThis->RegionList; 2054 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 2055 return VINF_SUCCESS; 2056 } 2057 2058 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 2059 static DECLCALLBACK(void) qcowRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 2060 { 2061 RT_NOREF1(pRegionList); 2062 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 2063 PQCOWIMAGE pThis = (PQCOWIMAGE)pBackendData; 2064 AssertPtr(pThis); RT_NOREF(pThis); 2065 2066 /* Nothing to do here. */ 2046 2067 } 2047 2068 … … 2369 2390 /* pfnGetVersion */ 2370 2391 qcowGetVersion, 2371 /* pfnGetSectorSize */2372 qcowGetSectorSize,2373 /* pfnGetSize */2374 qcowGetSize,2375 2392 /* pfnGetFileSize */ 2376 2393 qcowGetFileSize, … … 2384 2401 qcowSetLCHSGeometry, 2385 2402 /* pfnQueryRegions */ 2386 NULL,2403 qcowQueryRegions, 2387 2404 /* pfnRegionListRelease */ 2388 NULL,2405 qcowRegionListRelease, 2389 2406 /* pfnGetImageFlags */ 2390 2407 qcowGetImageFlags, -
trunk/src/VBox/Storage/QED.cpp
r66110 r66486 217 217 /** The LRU L2 entry list used for eviction. */ 218 218 RTLISTNODE ListLru; 219 219 /** The static region list. */ 220 VDREGIONLIST RegionList; 220 221 } QEDIMAGE, *PQEDIMAGE; 221 222 … … 1242 1243 pImage->pszFilename); 1243 1244 1244 if (RT_FAILURE(rc)) 1245 if (RT_SUCCESS(rc)) 1246 { 1247 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 1248 pImage->RegionList.fFlags = 0; 1249 pImage->RegionList.cRegions = 1; 1250 1251 pRegion->offRegion = 0; /* Disk start. */ 1252 pRegion->cbBlock = 512; 1253 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 1254 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 1255 pRegion->cbData = 512; 1256 pRegion->cbMetadata = 0; 1257 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 1258 } 1259 else 1245 1260 qedFreeImage(pImage, false); 1246 1261 return rc; … … 1312 1327 1313 1328 if (RT_SUCCESS(rc)) 1329 { 1330 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 1331 pImage->RegionList.fFlags = 0; 1332 pImage->RegionList.cRegions = 1; 1333 1334 pRegion->offRegion = 0; /* Disk start. */ 1335 pRegion->cbBlock = 512; 1336 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 1337 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 1338 pRegion->cbData = 512; 1339 pRegion->cbMetadata = 0; 1340 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 1341 1314 1342 vdIfProgress(pIfProgress, uPercentStart + uPercentSpan); 1343 } 1315 1344 else 1316 1345 qedFreeImage(pImage, rc != VERR_ALREADY_EXISTS); … … 1532 1561 AssertReturn((VALID_PTR(pszFilename) && *pszFilename), VERR_INVALID_PARAMETER); 1533 1562 1534 PQEDIMAGE pImage = (PQEDIMAGE)RTMemAllocZ( sizeof(QEDIMAGE));1563 PQEDIMAGE pImage = (PQEDIMAGE)RTMemAllocZ(RT_UOFFSETOF(QEDIMAGE, RegionList.aRegions[1])); 1535 1564 if (RT_LIKELY(pImage)) 1536 1565 { … … 1579 1608 && VALID_PTR(pLCHSGeometry), VERR_INVALID_PARAMETER); 1580 1609 1581 PQEDIMAGE pImage = (PQEDIMAGE)RTMemAllocZ( sizeof(QEDIMAGE));1610 PQEDIMAGE pImage = (PQEDIMAGE)RTMemAllocZ(RT_UOFFSETOF(QEDIMAGE, RegionList.aRegions[1])); 1582 1611 if (RT_LIKELY(pImage)) 1583 1612 { … … 1925 1954 } 1926 1955 1927 /** @copydoc VDIMAGEBACKEND::pfnGetSectorSize */1928 static DECLCALLBACK(uint32_t) qedGetSectorSize(void *pBackendData)1929 {1930 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1931 PQEDIMAGE pImage = (PQEDIMAGE)pBackendData;1932 uint32_t cb = 0;1933 1934 AssertPtrReturn(pImage, 0);1935 1936 if (pImage->pStorage)1937 cb = 512;1938 1939 LogFlowFunc(("returns %u\n", cb));1940 return cb;1941 }1942 1943 /** @copydoc VDIMAGEBACKEND::pfnGetSize */1944 static DECLCALLBACK(uint64_t) qedGetSize(void *pBackendData)1945 {1946 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1947 PQEDIMAGE pImage = (PQEDIMAGE)pBackendData;1948 uint64_t cb = 0;1949 1950 AssertPtrReturn(pImage, 0);1951 1952 if (pImage->pStorage)1953 cb = pImage->cbSize;1954 1955 LogFlowFunc(("returns %llu\n", cb));1956 return cb;1957 }1958 1959 1956 /** @copydoc VDIMAGEBACKEND::pfnGetFileSize */ 1960 1957 static DECLCALLBACK(uint64_t) qedGetFileSize(void *pBackendData) … … 2053 2050 LogFlowFunc(("returns %Rrc\n", rc)); 2054 2051 return rc; 2052 } 2053 2054 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 2055 static DECLCALLBACK(int) qedQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 2056 { 2057 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 2058 PQEDIMAGE pThis = (PQEDIMAGE)pBackendData; 2059 2060 AssertPtrReturn(pThis, VERR_VD_NOT_OPENED); 2061 2062 *ppRegionList = &pThis->RegionList; 2063 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 2064 return VINF_SUCCESS; 2065 } 2066 2067 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 2068 static DECLCALLBACK(void) qedRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 2069 { 2070 RT_NOREF1(pRegionList); 2071 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 2072 PQEDIMAGE pThis = (PQEDIMAGE)pBackendData; 2073 AssertPtr(pThis); RT_NOREF(pThis); 2074 2075 /* Nothing to do here. */ 2055 2076 } 2056 2077 … … 2422 2443 /* pfnGetVersion */ 2423 2444 qedGetVersion, 2424 /* pfnGetSectorSize */2425 qedGetSectorSize,2426 /* pfnGetSize */2427 qedGetSize,2428 2445 /* pfnGetFileSize */ 2429 2446 qedGetFileSize, … … 2437 2454 qedSetLCHSGeometry, 2438 2455 /* pfnQueryRegions */ 2439 NULL,2456 qedQueryRegions, 2440 2457 /* pfnRegionListRelease */ 2441 NULL,2458 qedRegionListRelease, 2442 2459 /* pfnGetImageFlags */ 2443 2460 qedGetImageFlags, -
trunk/src/VBox/Storage/RAW.cpp
r66211 r66486 71 71 /** Sector size of the image. */ 72 72 uint32_t cbSector; 73 /** The static region list. */ 74 VDREGIONLIST RegionList; 73 75 } RAWIMAGE, *PRAWIMAGE; 74 76 … … 210 212 * choice of retrying the open if it failed. */ 211 213 212 if (RT_FAILURE(rc)) 214 if (RT_SUCCESS(rc)) 215 { 216 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 217 pImage->RegionList.fFlags = 0; 218 pImage->RegionList.cRegions = 1; 219 220 pRegion->offRegion = 0; /* Disk start. */ 221 pRegion->cbBlock = pImage->cbSector; 222 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 223 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 224 pRegion->cbData = pImage->cbSector; 225 pRegion->cbMetadata = 0; 226 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 227 } 228 else 213 229 rawFreeImage(pImage, false); 214 230 return rc; … … 282 298 283 299 if (RT_SUCCESS(rc)) 300 { 301 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 302 pImage->RegionList.fFlags = 0; 303 pImage->RegionList.cRegions = 1; 304 305 pRegion->offRegion = 0; /* Disk start. */ 306 pRegion->cbBlock = pImage->cbSector; 307 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 308 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 309 pRegion->cbData = pImage->cbSector; 310 pRegion->cbMetadata = 0; 311 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 312 284 313 vdIfProgress(pIfProgress, uPercentStart + uPercentSpan); 314 } 285 315 286 316 if (RT_FAILURE(rc)) … … 382 412 AssertReturn((VALID_PTR(pszFilename) && *pszFilename), VERR_INVALID_PARAMETER); 383 413 384 pImage = (PRAWIMAGE)RTMemAllocZ( sizeof(RAWIMAGE));414 pImage = (PRAWIMAGE)RTMemAllocZ(RT_UOFFSETOF(RAWIMAGE, RegionList.aRegions[1])); 385 415 if (RT_LIKELY(pImage)) 386 416 { … … 438 468 && VALID_PTR(pLCHSGeometry), VERR_INVALID_PARAMETER); 439 469 440 PRAWIMAGE pImage = (PRAWIMAGE)RTMemAllocZ( sizeof(RAWIMAGE));470 PRAWIMAGE pImage = (PRAWIMAGE)RTMemAllocZ(RT_UOFFSETOF(RAWIMAGE, RegionList.aRegions[1])); 441 471 if (RT_LIKELY(pImage)) 442 472 { … … 602 632 } 603 633 604 /** @copydoc VDIMAGEBACKEND::pfnGetSize */605 static DECLCALLBACK(uint32_t) rawGetSectorSize(void *pBackendData)606 {607 LogFlowFunc(("pBackendData=%#p\n", pBackendData));608 PRAWIMAGE pImage = (PRAWIMAGE)pBackendData;609 uint32_t cb = 0;610 611 AssertPtrReturn(pImage, 0);612 613 if (pImage->pStorage)614 cb = pImage->cbSector;615 616 LogFlowFunc(("returns %u\n", cb));617 return cb;618 }619 620 /** @copydoc VDIMAGEBACKEND::pfnGetSize */621 static DECLCALLBACK(uint64_t) rawGetSize(void *pBackendData)622 {623 LogFlowFunc(("pBackendData=%#p\n", pBackendData));624 PRAWIMAGE pImage = (PRAWIMAGE)pBackendData;625 uint64_t cb = 0;626 627 AssertPtrReturn(pImage, 0);628 629 if (pImage->pStorage)630 cb = pImage->cbSize;631 632 LogFlowFunc(("returns %llu\n", cb));633 return cb;634 }635 636 634 /** @copydoc VDIMAGEBACKEND::pfnGetFileSize */ 637 635 static DECLCALLBACK(uint64_t) rawGetFileSize(void *pBackendData) … … 730 728 LogFlowFunc(("returns %Rrc\n", rc)); 731 729 return rc; 730 } 731 732 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 733 static DECLCALLBACK(int) rawQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 734 { 735 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 736 PRAWIMAGE pThis = (PRAWIMAGE)pBackendData; 737 738 AssertPtrReturn(pThis, VERR_VD_NOT_OPENED); 739 740 *ppRegionList = &pThis->RegionList; 741 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 742 return VINF_SUCCESS; 743 } 744 745 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 746 static DECLCALLBACK(void) rawRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 747 { 748 RT_NOREF1(pRegionList); 749 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 750 PRAWIMAGE pThis = (PRAWIMAGE)pBackendData; 751 AssertPtr(pThis); RT_NOREF(pThis); 752 753 /* Nothing to do here. */ 732 754 } 733 755 … … 993 1015 /* pfnGetVersion */ 994 1016 rawGetVersion, 995 /* pfnGetSectorSize */996 rawGetSectorSize,997 /* pfnGetSize */998 rawGetSize,999 1017 /* pfnGetFileSize */ 1000 1018 rawGetFileSize, … … 1008 1026 rawSetLCHSGeometry, 1009 1027 /* pfnQueryRegions */ 1010 NULL,1028 rawQueryRegions, 1011 1029 /* pfnRegionListRelease */ 1012 NULL,1030 rawRegionListRelease, 1013 1031 /* pfnGetImageFlags */ 1014 1032 rawGetImageFlags, -
trunk/src/VBox/Storage/VD.cpp
r66378 r66486 531 531 } 532 532 return pImage; 533 } 534 535 /** 536 * Creates a new region list from the given one converting to match the flags if necessary. 537 * 538 * @returns VBox status code. 539 * @param pRegionList The region list to convert from. 540 * @param fFlags The flags for the new region list. 541 * @param ppRegionList Where to store the new region list on success. 542 */ 543 static int vdRegionListConv(PCVDREGIONLIST pRegionList, uint32_t fFlags, PPVDREGIONLIST ppRegionList) 544 { 545 int rc = VINF_SUCCESS; 546 PVDREGIONLIST pRegionListNew = (PVDREGIONLIST)RTMemDup(pRegionList, RT_UOFFSETOF(VDREGIONLIST, aRegions[pRegionList->cRegions])); 547 if (RT_LIKELY(pRegionListNew)) 548 { 549 /* Do we have to convert anything? */ 550 if (pRegionList->fFlags != fFlags) 551 { 552 uint64_t offRegionNext = 0; 553 554 pRegionListNew->fFlags = fFlags; 555 for (unsigned i = 0; i < pRegionListNew->cRegions; i++) 556 { 557 PVDREGIONDESC pRegion = &pRegionListNew->aRegions[i]; 558 559 if ( (fFlags & VD_REGION_LIST_F_LOC_SIZE_BLOCKS) 560 && !(pRegionList->fFlags & VD_REGION_LIST_F_LOC_SIZE_BLOCKS)) 561 { 562 Assert(!(pRegion->cRegionBlocksOrBytes % pRegion->cbBlock)); 563 564 /* Convert from bytes to logical blocks. */ 565 pRegion->offRegion = offRegionNext; 566 pRegion->cRegionBlocksOrBytes = pRegion->cRegionBlocksOrBytes / pRegion->cbBlock; 567 offRegionNext += pRegion->cRegionBlocksOrBytes; 568 } 569 else 570 { 571 /* Convert from logical blocks to bytes. */ 572 pRegion->offRegion = offRegionNext; 573 pRegion->cRegionBlocksOrBytes = pRegion->cRegionBlocksOrBytes * pRegion->cbBlock; 574 offRegionNext += pRegion->cRegionBlocksOrBytes; 575 } 576 } 577 } 578 579 *ppRegionList = pRegionListNew; 580 } 581 else 582 rc = VERR_NO_MEMORY; 583 584 return rc; 585 } 586 587 /** 588 * Returns the virtual size of the image in bytes. 589 * 590 * @returns Size of the given image in bytes. 591 * @param 592 */ 593 static uint64_t vdImageGetSize(PVDIMAGE pImage) 594 { 595 uint64_t cbImage = 0; 596 PCVDREGIONLIST pRegionList = NULL; 597 int rc = pImage->Backend->pfnQueryRegions(pImage->pBackendData, &pRegionList); 598 if (RT_SUCCESS(rc)) 599 { 600 if (pRegionList->fFlags & VD_REGION_LIST_F_LOC_SIZE_BLOCKS) 601 { 602 PVDREGIONLIST pRegionListConv = NULL; 603 rc = vdRegionListConv(pRegionList, 0, &pRegionListConv); 604 if (RT_SUCCESS(rc)) 605 { 606 for (uint32_t i = 0; i < pRegionListConv->cRegions; i++) 607 cbImage += pRegionListConv->aRegions[i].cRegionBlocksOrBytes; 608 609 VDRegionListFree(pRegionListConv); 610 } 611 } 612 else 613 for (uint32_t i = 0; i < pRegionList->cRegions; i++) 614 cbImage += pRegionList->aRegions[i].cRegionBlocksOrBytes; 615 616 AssertPtr(pImage->Backend->pfnRegionListRelease); 617 pImage->Backend->pfnRegionListRelease(pImage->pBackendData, pRegionList); 618 } 619 620 return cbImage; 533 621 } 534 622 … … 4591 4679 PVDIO pVDIo = (PVDIO)pvUser; 4592 4680 PVDISK pDisk = pVDIo->pDisk; 4681 size_t cbSector = 0; 4593 4682 4594 4683 PVDIMAGE pImage = vdGetImageByNumber(pDisk, VD_LAST_IMAGE); 4595 4684 AssertPtrReturn(pImage, 0); 4596 return pImage->Backend->pfnGetSectorSize(pImage->pBackendData); 4685 4686 PCVDREGIONLIST pRegionList = NULL; 4687 int rc = pImage->Backend->pfnQueryRegions(pImage->pBackendData, &pRegionList); 4688 if (RT_SUCCESS(rc)) 4689 { 4690 cbSector = pRegionList->aRegions[0].cbBlock; 4691 4692 AssertPtr(pImage->Backend->pfnRegionListRelease); 4693 pImage->Backend->pfnRegionListRelease(pImage->pBackendData, pRegionList); 4694 } 4695 4696 return cbSector; 4597 4697 } 4598 4698 … … 4896 4996 4897 4997 RTSemEventSignal(hEvent); 4898 }4899 4900 /**4901 * Creates a new region list from the given one converting to match the flags if necessary.4902 *4903 * @returns VBox status code.4904 * @param pRegionList The region list to convert from.4905 * @param fFlags The flags for the new region list.4906 * @param ppRegionList Where to store the new region list on success.4907 */4908 static int vdRegionListConv(PCVDREGIONLIST pRegionList, uint32_t fFlags, PPVDREGIONLIST ppRegionList)4909 {4910 int rc = VINF_SUCCESS;4911 PVDREGIONLIST pRegionListNew = (PVDREGIONLIST)RTMemDup(pRegionList, RT_UOFFSETOF(VDREGIONLIST, aRegions[pRegionList->cRegions]));4912 if (RT_LIKELY(pRegionListNew))4913 {4914 /* Do we have to convert anything? */4915 if (pRegionList->fFlags != fFlags)4916 {4917 uint64_t offRegionNext = 0;4918 4919 pRegionListNew->fFlags = fFlags;4920 for (unsigned i = 0; i < pRegionListNew->cRegions; i++)4921 {4922 PVDREGIONDESC pRegion = &pRegionListNew->aRegions[i];4923 4924 if ( (fFlags & VD_REGION_LIST_F_LOC_SIZE_BLOCKS)4925 && !(pRegionList->fFlags & VD_REGION_LIST_F_LOC_SIZE_BLOCKS))4926 {4927 Assert(!(pRegion->cRegionBlocksOrBytes % pRegion->cbBlock));4928 4929 /* Convert from bytes to logical blocks. */4930 pRegion->offRegion = offRegionNext;4931 pRegion->cRegionBlocksOrBytes = pRegion->cRegionBlocksOrBytes / pRegion->cbBlock;4932 offRegionNext += pRegion->cRegionBlocksOrBytes;4933 }4934 else4935 {4936 /* Convert from logical blocks to bytes. */4937 pRegion->offRegion = offRegionNext;4938 pRegion->cRegionBlocksOrBytes = pRegion->cRegionBlocksOrBytes * pRegion->cbBlock;4939 offRegionNext += pRegion->cRegionBlocksOrBytes;4940 }4941 }4942 }4943 4944 *ppRegionList = pRegionListNew;4945 }4946 else4947 rc = VERR_NO_MEMORY;4948 4949 return rc;4950 4998 } 4951 4999 … … 5729 5777 5730 5778 /* Cache disk information. */ 5731 pDisk->cbSize = pImage->Backend->pfnGetSize(pImage->pBackendData);5779 pDisk->cbSize = vdImageGetSize(pImage); 5732 5780 5733 5781 /* Cache PCHS geometry. */ … … 6305 6353 { 6306 6354 /* Cache disk information. */ 6307 pDisk->cbSize = pImage->Backend->pfnGetSize(pImage->pBackendData);6355 pDisk->cbSize = vdImageGetSize(pImage); 6308 6356 6309 6357 /* Cache PCHS geometry. */ … … 6941 6989 6942 6990 /* Get size of destination image. */ 6943 uint64_t cbSize = pImageTo->Backend->pfnGetSize(pImageTo->pBackendData);6991 uint64_t cbSize = vdImageGetSize(pImageTo); 6944 6992 rc2 = vdThreadFinishWrite(pDisk); 6945 6993 AssertRC(rc2); … … 7418 7466 7419 7467 uint64_t cbSizeFrom; 7420 cbSizeFrom = pImageFrom->Backend->pfnGetSize(pImageFrom->pBackendData);7468 cbSizeFrom = vdImageGetSize(pImageFrom); 7421 7469 if (cbSizeFrom == 0) 7422 7470 { … … 7521 7569 7522 7570 uint64_t cbSizeTo; 7523 cbSizeTo = pImageTo->Backend->pfnGetSize(pImageTo->pBackendData);7571 cbSizeTo = vdImageGetSize(pImageTo); 7524 7572 if (cbSizeTo == 0) 7525 7573 { … … 8012 8060 { 8013 8061 /* Get size of image. */ 8014 uint64_t cbSize = pImage->Backend->pfnGetSize(pImage->pBackendData);8062 uint64_t cbSize = vdImageGetSize(pImage); 8015 8063 uint64_t cbSizeFile = pImage->Backend->pfnGetFileSize(pImage->pBackendData); 8016 8064 uint64_t cbFileWritten = 0; … … 8188 8236 8189 8237 /* Cache disk information. */ 8190 pDisk->cbSize = pImage->Backend->pfnGetSize(pImage->pBackendData);8238 pDisk->cbSize = vdImageGetSize(pImage); 8191 8239 8192 8240 /* Cache PCHS geometry. */ … … 8751 8799 PVDIMAGE pImage = vdGetImageByNumber(pDisk, nImage); 8752 8800 AssertPtrBreakStmt(pImage, cbSector = 0); 8753 cbSector = pImage->Backend->pfnGetSectorSize(pImage->pBackendData); 8801 8802 PCVDREGIONLIST pRegionList = NULL; 8803 int rc = pImage->Backend->pfnQueryRegions(pImage->pBackendData, &pRegionList); 8804 if (RT_SUCCESS(rc)) 8805 { 8806 AssertBreakStmt(pRegionList->cRegions == 1, cbSector = 0); 8807 cbSector = pRegionList->aRegions[0].cbBlock; 8808 8809 AssertPtr(pImage->Backend->pfnRegionListRelease); 8810 pImage->Backend->pfnRegionListRelease(pImage->pBackendData, pRegionList); 8811 } 8754 8812 } while (0); 8755 8813 … … 8791 8849 PVDIMAGE pImage = vdGetImageByNumber(pDisk, nImage); 8792 8850 AssertPtrBreakStmt(pImage, cbSize = 0); 8793 cbSize = pImage->Backend->pfnGetSize(pImage->pBackendData); 8851 8852 cbSize = vdImageGetSize(pImage); 8794 8853 } while (0); 8795 8854 … … 9219 9278 AssertPtrBreakStmt(pImage, rc = VERR_VD_IMAGE_NOT_FOUND); 9220 9279 9221 if (pImage->Backend->pfnQueryRegions) 9222 { 9223 PCVDREGIONLIST pRegionList = NULL; 9224 rc = pImage->Backend->pfnQueryRegions(pImage->pBackendData, &pRegionList); 9225 if (RT_SUCCESS(rc)) 9226 { 9227 rc = vdRegionListConv(pRegionList, fFlags, ppRegionList); 9228 9229 AssertPtr(pImage->Backend->pfnRegionListRelease); 9230 pImage->Backend->pfnRegionListRelease(pImage->pBackendData, pRegionList); 9231 } 9232 } 9233 else 9234 rc = VERR_NOT_SUPPORTED; 9235 9236 if (rc == VERR_NOT_SUPPORTED) 9237 { 9238 /* 9239 * Create a list with a single region containing the data gathered from the 9240 * image and sector size. 9241 */ 9242 PVDREGIONLIST pRegionList = (PVDREGIONLIST)RTMemAllocZ(RT_UOFFSETOF(VDREGIONLIST, aRegions[1])); 9243 if (RT_LIKELY(pRegionList)) 9244 { 9245 uint32_t cbSector = pImage->Backend->pfnGetSectorSize(pImage->pBackendData); 9246 uint64_t cbImage = pImage->Backend->pfnGetSize(pImage->pBackendData); 9247 9248 pRegionList->cRegions = 1; 9249 pRegionList->fFlags = fFlags; 9250 9251 /* 9252 * Single region starting at the first byte/block covering the whole image, 9253 * block size equals sector size and contains no metadata. 9254 */ 9255 PVDREGIONDESC pRegion = &pRegionList->aRegions[0]; 9256 pRegion->offRegion = 0; /* Disk start. */ 9257 pRegion->cbBlock = cbSector; 9258 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 9259 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 9260 pRegion->cbData = cbSector; 9261 pRegion->cbMetadata = 0; 9262 if (fFlags & VD_REGION_LIST_F_LOC_SIZE_BLOCKS) 9263 pRegion->cRegionBlocksOrBytes = cbImage / cbSector; 9264 else 9265 pRegion->cRegionBlocksOrBytes = cbImage; 9266 9267 *ppRegionList = pRegionList; 9268 rc = VINF_SUCCESS; 9269 } 9270 else 9271 rc = VERR_NO_MEMORY; 9280 PCVDREGIONLIST pRegionList = NULL; 9281 rc = pImage->Backend->pfnQueryRegions(pImage->pBackendData, &pRegionList); 9282 if (RT_SUCCESS(rc)) 9283 { 9284 rc = vdRegionListConv(pRegionList, fFlags, ppRegionList); 9285 9286 AssertPtr(pImage->Backend->pfnRegionListRelease); 9287 pImage->Backend->pfnRegionListRelease(pImage->pBackendData, pRegionList); 9272 9288 } 9273 9289 } while (0); -
trunk/src/VBox/Storage/VDI.cpp
r66110 r66486 731 731 732 732 if (RT_SUCCESS(rc)) 733 { 734 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 735 pImage->RegionList.fFlags = 0; 736 pImage->RegionList.cRegions = 1; 737 738 pRegion->offRegion = 0; /* Disk start. */ 739 pRegion->cbBlock = 512; 740 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 741 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 742 pRegion->cbData = 512; 743 pRegion->cbMetadata = 0; 744 pRegion->cRegionBlocksOrBytes = getImageDiskSize(&pImage->Header); 745 733 746 vdIfProgress(pIfProgress, uPercentStart + uPercentSpan); 747 } 734 748 735 749 if (RT_FAILURE(rc)) … … 962 976 * choice of retrying the open if it failed. */ 963 977 964 if (RT_FAILURE(rc)) 978 if (RT_SUCCESS(rc)) 979 { 980 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 981 pImage->RegionList.fFlags = 0; 982 pImage->RegionList.cRegions = 1; 983 984 pRegion->offRegion = 0; /* Disk start. */ 985 pRegion->cbBlock = 512; 986 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 987 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 988 pRegion->cbData = 512; 989 pRegion->cbMetadata = 0; 990 pRegion->cRegionBlocksOrBytes = getImageDiskSize(&pImage->Header); 991 } 992 else 965 993 vdiFreeImage(pImage, false); 966 994 return rc; … … 1391 1419 AssertReturn((VALID_PTR(pszFilename) && *pszFilename), VERR_INVALID_PARAMETER); 1392 1420 1393 PVDIIMAGEDESC pImage = (PVDIIMAGEDESC)RTMemAllocZ( sizeof(VDIIMAGEDESC));1421 PVDIIMAGEDESC pImage = (PVDIIMAGEDESC)RTMemAllocZ(RT_UOFFSETOF(VDIIMAGEDESC, RegionList.aRegions[1])); 1394 1422 if (RT_LIKELY(pImage)) 1395 1423 { … … 1447 1475 && VALID_PTR(pLCHSGeometry), VERR_INVALID_PARAMETER); 1448 1476 1449 PVDIIMAGEDESC pImage = (PVDIIMAGEDESC)RTMemAllocZ( sizeof(VDIIMAGEDESC));1477 PVDIIMAGEDESC pImage = (PVDIIMAGEDESC)RTMemAllocZ(RT_UOFFSETOF(VDIIMAGEDESC, RegionList.aRegions[1])); 1450 1478 if (RT_LIKELY(pImage)) 1451 1479 { … … 1736 1764 } 1737 1765 1738 /** @copydoc VDIMAGEBACKEND::pfnGetSectorSize */1739 static DECLCALLBACK(uint32_t) vdiGetSectorSize(void *pBackendData)1740 {1741 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1742 PVDIIMAGEDESC pImage = (PVDIIMAGEDESC)pBackendData;1743 uint64_t cbSector = 0;1744 1745 AssertPtrReturn(pImage, 0);1746 1747 if (pImage->pStorage)1748 cbSector = 512;1749 1750 LogFlowFunc(("returns %zu\n", cbSector));1751 return cbSector;1752 }1753 1754 /** @copydoc VDIMAGEBACKEND::pfnGetSize */1755 static DECLCALLBACK(uint64_t) vdiGetSize(void *pBackendData)1756 {1757 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1758 PVDIIMAGEDESC pImage = (PVDIIMAGEDESC)pBackendData;1759 1760 AssertPtrReturn(pImage, 0);1761 1762 LogFlowFunc(("returns %llu\n", getImageDiskSize(&pImage->Header)));1763 return getImageDiskSize(&pImage->Header);1764 }1765 1766 1766 /** @copydoc VDIMAGEBACKEND::pfnGetFileSize */ 1767 1767 static DECLCALLBACK(uint64_t) vdiGetFileSize(void *pBackendData) … … 1881 1881 LogFlowFunc(("returns %Rrc\n", rc)); 1882 1882 return rc; 1883 } 1884 1885 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 1886 static DECLCALLBACK(int) vdiQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 1887 { 1888 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 1889 PVDIIMAGEDESC pThis = (PVDIIMAGEDESC)pBackendData; 1890 1891 AssertPtrReturn(pThis, VERR_VD_NOT_OPENED); 1892 1893 *ppRegionList = &pThis->RegionList; 1894 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 1895 return VINF_SUCCESS; 1896 } 1897 1898 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 1899 static DECLCALLBACK(void) vdiRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 1900 { 1901 RT_NOREF1(pRegionList); 1902 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 1903 PVDIIMAGEDESC pThis = (PVDIIMAGEDESC)pBackendData; 1904 AssertPtr(pThis); RT_NOREF(pThis); 1905 1906 /* Nothing to do here. */ 1883 1907 } 1884 1908 … … 3124 3148 /* pfnGetVersion */ 3125 3149 vdiGetVersion, 3126 /* pfnGetSectorSize */3127 vdiGetSectorSize,3128 /* pfnGetSize */3129 vdiGetSize,3130 3150 /* pfnGetFileSize */ 3131 3151 vdiGetFileSize, … … 3139 3159 vdiSetLCHSGeometry, 3140 3160 /* pfnQueryRegions */ 3141 NULL,3161 vdiQueryRegions, 3142 3162 /* pfnRegionListRelease */ 3143 NULL,3163 vdiRegionListRelease, 3144 3164 /* pfnGetImageFlags */ 3145 3165 vdiGetImageFlags, -
trunk/src/VBox/Storage/VDICore.h
r62740 r66486 564 564 /** Current size of the image (used for range validation when reading). */ 565 565 uint64_t cbImage; 566 /** The static region list. */ 567 VDREGIONLIST RegionList; 566 568 } VDIIMAGEDESC, *PVDIIMAGEDESC; 567 569 -
trunk/src/VBox/Storage/VDInternal.h
r66378 r66486 272 272 DECLHIDDEN(int) vdFindFilterBackend(const char *pszFilter, PCVDFILTERBACKEND *ppBackend); 273 273 274 DECLHIDDEN(int) vdIoIterQueryStartNext(VDIOITER hVdIoIter, uint64_t *pu64Start); 275 DECLHIDDEN(int) vdIoIterQuerySegSizeByStart(VDIOITER hVdIoIter, uint64_t u64Start, size_t *pcRegSize); 276 DECLHIDDEN(int) vdIoIterAdvance(VDIOITER hVdIoIter, uint64_t cBlocksOrBytes); 277 274 278 #endif /* !___VDInternal_h */ 275 279 -
trunk/src/VBox/Storage/VHD.cpp
r66110 r66486 188 188 /** Flag to force dynamic disk header update. */ 189 189 bool fDynHdrNeedsUpdate; 190 /** The static region list. */ 191 VDREGIONLIST RegionList; 190 192 } VHDIMAGE, *PVHDIMAGE; 191 193 … … 892 894 rc = vhdLoadDynamicDisk(pImage, pImage->u64DataOffset); 893 895 894 if (RT_FAILURE(rc)) 896 if (RT_SUCCESS(rc)) 897 { 898 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 899 pImage->RegionList.fFlags = 0; 900 pImage->RegionList.cRegions = 1; 901 902 pRegion->offRegion = 0; /* Disk start. */ 903 pRegion->cbBlock = 512; 904 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 905 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 906 pRegion->cbData = 512; 907 pRegion->cbMetadata = 0; 908 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 909 } 910 else 895 911 vhdFreeImage(pImage, false); 896 912 return rc; … … 1230 1246 vdIfProgress(pIfProgress, uPercentStart + uPercentSpan); 1231 1247 1232 if (RT_FAILURE(rc)) 1248 if (RT_SUCCESS(rc)) 1249 { 1250 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 1251 pImage->RegionList.fFlags = 0; 1252 pImage->RegionList.cRegions = 1; 1253 1254 pRegion->offRegion = 0; /* Disk start. */ 1255 pRegion->cbBlock = 512; 1256 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 1257 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 1258 pRegion->cbData = 512; 1259 pRegion->cbMetadata = 0; 1260 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 1261 } 1262 else 1233 1263 vhdFreeImage(pImage, rc != VERR_ALREADY_EXISTS); 1234 1264 return rc; … … 1307 1337 AssertReturn((VALID_PTR(pszFilename) && *pszFilename), VERR_INVALID_PARAMETER); 1308 1338 1309 PVHDIMAGE pImage = (PVHDIMAGE)RTMemAllocZ( sizeof(VHDIMAGE));1339 PVHDIMAGE pImage = (PVHDIMAGE)RTMemAllocZ(RT_UOFFSETOF(VHDIMAGE, RegionList.aRegions[1])); 1310 1340 if (RT_LIKELY(pImage)) 1311 1341 { … … 1355 1385 /** @todo Check the values of other params */ 1356 1386 1357 PVHDIMAGE pImage = (PVHDIMAGE)RTMemAllocZ( sizeof(VHDIMAGE));1387 PVHDIMAGE pImage = (PVHDIMAGE)RTMemAllocZ(RT_UOFFSETOF(VHDIMAGE, RegionList.aRegions[1])); 1358 1388 if (RT_LIKELY(pImage)) 1359 1389 { … … 1829 1859 } 1830 1860 1831 /** @interface_method_impl{VDIMAGEBACKEND,pfnGetSectorSize} */1832 static DECLCALLBACK(uint32_t) vhdGetSectorSize(void *pBackendData)1833 {1834 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1835 PVHDIMAGE pImage = (PVHDIMAGE)pBackendData;1836 uint32_t cb = 0;1837 1838 AssertPtrReturn(pImage, 0);1839 1840 if (pImage->pStorage)1841 cb = VHD_SECTOR_SIZE;1842 1843 LogFlowFunc(("returns %zu\n", cb));1844 return cb;1845 }1846 1847 /** @interface_method_impl{VDIMAGEBACKEND,pfnGetSize} */1848 static DECLCALLBACK(uint64_t) vhdGetSize(void *pBackendData)1849 {1850 LogFlowFunc(("pBackendData=%#p\n", pBackendData));1851 PVHDIMAGE pImage = (PVHDIMAGE)pBackendData;1852 uint64_t cb = 0;1853 1854 AssertPtr(pImage);1855 1856 if (pImage && pImage->pStorage)1857 cb = pImage->cbSize;1858 1859 LogFlowFunc(("returns %llu\n", cb));1860 return cb;1861 }1862 1863 1861 /** @interface_method_impl{VDIMAGEBACKEND,pfnGetFileSize} */ 1864 1862 static DECLCALLBACK(uint64_t) vhdGetFileSize(void *pBackendData) … … 1949 1947 LogFlowFunc(("returns %Rrc\n", rc)); 1950 1948 return rc; 1949 } 1950 1951 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 1952 static DECLCALLBACK(int) vhdQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 1953 { 1954 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 1955 PVHDIMAGE pThis = (PVHDIMAGE)pBackendData; 1956 1957 AssertPtrReturn(pThis, VERR_VD_NOT_OPENED); 1958 1959 *ppRegionList = &pThis->RegionList; 1960 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 1961 return VINF_SUCCESS; 1962 } 1963 1964 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 1965 static DECLCALLBACK(void) vhdRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 1966 { 1967 RT_NOREF1(pRegionList); 1968 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 1969 PVHDIMAGE pThis = (PVHDIMAGE)pBackendData; 1970 AssertPtr(pThis); RT_NOREF(pThis); 1971 1972 /* Nothing to do here. */ 1951 1973 } 1952 1974 … … 3044 3066 /* pfnGetVersion */ 3045 3067 vhdGetVersion, 3046 /* pfnGetSectorSize */3047 vhdGetSectorSize,3048 /* pfnGetSize */3049 vhdGetSize,3050 3068 /* pfnGetFileSize */ 3051 3069 vhdGetFileSize, … … 3059 3077 vhdSetLCHSGeometry, 3060 3078 /* pfnQueryRegions */ 3061 NULL,3079 vhdQueryRegions, 3062 3080 /* pfnRegionListRelease */ 3063 NULL,3081 vhdRegionListRelease, 3064 3082 /* pfnGetImageFlags */ 3065 3083 vhdGetImageFlags, -
trunk/src/VBox/Storage/VHDX.cpp
r66110 r66486 550 550 /** Chunk ratio. */ 551 551 uint32_t uChunkRatio; 552 552 /** The static region list. */ 553 VDREGIONLIST RegionList; 553 554 } VHDXIMAGE, *PVHDXIMAGE; 554 555 … … 1744 1745 } 1745 1746 1746 if (RT_FAILURE(rc)) 1747 if (RT_SUCCESS(rc)) 1748 { 1749 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 1750 pImage->RegionList.fFlags = 0; 1751 pImage->RegionList.cRegions = 1; 1752 1753 pRegion->offRegion = 0; /* Disk start. */ 1754 pRegion->cbBlock = pImage->cbLogicalSector; 1755 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 1756 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 1757 pRegion->cbData = pImage->cbLogicalSector; 1758 pRegion->cbMetadata = 0; 1759 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 1760 } 1761 else 1747 1762 vhdxFreeImage(pImage, false); 1748 1763 … … 1828 1843 else 1829 1844 { 1830 pImage = (PVHDXIMAGE)RTMemAllocZ( sizeof(VHDXIMAGE));1845 pImage = (PVHDXIMAGE)RTMemAllocZ(RT_UOFFSETOF(VHDXIMAGE, RegionList.aRegions[1])); 1831 1846 if (!pImage) 1832 1847 rc = VERR_NO_MEMORY; … … 2042 2057 } 2043 2058 2044 /** @copydoc VDIMAGEBACKEND::pfnGetSectorSize */2045 static DECLCALLBACK(uint32_t) vhdxGetSectorSize(void *pBackendData)2046 {2047 LogFlowFunc(("pBackendData=%#p\n", pBackendData));2048 PVHDXIMAGE pImage = (PVHDXIMAGE)pBackendData;2049 uint32_t cb = 0;2050 2051 AssertPtr(pImage);2052 2053 if (pImage && pImage->pStorage)2054 cb = pImage->cbLogicalSector;2055 2056 LogFlowFunc(("returns %u\n", cb));2057 return cb;2058 }2059 2060 /** @copydoc VDIMAGEBACKEND::pfnGetSize */2061 static DECLCALLBACK(uint64_t) vhdxGetSize(void *pBackendData)2062 {2063 LogFlowFunc(("pBackendData=%#p\n", pBackendData));2064 PVHDXIMAGE pImage = (PVHDXIMAGE)pBackendData;2065 uint64_t cb = 0;2066 2067 AssertPtr(pImage);2068 2069 if (pImage && pImage->pStorage)2070 cb = pImage->cbSize;2071 2072 LogFlowFunc(("returns %llu\n", cb));2073 return cb;2074 }2075 2076 2059 /** @copydoc VDIMAGEBACKEND::pfnGetFileSize */ 2077 2060 static DECLCALLBACK(uint64_t) vhdxGetFileSize(void *pBackendData) … … 2195 2178 LogFlowFunc(("returns %Rrc\n", rc)); 2196 2179 return rc; 2180 } 2181 2182 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 2183 static DECLCALLBACK(int) vhdxQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 2184 { 2185 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 2186 PVHDXIMAGE pThis = (PVHDXIMAGE)pBackendData; 2187 2188 AssertPtrReturn(pThis, VERR_VD_NOT_OPENED); 2189 2190 *ppRegionList = &pThis->RegionList; 2191 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 2192 return VINF_SUCCESS; 2193 } 2194 2195 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 2196 static DECLCALLBACK(void) vhdxRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 2197 { 2198 RT_NOREF1(pRegionList); 2199 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 2200 PVHDXIMAGE pThis = (PVHDXIMAGE)pBackendData; 2201 AssertPtr(pThis); RT_NOREF(pThis); 2202 2203 /* Nothing to do here. */ 2197 2204 } 2198 2205 … … 2520 2527 /* pfnGetVersion */ 2521 2528 vhdxGetVersion, 2522 /* pfnGetSectorSize */2523 vhdxGetSectorSize,2524 /* pfnGetSize */2525 vhdxGetSize,2526 2529 /* pfnGetFileSize */ 2527 2530 vhdxGetFileSize, … … 2535 2538 vhdxSetLCHSGeometry, 2536 2539 /* pfnQueryRegions */ 2537 NULL,2540 vhdxQueryRegions, 2538 2541 /* pfnRegionListRelease */ 2539 NULL,2542 vhdxRegionListRelease, 2540 2543 /* pfnGetImageFlags */ 2541 2544 vhdxGetImageFlags, -
trunk/src/VBox/Storage/VMDK.cpp
r66250 r66486 436 436 /** Parsed descriptor file content. */ 437 437 VMDKDESCRIPTOR Descriptor; 438 /** The static region list. */ 439 VDREGIONLIST RegionList; 438 440 } VMDKIMAGE; 439 441 … … 3340 3342 * choice of retrying the open if it failed. */ 3341 3343 3342 if (RT_FAILURE(rc)) 3344 if (RT_SUCCESS(rc)) 3345 { 3346 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 3347 pImage->RegionList.fFlags = 0; 3348 pImage->RegionList.cRegions = 1; 3349 3350 pRegion->offRegion = 0; /* Disk start. */ 3351 pRegion->cbBlock = 512; 3352 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 3353 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 3354 pRegion->cbData = 512; 3355 pRegion->cbMetadata = 0; 3356 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 3357 } 3358 else 3343 3359 vmdkFreeImage(pImage, false); 3344 3360 return rc; … … 4053 4069 4054 4070 if (RT_SUCCESS(rc)) 4071 { 4072 PVDREGIONDESC pRegion = &pImage->RegionList.aRegions[0]; 4073 pImage->RegionList.fFlags = 0; 4074 pImage->RegionList.cRegions = 1; 4075 4076 pRegion->offRegion = 0; /* Disk start. */ 4077 pRegion->cbBlock = 512; 4078 pRegion->enmDataForm = VDREGIONDATAFORM_RAW; 4079 pRegion->enmMetadataForm = VDREGIONMETADATAFORM_NONE; 4080 pRegion->cbData = 512; 4081 pRegion->cbMetadata = 0; 4082 pRegion->cRegionBlocksOrBytes = pImage->cbSize; 4083 4055 4084 vdIfProgress(pIfProgress, uPercentStart + uPercentSpan); 4085 } 4056 4086 else 4057 4087 vmdkFreeImage(pImage, rc != VERR_ALREADY_EXISTS); … … 5198 5228 AssertReturn((VALID_PTR(pszFilename) && *pszFilename), VERR_INVALID_PARAMETER); 5199 5229 5200 PVMDKIMAGE pImage = (PVMDKIMAGE)RTMemAllocZ( sizeof(VMDKIMAGE));5230 PVMDKIMAGE pImage = (PVMDKIMAGE)RTMemAllocZ(RT_UOFFSETOF(VMDKIMAGE, RegionList.aRegions[1])); 5201 5231 if (RT_LIKELY(pImage)) 5202 5232 { … … 5259 5289 && VALID_PTR(pLCHSGeometry), VERR_INVALID_PARAMETER); 5260 5290 5261 PVMDKIMAGE pImage = (PVMDKIMAGE)RTMemAllocZ( sizeof(VMDKIMAGE));5291 PVMDKIMAGE pImage = (PVMDKIMAGE)RTMemAllocZ(RT_UOFFSETOF(VMDKIMAGE, RegionList.aRegions[1])); 5262 5292 if (RT_LIKELY(pImage)) 5263 5293 { … … 5913 5943 } 5914 5944 5915 /** @copydoc VDIMAGEBACKEND::pfnGetSectorSize */5916 static DECLCALLBACK(uint32_t) vmdkGetSectorSize(void *pBackendData)5917 {5918 LogFlowFunc(("pBackendData=%#p\n", pBackendData));5919 PVMDKIMAGE pImage = (PVMDKIMAGE)pBackendData;5920 5921 AssertPtrReturn(pImage, 0);5922 5923 return 512;5924 }5925 5926 /** @copydoc VDIMAGEBACKEND::pfnGetSize */5927 static DECLCALLBACK(uint64_t) vmdkGetSize(void *pBackendData)5928 {5929 LogFlowFunc(("pBackendData=%#p\n", pBackendData));5930 PVMDKIMAGE pImage = (PVMDKIMAGE)pBackendData;5931 5932 AssertPtrReturn(pImage, 0);5933 5934 return pImage->cbSize;5935 }5936 5937 5945 /** @copydoc VDIMAGEBACKEND::pfnGetFileSize */ 5938 5946 static DECLCALLBACK(uint64_t) vmdkGetFileSize(void *pBackendData) … … 6056 6064 LogFlowFunc(("returns %Rrc\n", rc)); 6057 6065 return rc; 6066 } 6067 6068 /** @copydoc VDIMAGEBACKEND::pfnQueryRegions */ 6069 static DECLCALLBACK(int) vmdkQueryRegions(void *pBackendData, PCVDREGIONLIST *ppRegionList) 6070 { 6071 LogFlowFunc(("pBackendData=%#p ppRegionList=%#p\n", pBackendData, ppRegionList)); 6072 PVMDKIMAGE pThis = (PVMDKIMAGE)pBackendData; 6073 6074 AssertPtrReturn(pThis, VERR_VD_NOT_OPENED); 6075 6076 *ppRegionList = &pThis->RegionList; 6077 LogFlowFunc(("returns %Rrc\n", VINF_SUCCESS)); 6078 return VINF_SUCCESS; 6079 } 6080 6081 /** @copydoc VDIMAGEBACKEND::pfnRegionListRelease */ 6082 static DECLCALLBACK(void) vmdkRegionListRelease(void *pBackendData, PCVDREGIONLIST pRegionList) 6083 { 6084 RT_NOREF1(pRegionList); 6085 LogFlowFunc(("pBackendData=%#p pRegionList=%#p\n", pBackendData, pRegionList)); 6086 PVMDKIMAGE pThis = (PVMDKIMAGE)pBackendData; 6087 AssertPtr(pThis); RT_NOREF(pThis); 6088 6089 /* Nothing to do here. */ 6058 6090 } 6059 6091 … … 6401 6433 /* pfnGetVersion */ 6402 6434 vmdkGetVersion, 6403 /* pfnGetSectorSize */6404 vmdkGetSectorSize,6405 /* pfnGetSize */6406 vmdkGetSize,6407 6435 /* pfnGetFileSize */ 6408 6436 vmdkGetFileSize, … … 6416 6444 vmdkSetLCHSGeometry, 6417 6445 /* pfnQueryRegions */ 6418 NULL,6446 vmdkQueryRegions, 6419 6447 /* pfnRegionListRelease */ 6420 NULL,6448 vmdkRegionListRelease, 6421 6449 /* pfnGetImageFlags */ 6422 6450 vmdkGetImageFlags,
Note:
See TracChangeset
for help on using the changeset viewer.