DrvMediaISO.cpp revision 5b465a7c1237993faf8bb50120d247f3f0319ada
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VBox storage devices: ISO image media driver
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * additional information or have any questions.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Header Files *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d31ded334a29f575e23dc889b603b1a586759348vboxsync* Defined Constants And Macros *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync/** Converts a pointer to MEDIAISO::IMedia to a PRDVMEDIAISO. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define PDMIMEDIA_2_DRVMEDIAISO(pInterface) ( (PDRVMEDIAISO)((uintptr_t)pInterface - RT_OFFSETOF(DRVMEDIAISO, IMedia)) )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Converts a pointer to PDMDRVINS::IBase to a PPDMDRVINS. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define PDMIBASE_2_DRVINS(pInterface) ( (PPDMDRVINS)((uintptr_t)pInterface - RT_OFFSETOF(PDMDRVINS, IBase)) )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Converts a pointer to PDMDRVINS::IBase to a PVBOXHDD. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define PDMIBASE_2_DRVMEDIAISO(pInterface) ( PDMINS_2_DATA(PDMIBASE_2_DRVINS(pInterface), PDRVMEDIAISO) )
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Structures and Typedefs *
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Block driver instance data.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @implements PDMIMEDIA
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct DRVMEDIAISO
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync /** The media interface. */
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync /** Pointer to the driver instance. */
614cbe11a7e5588dc8d369e223174b1441a09359vboxsync /** Pointer to the filename. (Freed by MM) */
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync /** File handle of the ISO file. */
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync/* -=-=-=-=- PDMIMEDIA -=-=-=-=- */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnGetSize */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(uint64_t) drvMediaISOGetSize(PPDMIMEDIA pInterface)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDRVMEDIAISO pThis = PDMIMEDIA_2_DRVMEDIAISO(pInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("drvMediaISOGetSize: '%s'\n", pThis->pszFilename));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("drvMediaISOGetSize: returns %lld (%s)\n", cbFile, pThis->pszFilename));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("Error querying ISO file size, rc=%Rrc. (%s)\n", rc, pThis->pszFilename));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnBiosGetPCHSGeometry */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISOBiosGetPCHSGeometry(PPDMIMEDIA pInterface, PPDMMEDIAGEOMETRY pPCHSGeometry)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** @copydoc PDMIMEDIA::pfnBiosSetPCHSGeometry */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISOBiosSetPCHSGeometry(PPDMIMEDIA pInterface, PCPDMMEDIAGEOMETRY pPCHSGeometry)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** @copydoc PDMIMEDIA::pfnBiosGetLCHSGeometry */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISOBiosGetLCHSGeometry(PPDMIMEDIA pInterface, PPDMMEDIAGEOMETRY pLCHSGeometry)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** @copydoc PDMIMEDIA::pfnBiosSetLCHSGeometry */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISOBiosSetLCHSGeometry(PPDMIMEDIA pInterface, PCPDMMEDIAGEOMETRY pLCHSGeometry)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Read bits.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @see PDMIMEDIA::pfnRead for details.
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISORead(PPDMIMEDIA pInterface, uint64_t off, void *pvBuf, size_t cbRead)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync PDRVMEDIAISO pThis = PDMIMEDIA_2_DRVMEDIAISO(pInterface);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync LogFlow(("drvMediaISORead: off=%#llx pvBuf=%p cbRead=%#x (%s)\n", off, pvBuf, cbRead, pThis->pszFilename));
d1cbbd799d8912978f5146960b6780f387bb414bvboxsync * Seek to the position and read.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync int rc = RTFileSeek(pThis->File, off, RTFILE_SEEK_BEGIN, NULL);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log2(("drvMediaISORead: off=%#llx pvBuf=%p cbRead=%#x (%s)\n"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync "%16.*Rhxd\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("RTFileRead(%d, %p, %#x) -> %Rrc (off=%#llx '%s')\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->File, pvBuf, cbRead, rc, off, pThis->pszFilename));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("RTFileSeek(%d,%#llx,) -> %Rrc\n", pThis->File, off, rc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnWrite */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) drvMediaISOWrite(PPDMIMEDIA pInterface, uint64_t off, const void *pvBuf, size_t cbWrite)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("Attempt to write to an ISO file!\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnFlush */
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsyncstatic DECLCALLBACK(int) drvMediaISOFlush(PPDMIMEDIA pInterface)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* No buffered data that still needs to be written. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnGetUuid */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) drvMediaISOGetUuid(PPDMIMEDIA pInterface, PRTUUID pUuid)
750d4d0506a38b2e80c997075d40aad474e675fbvboxsync LogFlow(("drvMediaISOGetUuid: returns VERR_NOT_IMPLEMENTED\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnIsReadOnly */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(bool) drvMediaISOIsReadOnly(PPDMIMEDIA pInterface)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* -=-=-=-=- PDMIBASE -=-=-=-=- */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * @interface_method_impl{PDMIBASE,pfnQueryInterface}
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsyncstatic DECLCALLBACK(void *) drvMediaISOQueryInterface(PPDMIBASE pInterface, const char *pszIID)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_DRVINS(pInterface);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync PDRVMEDIAISO pThis = PDMINS_2_DATA(pDrvIns, PDRVMEDIAISO);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIA, &pThis->IMedia);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync/* -=-=-=-=- PDMDRVREG -=-=-=-=- */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * Destruct a driver instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Most VM resources are freed by the VM. This callback is provided so that any non-VM
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * resources can be freed correctly.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pDrvIns The driver instance data.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) drvMediaISODestruct(PPDMDRVINS pDrvIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDRVMEDIAISO pThis = PDMINS_2_DATA(pDrvIns, PDRVMEDIAISO);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync LogFlow(("drvMediaISODestruct: '%s'\n", pThis->pszFilename));
69deddbc68802f1cf1c3a404a9f816b8accb3385vboxsync * Construct a ISO media driver instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @copydoc FNPDMDRVCONSTRUCT
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsyncstatic DECLCALLBACK(int) drvMediaISOConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDRVMEDIAISO pThis = PDMINS_2_DATA(pDrvIns, PDRVMEDIAISO);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Init the static parts.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* IBase */
3ecd8008b81f02a04220705ae0033142af363280vboxsync pDrvIns->IBase.pfnQueryInterface = drvMediaISOQueryInterface;
3ecd8008b81f02a04220705ae0033142af363280vboxsync /* IMedia */
b978e5849454446957177fd47ee98609ab0457a6vboxsync pThis->IMedia.pfnIsReadOnly = drvMediaISOIsReadOnly;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync pThis->IMedia.pfnBiosGetPCHSGeometry = drvMediaISOBiosGetPCHSGeometry;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->IMedia.pfnBiosSetPCHSGeometry = drvMediaISOBiosSetPCHSGeometry;
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync pThis->IMedia.pfnBiosGetLCHSGeometry = drvMediaISOBiosGetLCHSGeometry;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->IMedia.pfnBiosSetLCHSGeometry = drvMediaISOBiosSetLCHSGeometry;
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync * Read the configuration.
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync int rc = CFGMR3QueryStringAlloc(pCfgHandle, "Path", &pszName);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return PDMDRV_SET_ERROR(pDrvIns, rc, N_("Failed to query \"Path\" from the config"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Open the image.
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("drvMediaISOConstruct: ISO image '%s' opened successfully.\n", pszName));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("Failed to open ISO file \"%s\""), pszName);
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync * ISO media driver registration record.
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /* u32Version */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync /* szName */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync "MediaISO",
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync /* szRCMod */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /* szR0Mod */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /* pszDescription */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync "ISO media access driver.",
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /* fFlags */
e50404712a2b5234c42bdf9740bddab5729ba188vboxsync /* fClass. */
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync /* cMaxInstances */
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync /* cbInstance */
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync /* pfnConstruct */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnDestruct */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync /* pfnRelocate */
806d0b554daa555364af5f87bc96eccbe760db7avboxsync /* pfnIOCtl */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnPowerOn */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnReset */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnSuspend */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnResume */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnAttach */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnDetach */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnPowerOff */
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync /* pfnSoftReset */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* u32EndVersion */