DrvMediaISO.cpp revision 5b465a7c1237993faf8bb50120d247f3f0319ada
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* $Id$ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VBox storage devices: ISO image media driver
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
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 *
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
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Header Files *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define LOG_GROUP LOG_GROUP_DRV_ISO
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/pdmdrv.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/assert.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/file.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/string.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/uuid.h>
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "Builtins.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d31ded334a29f575e23dc889b603b1a586759348vboxsync
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
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Converts a pointer to PDMDRVINS::IBase to a PPDMDRVINS. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define PDMIBASE_2_DRVINS(pInterface) ( (PPDMDRVINS)((uintptr_t)pInterface - RT_OFFSETOF(PDMDRVINS, IBase)) )
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Converts a pointer to PDMDRVINS::IBase to a PVBOXHDD. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define PDMIBASE_2_DRVMEDIAISO(pInterface) ( PDMINS_2_DATA(PDMIBASE_2_DRVINS(pInterface), PDRVMEDIAISO) )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Structures and Typedefs *
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync*******************************************************************************/
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Block driver instance data.
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @implements PDMIMEDIA
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct DRVMEDIAISO
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync /** The media interface. */
2daaccf68be3773aee600c5c3e48bcf5401418a6vboxsync PDMIMEDIA IMedia;
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync /** Pointer to the driver instance. */
614cbe11a7e5588dc8d369e223174b1441a09359vboxsync PPDMDRVINS pDrvIns;
614cbe11a7e5588dc8d369e223174b1441a09359vboxsync /** Pointer to the filename. (Freed by MM) */
614cbe11a7e5588dc8d369e223174b1441a09359vboxsync char *pszFilename;
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync /** File handle of the ISO file. */
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync RTFILE File;
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync} DRVMEDIAISO, *PDRVMEDIAISO;
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync/* -=-=-=-=- PDMIMEDIA -=-=-=-=- */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnGetSize */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(uint64_t) drvMediaISOGetSize(PPDMIMEDIA pInterface)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDRVMEDIAISO pThis = PDMIMEDIA_2_DRVMEDIAISO(pInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("drvMediaISOGetSize: '%s'\n", pThis->pszFilename));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint64_t cbFile;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = RTFileGetSize(pThis->File, &cbFile);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("drvMediaISOGetSize: returns %lld (%s)\n", cbFile, pThis->pszFilename));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return cbFile;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("Error querying ISO file size, rc=%Rrc. (%s)\n", rc, pThis->pszFilename));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnBiosGetPCHSGeometry */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISOBiosGetPCHSGeometry(PPDMIMEDIA pInterface, PPDMMEDIAGEOMETRY pPCHSGeometry)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync return VERR_NOT_IMPLEMENTED;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** @copydoc PDMIMEDIA::pfnBiosSetPCHSGeometry */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISOBiosSetPCHSGeometry(PPDMIMEDIA pInterface, PCPDMMEDIAGEOMETRY pPCHSGeometry)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync return VERR_NOT_IMPLEMENTED;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** @copydoc PDMIMEDIA::pfnBiosGetLCHSGeometry */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISOBiosGetLCHSGeometry(PPDMIMEDIA pInterface, PPDMMEDIAGEOMETRY pLCHSGeometry)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync return VERR_NOT_IMPLEMENTED;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** @copydoc PDMIMEDIA::pfnBiosSetLCHSGeometry */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISOBiosSetLCHSGeometry(PPDMIMEDIA pInterface, PCPDMMEDIAGEOMETRY pLCHSGeometry)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
7b80828e5760a8814fe6cd494d2715a4544fbddcvboxsync return VERR_NOT_IMPLEMENTED;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/**
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Read bits.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @see PDMIMEDIA::pfnRead for details.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic DECLCALLBACK(int) drvMediaISORead(PPDMIMEDIA pInterface, uint64_t off, void *pvBuf, size_t cbRead)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync PDRVMEDIAISO pThis = PDMIMEDIA_2_DRVMEDIAISO(pInterface);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync LogFlow(("drvMediaISORead: off=%#llx pvBuf=%p cbRead=%#x (%s)\n", off, pvBuf, cbRead, pThis->pszFilename));
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync Assert(pThis->File);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync Assert(pvBuf);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /*
d1cbbd799d8912978f5146960b6780f387bb414bvboxsync * Seek to the position and read.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync int rc = RTFileSeek(pThis->File, off, RTFILE_SEEK_BEGIN, NULL);
c17f5c90f2cb60b38ecabebce128724c6ff2d036vboxsync if (RT_SUCCESS(rc))
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = RTFileRead(pThis->File, pvBuf, cbRead, NULL);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log2(("drvMediaISORead: off=%#llx pvBuf=%p cbRead=%#x (%s)\n"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync "%16.*Rhxd\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync off, pvBuf, cbRead, pThis->pszFilename,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cbRead, pvBuf));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("RTFileRead(%d, %p, %#x) -> %Rrc (off=%#llx '%s')\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->File, pvBuf, cbRead, rc, off, pThis->pszFilename));
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync }
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("RTFileSeek(%d,%#llx,) -> %Rrc\n", pThis->File, off, rc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("drvMediaISORead: returns %Rrc\n", rc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnWrite */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) drvMediaISOWrite(PPDMIMEDIA pInterface, uint64_t off, const void *pvBuf, size_t cbWrite)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("Attempt to write to an ISO file!\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_NOT_IMPLEMENTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnFlush */
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsyncstatic DECLCALLBACK(int) drvMediaISOFlush(PPDMIMEDIA pInterface)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* No buffered data that still needs to be written. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnGetUuid */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) drvMediaISOGetUuid(PPDMIMEDIA pInterface, PRTUUID pUuid)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
750d4d0506a38b2e80c997075d40aad474e675fbvboxsync LogFlow(("drvMediaISOGetUuid: returns VERR_NOT_IMPLEMENTED\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_NOT_IMPLEMENTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIMEDIA::pfnIsReadOnly */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(bool) drvMediaISOIsReadOnly(PPDMIMEDIA pInterface)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* -=-=-=-=- PDMIBASE -=-=-=-=- */
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync/**
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * @interface_method_impl{PDMIBASE,pfnQueryInterface}
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsyncstatic DECLCALLBACK(void *) drvMediaISOQueryInterface(PPDMIBASE pInterface, const char *pszIID)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync{
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);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return NULL;
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsync}
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync/* -=-=-=-=- PDMDRVREG -=-=-=-=- */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
72ef2b9fc5ffc01d0dabd5052d6e8baa3a952773vboxsync/**
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * Destruct a driver instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
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 *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pDrvIns The driver instance data.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) drvMediaISODestruct(PPDMDRVINS pDrvIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDRVMEDIAISO pThis = PDMINS_2_DATA(pDrvIns, PDRVMEDIAISO);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync LogFlow(("drvMediaISODestruct: '%s'\n", pThis->pszFilename));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pThis->File != NIL_RTFILE)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTFileClose(pThis->File);
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync pThis->File = NIL_RTFILE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync if (pThis->pszFilename)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync MMR3HeapFree(pThis->pszFilename);
909f4391cc20b4a3a9a2d3f8718084b669663ab2vboxsync}
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync/**
69deddbc68802f1cf1c3a404a9f816b8accb3385vboxsync * Construct a ISO media driver instance.
3ecd8008b81f02a04220705ae0033142af363280vboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @copydoc FNPDMDRVCONSTRUCT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsyncstatic DECLCALLBACK(int) drvMediaISOConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDRVMEDIAISO pThis = PDMINS_2_DATA(pDrvIns, PDRVMEDIAISO);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Init the static parts.
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync */
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync pThis->pDrvIns = pDrvIns;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->File = NIL_RTFILE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* IBase */
3ecd8008b81f02a04220705ae0033142af363280vboxsync pDrvIns->IBase.pfnQueryInterface = drvMediaISOQueryInterface;
3ecd8008b81f02a04220705ae0033142af363280vboxsync /* IMedia */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync pThis->IMedia.pfnRead = drvMediaISORead;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->IMedia.pfnWrite = drvMediaISOWrite;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->IMedia.pfnFlush = drvMediaISOFlush;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->IMedia.pfnGetSize = drvMediaISOGetSize;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->IMedia.pfnGetUuid = drvMediaISOGetUuid;
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;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync /*
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync * Read the configuration.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync if (!CFGMR3AreValuesValid(pCfgHandle, "Path\0"))
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync char *pszName;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync int rc = CFGMR3QueryStringAlloc(pCfgHandle, "Path", &pszName);
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return PDMDRV_SET_ERROR(pDrvIns, rc, N_("Failed to query \"Path\" from the config"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Open the image.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = RTFileOpen(&pThis->File, pszName,
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
b978e5849454446957177fd47ee98609ab0457a6vboxsync if (RT_SUCCESS(rc))
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("drvMediaISOConstruct: ISO image '%s' opened successfully.\n", pszName));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->pszFilename = pszName;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("Failed to open ISO file \"%s\""), pszName);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync MMR3HeapFree(pszName);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync return rc;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync/**
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync * ISO media driver registration record.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncconst PDMDRVREG g_DrvMediaISO =
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /* u32Version */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync PDM_DRVREG_VERSION,
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync /* szName */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync "MediaISO",
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync /* szRCMod */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync "",
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /* szR0Mod */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync "",
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /* pszDescription */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync "ISO media access driver.",
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /* fFlags */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
e50404712a2b5234c42bdf9740bddab5729ba188vboxsync /* fClass. */
b978e5849454446957177fd47ee98609ab0457a6vboxsync PDM_DRVREG_CLASS_MEDIA,
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync /* cMaxInstances */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync ~0,
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync /* cbInstance */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync sizeof(DRVMEDIAISO),
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync /* pfnConstruct */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync drvMediaISOConstruct,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnDestruct */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync drvMediaISODestruct,
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync /* pfnRelocate */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync NULL,
806d0b554daa555364af5f87bc96eccbe760db7avboxsync /* pfnIOCtl */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync NULL,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnPowerOn */
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync NULL,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnReset */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync NULL,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnSuspend */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync NULL,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnResume */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync NULL,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnAttach */
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync NULL,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnDetach */
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync NULL,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* pfnPowerOff */
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync NULL,
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync /* pfnSoftReset */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync NULL,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* u32EndVersion */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync PDM_DRVREG_VERSION
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync};
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync