VirtualBox

Changeset 2661 in vbox for trunk/src


Ignore:
Timestamp:
May 16, 2007 11:48:06 AM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
21207
Message:

Raw disk access VMDKs can now be generated, too.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/VmdkHDDCore.cpp

    r2650 r2661  
    295295    /** Image type. */
    296296    VDIMAGETYPE     enmImageType;
     297    /** Image flags defined during creation or determined during open. */
     298    unsigned        uImageFlags;
    297299    /** Total size of the image. */
    298300    uint64_t        cbSize;
     
    478480    size_t cbGTRounded;
    479481    uint64_t cbOverhead;
    480    
     482
    481483    if (fPreAlloc)
    482484        cbGTRounded = RT_ALIGN_64(pExtent->cGDEntries * pExtent->cGTEntries * sizeof(uint32_t), 512);
     
    587589}
    588590
    589 static int vmdkDescInitStr(PVMDKIMAGE pImage, PVMDKDESCRIPTOR pDescriptor, 
     591static int vmdkDescInitStr(PVMDKIMAGE pImage, PVMDKDESCRIPTOR pDescriptor,
    590592                           const char *pszLine)
    591593{
     
    10441046    if (VBOX_FAILURE(rc))
    10451047        goto out;
    1046     rc = vmdkDescInitStr(pImage, pDescriptor, "# DDB");
     1048    rc = vmdkDescInitStr(pImage, pDescriptor, "#DDB");
    10471049    if (VBOX_FAILURE(rc))
    10481050        goto out;
     
    15661568        RTFileClose(pExtent->File);
    15671569        pExtent->File = NIL_RTFILE;
    1568         if (fDelete && pExtent->pszFullname)
     1570        if (    fDelete
     1571            &&  strcmp(pExtent->pszFullname, pExtent->pszBasename) != 0
     1572            && pExtent->pszFullname)
    15691573            RTFileDelete(pExtent->pszFullname);
    15701574    }
     
    16631667        goto out;
    16641668    }
     1669
     1670    /** @todo set up pImage->uImageFlags accordingly somewhere during open. */
    16651671
    16661672    /* Handle the file according to its magic number. */
     
    18841890}
    18851891
    1886 static int vmdkCreateImage(PVMDKIMAGE pImage, const char *pszFilename, VDIMAGETYPE enmType, uint64_t cbSize, unsigned uImageFlags, uint32_t cCylinders, uint32_t cHeads, uint32_t cSectors)
     1892static int vmdkCreateImage(PVMDKIMAGE pImage, const char *pszFilename, VDIMAGETYPE enmType, uint64_t cbSize, unsigned uImageFlags, const char *pszComment, uint32_t cCylinders, uint32_t cHeads, uint32_t cSectors)
    18871893{
    18881894    int rc;
     
    18901896    PVMDKEXTENT pExtent;
    18911897
     1898    pImage->uImageFlags = uImageFlags;
    18921899    rc = vmdkCreateDescriptor(pImage, pImage->pDescData, pImage->cbDescAlloc, &pImage->Descriptor);
    18931900    if (VBOX_FAILURE(rc))
     
    18981905
    18991906    if (    enmType == VD_IMAGE_TYPE_FIXED
    1900         ||  uImageFlags == VD_VMDK_IMAGE_FLAGS_SPLIT_2G)
     1907        ||  (uImageFlags & VD_VMDK_IMAGE_FLAGS_SPLIT_2G)
     1908        ||  (uImageFlags & VD_VMDK_IMAGE_FLAGS_RAWDISK))
    19011909    {
    19021910        /* Fixed images and split images in general have a separate descriptor
    19031911         * file. This is the more complicated case, as it requires setting up
    19041912         * potentially more than one extent, including filename generation. */
    1905         rc = VERR_NOT_IMPLEMENTED;
    1906         goto out;
     1913
     1914        if (    enmType == VD_IMAGE_TYPE_FIXED
     1915            &&  (uImageFlags & VD_VMDK_IMAGE_FLAGS_RAWDISK))
     1916        {
     1917            PVBOXHDDRAW pRaw = (PVBOXHDDRAW)(void *)pszComment;
     1918            if (pRaw->fRawDisk)
     1919            {
     1920                /* Full raw disk access. This requires setting up a descriptor
     1921                 * file and open the (flat) raw disk. */
     1922                rc = vmdkCreateExtents(pImage, 1);
     1923                if (VBOX_FAILURE(rc))
     1924                {
     1925                    rc = vmdkError(pImage, rc, RT_SRC_POS, N_("VMDK: could not create new extent list in '%s'"), pszFilename);
     1926                    goto out;
     1927                }
     1928                pExtent = &pImage->pExtents[0];
     1929                rc = RTFileOpen(&pImage->File, pszFilename,
     1930                                RTFILE_O_READWRITE | RTFILE_O_CREATE | RTFILE_O_DENY_WRITE);
     1931                if (VBOX_FAILURE(rc))
     1932                {
     1933                    rc = vmdkError(pImage, rc, RT_SRC_POS, N_("VMDK: could not create new file '%s'"), pszFilename);
     1934                    goto out;
     1935                }
     1936
     1937                /* Set up basename for extent description. Cannot use StrDup. */
     1938                size_t cbBasename = strlen(pRaw->pszRawDisk) + 1;
     1939                char *pszBasename = (char *)RTMemTmpAlloc(cbBasename);
     1940                if (!pszBasename)
     1941                {
     1942                    rc = VERR_NO_MEMORY;
     1943                    goto out;
     1944                }
     1945                memcpy(pszBasename, pRaw->pszRawDisk, cbBasename);
     1946                pExtent->pszBasename = pszBasename;
     1947                /* For raw disks the full name is identical to the base name. */
     1948                pExtent->pszFullname = RTStrDup(pszBasename);
     1949                if (!pExtent->pszFullname)
     1950                {
     1951                    rc = VERR_NO_MEMORY;
     1952                    goto out;
     1953                }
     1954                pExtent->enmType = VMDKETYPE_FLAT;
     1955                pExtent->cNominalSectors = VMDK_BYTE2SECTOR(cbSize);
     1956                pExtent->uSectorOffset = 0;
     1957                pExtent->enmAccess = VMDKACCESS_READWRITE;
     1958                pExtent->fMetaDirty = true;
     1959
     1960                pImage->enmImageType = enmType;
     1961                rc = vmdkDescSetStr(pImage, &pImage->Descriptor, pImage->Descriptor.uFirstDesc, "createType", "\"fullDevice\"");
     1962                if (VBOX_FAILURE(rc))
     1963                {
     1964                    rc = vmdkError(pImage, rc, RT_SRC_POS, N_("VMDK: could not set the image type in '%s'"), pszFilename);
     1965                    goto out;
     1966                }
     1967
     1968                /* Open flat image, the raw disk. */
     1969                rc = RTFileOpen(&pExtent->File, pExtent->pszFullname,
     1970                                RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
     1971                if (VBOX_FAILURE(rc))
     1972                {
     1973                    rc = vmdkError(pImage, rc, RT_SRC_POS, N_("VMDK: could not open raw disk file '%s'"), pExtent->pszFullname);
     1974                    goto out;
     1975                }
     1976            }
     1977            else
     1978            {
     1979                /******* fixme. */
     1980                rc = VERR_NOT_IMPLEMENTED;
     1981                goto out;
     1982            }
     1983        }
     1984        else
     1985        {
     1986            rc = VERR_NOT_IMPLEMENTED;
     1987            goto out;
     1988        }
    19071989    }
    19081990    else
     
    19171999        pExtent = &pImage->pExtents[0];
    19182000        pImage->File = NIL_RTFILE;
    1919         rc = RTFileOpen(&pExtent->File, pszFilename, 
     2001        rc = RTFileOpen(&pExtent->File, pszFilename,
    19202002                        RTFILE_O_READWRITE | RTFILE_O_CREATE | RTFILE_O_DENY_WRITE);
    19212003        if (VBOX_FAILURE(rc))
     
    24682550
    24692551    rc = vmdkCreateImage(pImage, pszFilename, enmType, cbSize, uImageFlags,
    2470                          cCylinders, cHeads, cSectors);
     2552                         pszComment, cCylinders, cHeads, cSectors);
    24712553    if (VBOX_SUCCESS(rc))
    24722554    {
Note: See TracChangeset for help on using the changeset viewer.

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