Changeset 50988 in vbox
- Timestamp:
- Apr 7, 2014 7:36:54 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 93172
- Location:
- trunk
- Files:
-
- 1 added
- 14 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vd-cache-backend.h
r50981 r50988 66 66 67 67 /** 68 * Handle of loaded plugin library, NIL_RTLDRMOD for static backends.69 */70 RTLDRMOD hPlugin;71 72 /**73 68 * Probes the given image. 74 69 * … … 318 313 319 314 } VDCACHEBACKEND; 320 321 /** Pointer to VD backend. */ 315 /** Pointer to VD cache backend. */ 322 316 typedef VDCACHEBACKEND *PVDCACHEBACKEND; 323 324 317 /** Constant pointer to VD backend. */ 325 318 typedef const VDCACHEBACKEND *PCVDCACHEBACKEND; 326 319 327 /** Initialization entry point. */328 typedef DECLCALLBACK(int) FNVDCACHEFORMATLOAD(PVDCACHEBACKEND *ppBackendTable);329 typedef FNVDCACHEFORMATLOAD *PFNVDCACHEFORMATLOAD;330 #define VD_CACHEFORMAT_LOAD_NAME "VDCacheFormatLoad"331 332 /** The prefix to identify Storage Plugins. */333 #define VD_CACHEFORMAT_PLUGIN_PREFIX "VDCache"334 /** The size of the prefix excluding the '\\0' terminator. */335 #define VD_CACHEFORMAT_PLUGIN_PREFIX_LENGTH (sizeof(VD_CACHEFORMAT_PLUGIN_PREFIX)-1)336 337 320 #endif -
trunk/include/VBox/vd-ifs-internal.h
r49833 r50988 586 586 587 587 588 /** 589 * Interface for the metadata traverse callback. 590 * 591 * Per-operation interface. Present only for the metadata traverse callback. 592 */ 593 typedef struct VDINTERFACETRAVERSEMETADATA 594 { 595 /** 596 * Common interface header. 597 */ 598 VDINTERFACE Core; 599 600 /** 601 * Traverse callback. 602 * 603 * @returns VBox status code. 604 * @param pvUser The opaque data passed for the operation. 605 * @param pvMetadataChunk Pointer to a chunk of the image metadata. 606 * @param cbMetadataChunk Size of the metadata chunk 607 */ 608 DECLR3CALLBACKMEMBER(int, pfnMetadataCallback, (void *pvUser, const void *pvMetadataChunk, 609 size_t cbMetadataChunk)); 610 611 } VDINTERFACETRAVERSEMETADATA, *PVDINTERFACETRAVERSEMETADATA; 612 613 614 /** 615 * Get parent state interface from interface list. 616 * 617 * @return Pointer to the first parent state interface in the list. 618 * @param pVDIfs Pointer to the interface list. 619 */ 620 DECLINLINE(PVDINTERFACETRAVERSEMETADATA) VDIfTraverseMetadataGet(PVDINTERFACE pVDIfs) 621 { 622 PVDINTERFACE pIf = VDInterfaceGet(pVDIfs, VDINTERFACETYPE_TRAVERSEMETADATA); 623 624 /* Check that the interface descriptor the correct interface. */ 625 AssertMsgReturn( !pIf 626 || ( (pIf->enmInterface == VDINTERFACETYPE_TRAVERSEMETADATA) 627 && (pIf->cbSize == sizeof(VDINTERFACETRAVERSEMETADATA))), 628 ("Not a traverse metadata interface"), NULL); 629 630 return (PVDINTERFACETRAVERSEMETADATA)pIf; 631 } 632 588 633 RT_C_DECLS_END 589 634 -
trunk/include/VBox/vd-ifs.h
r48871 r50988 68 68 /** Interface to query the use of block ranges on the disk. Per-operation. */ 69 69 VDINTERFACETYPE_QUERYRANGEUSE, 70 /** Interface for the metadata traverse callback. Per-operation. */ 71 VDINTERFACETYPE_TRAVERSEMETADATA, 70 72 /** invalid interface. */ 71 73 VDINTERFACETYPE_INVALID -
trunk/include/VBox/vd-image-backend.h
r50981 r50988 1 1 /** @file 2 * Internal hard disk format support API for VBoxHDD.2 * VD: Image backend interface. 3 3 */ 4 4 5 5 /* 6 * Copyright (C) 2006-201 3Oracle Corporation6 * Copyright (C) 2006-2014 Oracle Corporation 7 7 * 8 8 * This file is part of VirtualBox Open Source Edition (OSE), as … … 24 24 */ 25 25 26 #ifndef __ VBoxHDD_Plugin_h__27 #define __ VBoxHDD_Plugin_h__26 #ifndef __vd_image_backend_h__ 27 #define __vd_image_backend_h__ 28 28 29 29 #include <VBox/vd.h> … … 50 50 /** @}*/ 51 51 52 /** @name VBox HDD backend metadata traverse flags 53 * @{ 54 */ 55 /** Include per block metadata while traversing the metadata. 56 * This might take much longer instead of traversing just global metadata. */ 57 #define VD_TRAVERSE_METADATA_INCLUDE_PER_BLOCK_METADATA RT_BIT(0) 58 /** @}*/ 52 59 53 60 /** … … 85 92 */ 86 93 PCVDCONFIGINFO paConfigInfo; 87 88 /**89 * Handle of loaded plugin library, NIL_RTLDRMOD for static backends.90 */91 RTLDRMOD hPlugin;92 94 93 95 /** … … 566 568 PVDINTERFACE pVDIfsImage, uint32_t fFlags)); 567 569 570 /** 571 * Traverse all metadata of the opened image. 572 * 573 * @returns VBox status code. 574 * @param pBackendData Opaque state data for this image. 575 * @param fFlags Traverse flags, combination of VD_TRAVERSE_METDATA_* defines. 576 * @param pVDIfsDisk Pointer to the per-disk VD interface list. 577 * @param pVDIfsImage Pointer to the per-image VD interface list. 578 * @param pVDIfsOperation Pointer to the per-operation VD interface list. 579 */ 580 DECLR3CALLBACKMEMBER(int, pfnTraverseMetadata, (void *pBackendData, uint32_t fFlags, 581 PVDINTERFACE pVDIfsDisk, 582 PVDINTERFACE pVDIfsImage, 583 PVDINTERFACE pVDIfsOperation)); 584 568 585 } VBOXHDDBACKEND; 569 586 570 587 /** Pointer to VD backend. */ 571 588 typedef VBOXHDDBACKEND *PVBOXHDDBACKEND; 572 573 589 /** Constant pointer to VD backend. */ 574 590 typedef const VBOXHDDBACKEND *PCVBOXHDDBACKEND; … … 587 603 } 588 604 589 /** Initialization entry point. */590 typedef DECLCALLBACK(int) VBOXHDDFORMATLOAD(PVBOXHDDBACKEND *ppBackendTable);591 typedef VBOXHDDFORMATLOAD *PFNVBOXHDDFORMATLOAD;592 #define VBOX_HDDFORMAT_LOAD_NAME "VBoxHDDFormatLoad"593 594 /** The prefix to identify Storage Plugins. */595 #define VBOX_HDDFORMAT_PLUGIN_PREFIX "VBoxHDD"596 /** The size of the prefix excluding the '\\0' terminator. */597 #define VBOX_HDDFORMAT_PLUGIN_PREFIX_LENGTH (sizeof(VBOX_HDDFORMAT_PLUGIN_PREFIX)-1)598 599 605 #endif -
trunk/src/VBox/Storage/DMG.cpp
r48871 r50988 35 35 #include <iprt/formats/xar.h> 36 36 37 #include "VDBackends.h" 37 38 38 39 /******************************************************************************* … … 2471 2472 2472 2473 2473 VBOXHDDBACKEND g_DmgBackend =2474 const VBOXHDDBACKEND g_DmgBackend = 2474 2475 { 2475 2476 /* pszBackendName */ … … 2483 2484 /* paConfigInfo */ 2484 2485 NULL, 2485 /* hPlugin */2486 NIL_RTLDRMOD,2487 2486 /* pfnCheckIfValid */ 2488 2487 dmgCheckIfValid, … … 2566 2565 NULL, 2567 2566 /* pfnRepair */ 2567 NULL, 2568 /* pfnTraverseMetadata */ 2568 2569 NULL 2569 2570 }; -
trunk/src/VBox/Storage/ISCSI.cpp
r50304 r50988 37 37 #include <VBox/scsi.h> 38 38 39 #include "VDBackends.h" 39 40 40 41 /******************************************************************************* … … 5459 5460 5460 5461 5461 VBOXHDDBACKEND g_ISCSIBackend =5462 const VBOXHDDBACKEND g_ISCSIBackend = 5462 5463 { 5463 5464 /* pszBackendName */ … … 5471 5472 /* paConfigInfo */ 5472 5473 s_iscsiConfigInfo, 5473 /* hPlugin */5474 NIL_RTLDRMOD,5475 5474 /* pfnCheckIfValid */ 5476 5475 iscsiCheckIfValid, … … 5554 5553 NULL, 5555 5554 /* pfnRepair */ 5555 NULL, 5556 /* pfnTraverseMetadata */ 5556 5557 NULL 5557 5558 }; -
trunk/src/VBox/Storage/Parallels.cpp
r49039 r50988 28 28 #include <iprt/string.h> 29 29 #include <iprt/asm.h> 30 31 #include "VDBackends.h" 30 32 31 33 #define PARALLELS_HEADER_MAGIC "WithoutFreeSpace" … … 1203 1205 1204 1206 1205 VBOXHDDBACKEND g_ParallelsBackend =1207 const VBOXHDDBACKEND g_ParallelsBackend = 1206 1208 { 1207 1209 /* pszBackendName */ … … 1215 1217 /* paConfigInfo */ 1216 1218 NULL, 1217 /* hPlugin */1218 NIL_RTLDRMOD,1219 1219 /* pfnCheckIfValid */ 1220 1220 parallelsCheckIfValid, … … 1298 1298 NULL, 1299 1299 /* pfnRepair */ 1300 NULL, 1301 /* pfnTraverseMetadata */ 1300 1302 NULL 1301 1303 }; -
trunk/src/VBox/Storage/QCOW.cpp
r48851 r50988 30 30 #include <iprt/path.h> 31 31 #include <iprt/list.h> 32 33 #include "VDBackends.h" 32 34 33 35 /** … … 2460 2462 2461 2463 2462 VBOXHDDBACKEND g_QCowBackend =2464 const VBOXHDDBACKEND g_QCowBackend = 2463 2465 { 2464 2466 /* pszBackendName */ … … 2472 2474 /* paConfigInfo */ 2473 2475 NULL, 2474 /* hPlugin */2475 NIL_RTLDRMOD,2476 2476 /* pfnCheckIfValid */ 2477 2477 qcowCheckIfValid, … … 2555 2555 NULL, 2556 2556 /* pfnRepair */ 2557 NULL, 2558 /* pfnTraverseMetadata */ 2557 2559 NULL 2558 2560 }; -
trunk/src/VBox/Storage/QED.cpp
r48851 r50988 30 30 #include <iprt/path.h> 31 31 #include <iprt/list.h> 32 33 #include "VDBackends.h" 32 34 33 35 /** … … 2598 2600 2599 2601 2600 VBOXHDDBACKEND g_QedBackend =2602 const VBOXHDDBACKEND g_QedBackend = 2601 2603 { 2602 2604 /* pszBackendName */ … … 2610 2612 /* paConfigInfo */ 2611 2613 NULL, 2612 /* hPlugin */2613 NIL_RTLDRMOD,2614 2614 /* pfnCheckIfValid */ 2615 2615 qedCheckIfValid, … … 2693 2693 qedResize, 2694 2694 /* pfnRepair */ 2695 NULL, 2696 /* pfnTraverseMetadata */ 2695 2697 NULL 2696 2698 }; -
trunk/src/VBox/Storage/RAW.cpp
r49039 r50988 27 27 #include <iprt/alloc.h> 28 28 #include <iprt/path.h> 29 30 #include "VDBackends.h" 29 31 30 32 /******************************************************************************* … … 1127 1129 1128 1130 1129 VBOXHDDBACKEND g_RawBackend =1131 const VBOXHDDBACKEND g_RawBackend = 1130 1132 { 1131 1133 /* pszBackendName */ … … 1139 1141 /* paConfigInfo */ 1140 1142 NULL, 1141 /* hPlugin */1142 NIL_RTLDRMOD,1143 1143 /* pfnCheckIfValid */ 1144 1144 rawCheckIfValid, … … 1222 1222 NULL, 1223 1223 /* pfnRepair */ 1224 NULL, 1225 /* pfnTraverseMetadata */ 1224 1226 NULL 1225 1227 }; -
trunk/src/VBox/Storage/VCICache.cpp
r45486 r50988 20 20 *******************************************************************************/ 21 21 #define LOG_GROUP LOG_GROUP_VD_RAW /** @todo logging group */ 22 #include <VBox/vd-cache- plugin.h>22 #include <VBox/vd-cache-backend.h> 23 23 #include <VBox/err.h> 24 24 … … 28 28 #include <iprt/file.h> 29 29 #include <iprt/asm.h> 30 31 #include "VDBackends.h" 30 32 31 33 /******************************************************************************* … … 1957 1959 1958 1960 1959 VDCACHEBACKEND g_VciCacheBackend =1961 const VDCACHEBACKEND g_VciCacheBackend = 1960 1962 { 1961 1963 /* pszBackendName */ … … 1969 1971 /* paConfigInfo */ 1970 1972 NULL, 1971 /* hPlugin */1972 NIL_RTLDRMOD,1973 1973 /* pfnProbe */ 1974 1974 vciProbe, -
trunk/src/VBox/Storage/VD.cpp
r50852 r50988 42 42 43 43 #include <VBox/vd-plugin.h> 44 #include <VBox/vd-cache-plugin.h> 44 45 #include "VDBackends.h" 45 46 46 47 /** Disable dynamic backends on non x86 architectures. This feature … … 552 553 #define VDMETAXFER_TXDIR_SET(flags, dir) ((flags) = (flags & ~VDMETAXFER_TXDIR_MASK) | (dir)) 553 554 554 extern VBOXHDDBACKEND g_RawBackend; 555 extern VBOXHDDBACKEND g_VmdkBackend; 556 extern VBOXHDDBACKEND g_VDIBackend; 557 extern VBOXHDDBACKEND g_VhdBackend; 558 extern VBOXHDDBACKEND g_ParallelsBackend; 559 extern VBOXHDDBACKEND g_DmgBackend; 560 extern VBOXHDDBACKEND g_ISCSIBackend; 561 extern VBOXHDDBACKEND g_QedBackend; 562 extern VBOXHDDBACKEND g_QCowBackend; 563 extern VBOXHDDBACKEND g_VhdxBackend; 564 555 /** 556 * Plugin structure. 557 */ 558 typedef struct VDPLUGIN 559 { 560 /** Pointer to the next plugin structure. */ 561 RTLISTNODE NodePlugin; 562 /** Handle of loaded plugin library. */ 563 RTLDRMOD hPlugin; 564 } VDPLUGIN; 565 /** Pointer to a plugin structure. */ 566 typedef VDPLUGIN *PVDPLUGIN; 567 568 /** Head of loaded plugin list. */ 569 static RTLISTANCHOR g_ListPluginsLoaded; 570 571 /** Number of image backends supported. */ 565 572 static unsigned g_cBackends = 0; 566 static PVBOXHDDBACKEND *g_apBackends = NULL; 567 static PVBOXHDDBACKEND aStaticBackends[] = 573 /** Array of pointers to the image backends. */ 574 static PCVBOXHDDBACKEND *g_apBackends = NULL; 575 /** Builtin image backends. */ 576 static PCVBOXHDDBACKEND aStaticBackends[] = 568 577 { 569 578 &g_VmdkBackend, … … 579 588 }; 580 589 581 /** 582 * Supported backends for the disk cache. 583 */ 584 extern VDCACHEBACKEND g_VciCacheBackend; 585 590 /** Number of supported cache backends. */ 586 591 static unsigned g_cCacheBackends = 0; 587 static PVDCACHEBACKEND *g_apCacheBackends = NULL; 588 static PVDCACHEBACKEND aStaticCacheBackends[] = 592 /** Array of pointers to the cache backends. */ 593 static PCVDCACHEBACKEND *g_apCacheBackends = NULL; 594 /** Builtin cache backends. */ 595 static PCVDCACHEBACKEND aStaticCacheBackends[] = 589 596 { 590 597 &g_VciCacheBackend … … 601 608 * internal: add several backends. 602 609 */ 603 static int vdAddBackends(P VBOXHDDBACKEND *ppBackends, unsigned cBackends)604 { 605 P VBOXHDDBACKEND *pTmp = (PVBOXHDDBACKEND*)RTMemRealloc(g_apBackends,606 (g_cBackends + cBackends) * sizeof(P VBOXHDDBACKEND));610 static int vdAddBackends(PCVBOXHDDBACKEND *ppBackends, unsigned cBackends) 611 { 612 PCVBOXHDDBACKEND *pTmp = (PCVBOXHDDBACKEND*)RTMemRealloc(g_apBackends, 613 (g_cBackends + cBackends) * sizeof(PCVBOXHDDBACKEND)); 607 614 if (RT_UNLIKELY(!pTmp)) 608 615 return VERR_NO_MEMORY; 609 616 g_apBackends = pTmp; 610 memcpy(&g_apBackends[g_cBackends], ppBackends, cBackends * sizeof(P VBOXHDDBACKEND));617 memcpy(&g_apBackends[g_cBackends], ppBackends, cBackends * sizeof(PCVBOXHDDBACKEND)); 611 618 g_cBackends += cBackends; 612 619 return VINF_SUCCESS; … … 616 623 * internal: add single backend. 617 624 */ 618 DECLINLINE(int) vdAddBackend(P VBOXHDDBACKEND pBackend)625 DECLINLINE(int) vdAddBackend(PCVBOXHDDBACKEND pBackend) 619 626 { 620 627 return vdAddBackends(&pBackend, 1); … … 624 631 * internal: add several cache backends. 625 632 */ 626 static int vdAddCacheBackends(P VDCACHEBACKEND *ppBackends, unsigned cBackends)627 { 628 P VDCACHEBACKEND *pTmp = (PVDCACHEBACKEND*)RTMemRealloc(g_apCacheBackends,629 (g_cCacheBackends + cBackends) * sizeof(P VDCACHEBACKEND));633 static int vdAddCacheBackends(PCVDCACHEBACKEND *ppBackends, unsigned cBackends) 634 { 635 PCVDCACHEBACKEND *pTmp = (PCVDCACHEBACKEND*)RTMemRealloc(g_apCacheBackends, 636 (g_cCacheBackends + cBackends) * sizeof(PCVDCACHEBACKEND)); 630 637 if (RT_UNLIKELY(!pTmp)) 631 638 return VERR_NO_MEMORY; 632 639 g_apCacheBackends = pTmp; 633 memcpy(&g_apCacheBackends[g_cCacheBackends], ppBackends, cBackends * sizeof(P VDCACHEBACKEND));640 memcpy(&g_apCacheBackends[g_cCacheBackends], ppBackends, cBackends * sizeof(PCVDCACHEBACKEND)); 634 641 g_cCacheBackends += cBackends; 635 642 return VINF_SUCCESS; … … 639 646 * internal: add single cache backend. 640 647 */ 641 DECLINLINE(int) vdAddCacheBackend(P VDCACHEBACKEND pBackend)648 DECLINLINE(int) vdAddCacheBackend(PCVDCACHEBACKEND pBackend) 642 649 { 643 650 return vdAddCacheBackends(&pBackend, 1); … … 3185 3192 } 3186 3193 3187 /** 3188 * internal: scans plugin directory and loads the backends have been found. 3194 #ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS 3195 /** 3196 * @copydoc VDPLUGIN::pfnRegisterImage 3197 */ 3198 static DECLCALLBACK(int) vdPluginRegisterImage(void *pvUser, PCVBOXHDDBACKEND pBackend) 3199 { 3200 int rc = VINF_SUCCESS; 3201 3202 if (pBackend->cbSize == sizeof(VBOXHDDBACKEND)) 3203 vdAddBackend(pBackend); 3204 else 3205 { 3206 LogFunc(("ignored plugin: pBackend->cbSize=%d rc=%Rrc\n", pBackend->cbSize)); 3207 rc = VERR_IGNORED; 3208 } 3209 3210 return rc; 3211 } 3212 3213 /** 3214 * @copydoc VDPLUGIN::pfnRegisterCache 3215 */ 3216 static DECLCALLBACK(int) vdPluginRegisterCache(void *pvUser, PCVDCACHEBACKEND pBackend) 3217 { 3218 int rc = VINF_SUCCESS; 3219 3220 if (pBackend->cbSize == sizeof(VDCACHEBACKEND)) 3221 vdAddCacheBackend(pBackend); 3222 else 3223 { 3224 LogFunc(("ignored plugin: pBackend->cbSize=%d rc=%Rrc\n", pBackend->cbSize)); 3225 rc = VERR_IGNORED; 3226 } 3227 3228 return rc; 3229 } 3230 3231 /** 3232 * Adds a plugin to the list of loaded plugins. 3233 * 3234 * @returns VBox status code. 3235 * @param hPlugin PLugin handle to add. 3236 */ 3237 static int vdAddPlugin(RTLDRMOD hPlugin) 3238 { 3239 int rc = VINF_SUCCESS; 3240 PVDPLUGIN pPlugin = (PVDPLUGIN)RTMemAllocZ(sizeof(VDPLUGIN)); 3241 3242 if (pPlugin) 3243 { 3244 pPlugin->hPlugin = hPlugin; 3245 RTListAppend(&g_ListPluginsLoaded, &pPlugin->NodePlugin); 3246 } 3247 else 3248 rc = VERR_NO_MEMORY; 3249 3250 return rc; 3251 } 3252 #endif 3253 3254 /** 3255 * internal: scans plugin directory and loads found plugins. 3189 3256 */ 3190 3257 static int vdLoadDynamicBackends() … … 3201 3268 3202 3269 /* To get all entries with VBoxHDD as prefix. */ 3203 char *pszPluginFilter = RTPathJoinA(szPath, V BOX_HDDFORMAT_PLUGIN_PREFIX "*");3270 char *pszPluginFilter = RTPathJoinA(szPath, VD_PLUGIN_PREFIX "*"); 3204 3271 if (!pszPluginFilter) 3205 3272 return VERR_NO_STR_MEMORY; … … 3227 3294 { 3228 3295 RTLDRMOD hPlugin = NIL_RTLDRMOD; 3229 PFNVBOXHDDFORMATLOAD pfnHDDFormatLoad = NULL;3230 PVBOXHDDBACKEND pBackend = NULL;3231 3296 char *pszPluginPath = NULL; 3232 3297 … … 3264 3329 if (RT_SUCCESS(rc)) 3265 3330 { 3266 rc = RTLdrGetSymbol(hPlugin, VBOX_HDDFORMAT_LOAD_NAME, (void**)&pfnHDDFormatLoad); 3267 if (RT_FAILURE(rc) || !pfnHDDFormatLoad) 3331 VDBACKENDREGISTER BackendRegister; 3332 PFNVDPLUGINLOAD pfnVDPluginLoad = NULL; 3333 3334 BackendRegister.pfnRegisterImage = vdPluginRegisterImage; 3335 BackendRegister.pfnRegisterCache = vdPluginRegisterCache; 3336 /** @todo: Filter plugins. */ 3337 3338 rc = RTLdrGetSymbol(hPlugin, VD_PLUGIN_LOAD_NAME, (void**)&pfnVDPluginLoad); 3339 if (RT_FAILURE(rc) || !pfnVDPluginLoad) 3268 3340 { 3269 LogFunc(("error resolving the entry point %s in plugin %s, rc=%Rrc, pfnHDDFormat=%#p\n", VBOX_HDDFORMAT_LOAD_NAME, pPluginDirEntry->szName, rc, pfnHDDFormatLoad)); 3341 LogFunc(("error resolving the entry point %s in plugin %s, rc=%Rrc, pfnVDPluginLoad=%#p\n", 3342 VD_PLUGIN_LOAD_NAME, pPluginDirEntry->szName, rc, pfnVDPluginLoad)); 3270 3343 if (RT_SUCCESS(rc)) 3271 3344 rc = VERR_SYMBOL_NOT_FOUND; … … 3275 3348 { 3276 3349 /* Get the function table. */ 3277 rc = pfnHDDFormatLoad(&pBackend); 3278 if (RT_SUCCESS(rc) && pBackend->cbSize == sizeof(VBOXHDDBACKEND)) 3279 { 3280 pBackend->hPlugin = hPlugin; 3281 vdAddBackend(pBackend); 3282 } 3283 else 3284 LogFunc(("ignored plugin '%s': pBackend->cbSize=%d rc=%Rrc\n", pszPluginPath, pBackend->cbSize, rc)); 3350 rc = pfnVDPluginLoad(NULL, &BackendRegister); 3285 3351 } 3286 3352 else 3287 3353 LogFunc(("ignored plugin '%s': rc=%Rrc\n", pszPluginPath, rc)); 3288 3354 3289 if (RT_FAILURE(rc)) 3290 RTLdrClose(hPlugin); 3291 } 3292 RTStrFree(pszPluginPath); 3293 } 3294 out: 3295 if (rc == VERR_NO_MORE_FILES) 3296 rc = VINF_SUCCESS; 3297 RTStrFree(pszPluginFilter); 3298 if (pPluginDirEntry) 3299 RTMemFree(pPluginDirEntry); 3300 if (pPluginDir) 3301 RTDirClose(pPluginDir); 3302 return rc; 3303 #else 3304 return VINF_SUCCESS; 3305 #endif 3306 } 3307 3308 /** 3309 * internal: scans plugin directory and loads the cache backends have been found. 3310 */ 3311 static int vdLoadDynamicCacheBackends() 3312 { 3313 #ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS 3314 int rc = VINF_SUCCESS; 3315 PRTDIR pPluginDir = NULL; 3316 3317 /* Enumerate plugin backends. */ 3318 char szPath[RTPATH_MAX]; 3319 rc = RTPathAppPrivateArch(szPath, sizeof(szPath)); 3320 if (RT_FAILURE(rc)) 3321 return rc; 3322 3323 /* To get all entries with VBoxHDD as prefix. */ 3324 char *pszPluginFilter = RTPathJoinA(szPath, VD_CACHEFORMAT_PLUGIN_PREFIX "*"); 3325 if (!pszPluginFilter) 3326 { 3327 rc = VERR_NO_STR_MEMORY; 3328 return rc; 3329 } 3330 3331 PRTDIRENTRYEX pPluginDirEntry = NULL; 3332 size_t cbPluginDirEntry = sizeof(RTDIRENTRYEX); 3333 /* The plugins are in the same directory as the other shared libs. */ 3334 rc = RTDirOpenFiltered(&pPluginDir, pszPluginFilter, RTDIRFILTER_WINNT, 0); 3335 if (RT_FAILURE(rc)) 3336 { 3337 /* On Windows the above immediately signals that there are no 3338 * files matching, while on other platforms enumerating the 3339 * files below fails. Either way: no plugins. */ 3340 goto out; 3341 } 3342 3343 pPluginDirEntry = (PRTDIRENTRYEX)RTMemAllocZ(sizeof(RTDIRENTRYEX)); 3344 if (!pPluginDirEntry) 3345 { 3346 rc = VERR_NO_MEMORY; 3347 goto out; 3348 } 3349 3350 while ((rc = RTDirReadEx(pPluginDir, pPluginDirEntry, &cbPluginDirEntry, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK)) != VERR_NO_MORE_FILES) 3351 { 3352 RTLDRMOD hPlugin = NIL_RTLDRMOD; 3353 PFNVDCACHEFORMATLOAD pfnVDCacheLoad = NULL; 3354 PVDCACHEBACKEND pBackend = NULL; 3355 char *pszPluginPath = NULL; 3356 3357 if (rc == VERR_BUFFER_OVERFLOW) 3358 { 3359 /* allocate new buffer. */ 3360 RTMemFree(pPluginDirEntry); 3361 pPluginDirEntry = (PRTDIRENTRYEX)RTMemAllocZ(cbPluginDirEntry); 3362 if (!pPluginDirEntry) 3363 { 3364 rc = VERR_NO_MEMORY; 3365 break; 3366 } 3367 /* Retry. */ 3368 rc = RTDirReadEx(pPluginDir, pPluginDirEntry, &cbPluginDirEntry, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK); 3369 if (RT_FAILURE(rc)) 3370 break; 3371 } 3372 else if (RT_FAILURE(rc)) 3373 break; 3374 3375 /* We got the new entry. */ 3376 if (!RTFS_IS_FILE(pPluginDirEntry->Info.Attr.fMode)) 3377 continue; 3378 3379 /* Prepend the path to the libraries. */ 3380 pszPluginPath = RTPathJoinA(szPath, pPluginDirEntry->szName); 3381 if (!pszPluginPath) 3382 { 3383 rc = VERR_NO_STR_MEMORY; 3384 break; 3385 } 3386 3387 rc = SUPR3HardenedLdrLoadPlugIn(pszPluginPath, &hPlugin, NULL); 3388 if (RT_SUCCESS(rc)) 3389 { 3390 rc = RTLdrGetSymbol(hPlugin, VD_CACHEFORMAT_LOAD_NAME, (void**)&pfnVDCacheLoad); 3391 if (RT_FAILURE(rc) || !pfnVDCacheLoad) 3392 { 3393 LogFunc(("error resolving the entry point %s in plugin %s, rc=%Rrc, pfnVDCacheLoad=%#p\n", 3394 VD_CACHEFORMAT_LOAD_NAME, pPluginDirEntry->szName, rc, pfnVDCacheLoad)); 3395 if (RT_SUCCESS(rc)) 3396 rc = VERR_SYMBOL_NOT_FOUND; 3397 } 3398 3355 /* Create a plugin entry on success. */ 3399 3356 if (RT_SUCCESS(rc)) 3400 { 3401 /* Get the function table. */ 3402 rc = pfnVDCacheLoad(&pBackend); 3403 if (RT_SUCCESS(rc) && pBackend->cbSize == sizeof(VDCACHEBACKEND)) 3404 { 3405 pBackend->hPlugin = hPlugin; 3406 vdAddCacheBackend(pBackend); 3407 } 3408 else 3409 LogFunc(("ignored plugin '%s': pBackend->cbSize=%d rc=%Rrc\n", pszPluginPath, pBackend->cbSize, rc)); 3410 } 3357 vdAddPlugin(hPlugin); 3411 3358 else 3412 LogFunc(("ignored plugin '%s': rc=%Rrc\n", pszPluginPath, rc));3413 3414 if (RT_FAILURE(rc))3415 3359 RTLdrClose(hPlugin); 3416 3360 } … … 5056 5000 if (RT_SUCCESS(rc)) 5057 5001 { 5002 RTListInit(&g_ListPluginsLoaded); 5058 5003 rc = vdLoadDynamicBackends(); 5059 if (RT_SUCCESS(rc))5060 rc = vdLoadDynamicCacheBackends();5061 5004 } 5062 5005 } … … 5072 5015 VBOXDDU_DECL(int) VDShutdown(void) 5073 5016 { 5074 P VBOXHDDBACKEND *pBackends = g_apBackends;5075 P VDCACHEBACKEND *pCacheBackends = g_apCacheBackends;5017 PCVBOXHDDBACKEND *pBackends = g_apBackends; 5018 PCVDCACHEBACKEND *pCacheBackends = g_apCacheBackends; 5076 5019 unsigned cBackends = g_cBackends; 5077 5020 5078 if (! pBackends)5021 if (!g_apBackends) 5079 5022 return VERR_INTERNAL_ERROR; 5023 5024 if (g_apCacheBackends) 5025 RTMemFree(g_apCacheBackends); 5026 RTMemFree(g_apBackends); 5080 5027 5081 5028 g_cBackends = 0; 5082 5029 g_apBackends = NULL; 5083 5030 5084 #ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS5085 for (unsigned i = 0; i < cBackends; i++)5086 if (pBackends[i]->hPlugin != NIL_RTLDRMOD)5087 RTLdrClose(pBackends[i]->hPlugin);5088 #endif5089 5090 5031 /* Clear the supported cache backends. */ 5091 cBackends = g_cCacheBackends;5092 5032 g_cCacheBackends = 0; 5093 5033 g_apCacheBackends = NULL; 5094 5034 5095 5035 #ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS 5096 for (unsigned i = 0; i < cBackends; i++) 5097 if (pCacheBackends[i]->hPlugin != NIL_RTLDRMOD) 5098 RTLdrClose(pCacheBackends[i]->hPlugin); 5036 PVDPLUGIN pPlugin, pPluginNext; 5037 5038 RTListForEachSafe(&g_ListPluginsLoaded, pPlugin, pPluginNext, VDPLUGIN, NodePlugin) 5039 { 5040 RTLdrClose(pPlugin->hPlugin); 5041 RTListNodeRemove(&pPlugin->NodePlugin); 5042 RTMemFree(pPlugin); 5043 } 5099 5044 #endif 5100 5045 5101 if (pCacheBackends)5102 RTMemFree(pCacheBackends);5103 RTMemFree(pBackends);5104 5046 return VINF_SUCCESS; 5105 5047 } -
trunk/src/VBox/Storage/VDI.cpp
r48851 r50988 30 30 #include <iprt/string.h> 31 31 #include <iprt/asm.h> 32 33 #include "VDBackends.h" 32 34 33 35 #define VDI_IMAGE_DEFAULT_BLOCK_SIZE _1M … … 3194 3196 } 3195 3197 3196 VBOXHDDBACKEND g_VDIBackend =3198 const VBOXHDDBACKEND g_VDIBackend = 3197 3199 { 3198 3200 /* pszBackendName */ … … 3207 3209 /* paConfigInfo */ 3208 3210 NULL, 3209 /* hPlugin */3210 NIL_RTLDRMOD,3211 3211 /* pfnCheckIfValid */ 3212 3212 vdiCheckIfValid, … … 3290 3290 vdiResize, 3291 3291 /* pfnRepair */ 3292 vdiRepair 3292 vdiRepair, 3293 /* pfnTraverseMetadata */ 3294 NULL 3293 3295 }; -
trunk/src/VBox/Storage/VHD.cpp
r50851 r50988 31 31 #include <iprt/path.h> 32 32 #include <iprt/string.h> 33 34 #include "VDBackends.h" 33 35 34 36 #define VHD_RELATIVE_MAX_PATH 512 … … 3188 3190 3189 3191 3190 VBOXHDDBACKEND g_VhdBackend =3192 const VBOXHDDBACKEND g_VhdBackend = 3191 3193 { 3192 3194 /* pszBackendName */ … … 3202 3204 /* paConfigInfo */ 3203 3205 NULL, 3204 /* hPlugin */3205 NIL_RTLDRMOD,3206 3206 /* pfnCheckIfValid */ 3207 3207 vhdCheckIfValid, … … 3285 3285 vhdResize, 3286 3286 /* pfnRepair */ 3287 vhdRepair 3287 vhdRepair, 3288 /* pfnTraverseMetadata */ 3289 NULL 3288 3290 }; -
trunk/src/VBox/Storage/VHDX.cpp
r50531 r50988 30 30 #include <iprt/uuid.h> 31 31 #include <iprt/crc.h> 32 33 #include "VDBackends.h" 32 34 33 35 /******************************************************************************* … … 2429 2431 2430 2432 2431 VBOXHDDBACKEND g_VhdxBackend =2433 const VBOXHDDBACKEND g_VhdxBackend = 2432 2434 { 2433 2435 /* pszBackendName */ … … 2441 2443 /* paConfigInfo */ 2442 2444 NULL, 2443 /* hPlugin */2444 NIL_RTLDRMOD,2445 2445 /* pfnCheckIfValid */ 2446 2446 vhdxCheckIfValid, … … 2524 2524 NULL, 2525 2525 /* pfnRepair */ 2526 NULL, 2527 /* pfnTraverseMetadata */ 2526 2528 NULL 2527 2529 }; -
trunk/src/VBox/Storage/VMDK.cpp
r49231 r50988 32 32 #include <iprt/zip.h> 33 33 #include <iprt/asm.h> 34 35 #include "VDBackends.h" 34 36 35 37 /******************************************************************************* … … 6561 6563 6562 6564 6563 VBOXHDDBACKEND g_VmdkBackend =6565 const VBOXHDDBACKEND g_VmdkBackend = 6564 6566 { 6565 6567 /* pszBackendName */ … … 6575 6577 /* paConfigInfo */ 6576 6578 NULL, 6577 /* hPlugin */6578 NIL_RTLDRMOD,6579 6579 /* pfnCheckIfValid */ 6580 6580 vmdkCheckIfValid, … … 6658 6658 NULL, 6659 6659 /* pfnRepair */ 6660 NULL, 6661 /* pfnTraverseMetadata */ 6660 6662 NULL 6661 6663 };
Note:
See TracChangeset
for help on using the changeset viewer.