VirtualBox

Changeset 4522 in vbox for trunk


Ignore:
Timestamp:
Sep 5, 2007 7:43:09 AM (17 years ago)
Author:
vboxsync
Message:

Add StorageCraft Backup images as HDD format

Location:
trunk/src/VBox/Devices
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Makefile.kmk

    r4491 r4522  
    3232SUBDIRS_CLEAN     = PC/Etherboot-src
    3333endif
     34
     35SUBDIRS_LIBRARIES += Storage/VBoxHDDFormats
    3436
    3537#
  • trunk/src/VBox/Devices/Storage/VBoxHDD-new.cpp

    r4071 r4522  
    3030#include <iprt/string.h>
    3131#include <iprt/asm.h>
     32#include <iprt/ldr.h>
    3233
    3334#include "VBoxHDD-newInternal.h"
     
    100101    void                *pvErrorUser;
    101102
     103    /** Handle for the shared object / DLL. */
     104    RTLDRMOD            pluginHandle;
    102105    /** Function pointers for the various backend methods. */
    103106    PVBOXHDDBACKEND     Backend;
     
    487490        }
    488491    }
     492
     493    /* If no static backend is found try loading a shared module with pszBackend as filename. */
     494    if (!pBackend)
     495    {
     496        RTLDRMOD ldrHandle;
     497        char *pszPluginName;
     498        size_t cbPluginName;
     499
     500        /* HDD Format Plugins have VBoxHDD as prefix, thatswhy we have to prepend it.
     501         * @todo: find out what to do if filenames are case sensitive.
     502         */
     503        cbPluginName = RTStrAPrintf(&pszPluginName, "VBoxHDD%s", pszBackend);
     504        if (cbPluginName == -1)
     505        {
     506            rc = VERR_NO_MEMORY;
     507        }
     508        else
     509        {
     510            /* try to load the plugin (RTldrLoad appends the suffix for the shared object/DLL). */
     511            rc = RTLdrLoad(pszPluginName, &ldrHandle);
     512            if (VBOX_SUCCESS(rc))
     513            {
     514                PFNVBOXHDDFORMATLOAD pfnHDDFormatLoad;
     515
     516                rc = RTLdrGetSymbol (ldrHandle, VBOX_HDDFORMAT_LOAD_NAME, (void**)&pfnHDDFormatLoad);
     517                if (VBOX_FAILURE(rc) || !pfnHDDFormatLoad)
     518                {
     519                    Log(("%s: Error resolving the entry point %s, rc = %d, pfnHDDFormat = %p\n", VBOX_HDDFORMAT_LOAD_NAME, rc, pfnHDDFormatLoad));
     520                    if (VBOX_SUCCESS(rc))
     521                       rc = VERR_SYMBOL_NOT_FOUND;
     522                }
     523                else
     524                {
     525                    /* Get the function table. */
     526                    pBackend = (PVBOXHDDBACKEND)RTMemAllocZ(sizeof(VBOXHDDBACKEND));
     527                    if (!pBackend)
     528                    {
     529                        rc = VERR_NO_MEMORY;
     530                    }
     531                    else
     532                    {
     533                        pBackend->cbSize = sizeof(VBOXHDDBACKEND);
     534                        rc = pfnHDDFormatLoad(pBackend);
     535                        if (VBOX_FAILURE(rc))
     536                        {
     537                            RTMemFree(pBackend);
     538                            pBackend = NULL;
     539                        }
     540                    }
     541                }
     542            }
     543            RTStrFree(pszPluginName);
     544        }
     545    }
     546
    489547    if (pBackend)
    490548    {
     
    533591    {
    534592        VDCloseAll(pDisk);
     593        RTLdrClose(pDisk->pluginHandle);
     594        RTMemFree(pDisk->Backend);
    535595        RTMemFree(pDisk);
    536596    }
  • trunk/src/VBox/Devices/Storage/VBoxHDD-newInternal.h

    r4071 r4522  
    2121#include <VBox/VBoxHDD-new.h>
    2222
    23 
    2423/**
    2524 * Image format backend interface used by VBox HDD Container implementation.
     
    2726typedef struct VBOXHDDBACKEND
    2827{
     28    /**
     29     * The size of the structure.
     30     */
     31    uint32_t cbSize;
     32
    2933    /**
    3034     * Open a disk image.
     
    277281} VBOXHDDBACKEND, *PVBOXHDDBACKEND;
    278282
     283/** Initialization entry point. */
     284typedef DECLCALLBACK(int) VBOXHDDFORMATLOAD(PVBOXHDDBACKEND pBackendTable);
     285typedef VBOXHDDFORMATLOAD *PFNVBOXHDDFORMATLOAD;
     286#define VBOX_HDDFORMAT_LOAD_NAME "VBoxHDDFormatLoad"
    279287
    280288#endif
  • trunk/src/VBox/Devices/Storage/VmdkHDDCore.cpp

    r4372 r4522  
    34803480VBOXHDDBACKEND g_VmdkBackend =
    34813481{
     3482    /* cbSize */
     3483    sizeof(VBOXHDDBACKEND),
    34823484    /* pfnOpen */
    34833485    vmdkOpen,
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette