VirtualBox

source: vbox/trunk/src/VBox/Devices/Storage/DrvMediaISO.cpp@ 37596

Last change on this file since 37596 was 37596, checked in by vboxsync, 13 years ago

*: RTFILE becomes a pointer, RTFileOpen++ expands it's flags paramter from uint32_t to uint64_t.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.5 KB
Line 
1/* $Id: DrvMediaISO.cpp 37596 2011-06-22 19:30:06Z vboxsync $ */
2/** @file
3 * VBox storage devices: ISO image media driver
4 */
5
6/*
7 * Copyright (C) 2006-2007 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18/*******************************************************************************
19* Header Files *
20*******************************************************************************/
21#define LOG_GROUP LOG_GROUP_DRV_ISO
22#include <VBox/vmm/pdmdrv.h>
23#include <iprt/assert.h>
24#include <iprt/file.h>
25#include <iprt/string.h>
26#include <iprt/uuid.h>
27
28#include "VBoxDD.h"
29
30
31/*******************************************************************************
32* Defined Constants And Macros *
33*******************************************************************************/
34/** Converts a pointer to MEDIAISO::IMedia to a PRDVMEDIAISO. */
35#define PDMIMEDIA_2_DRVMEDIAISO(pInterface) ( (PDRVMEDIAISO)((uintptr_t)pInterface - RT_OFFSETOF(DRVMEDIAISO, IMedia)) )
36
37/** Converts a pointer to PDMDRVINS::IBase to a PPDMDRVINS. */
38#define PDMIBASE_2_DRVINS(pInterface) ( (PPDMDRVINS)((uintptr_t)pInterface - RT_OFFSETOF(PDMDRVINS, IBase)) )
39
40/** Converts a pointer to PDMDRVINS::IBase to a PVBOXHDD. */
41#define PDMIBASE_2_DRVMEDIAISO(pInterface) ( PDMINS_2_DATA(PDMIBASE_2_DRVINS(pInterface), PDRVMEDIAISO) )
42
43
44
45/*******************************************************************************
46* Structures and Typedefs *
47*******************************************************************************/
48/**
49 * Block driver instance data.
50 *
51 * @implements PDMIMEDIA
52 */
53typedef struct DRVMEDIAISO
54{
55 /** The media interface. */
56 PDMIMEDIA IMedia;
57 /** Pointer to the driver instance. */
58 PPDMDRVINS pDrvIns;
59 /** Pointer to the filename. (Freed by MM) */
60 char *pszFilename;
61 /** File handle of the ISO file. */
62 RTFILE hFile;
63} DRVMEDIAISO, *PDRVMEDIAISO;
64
65
66
67/* -=-=-=-=- PDMIMEDIA -=-=-=-=- */
68
69/** @copydoc PDMIMEDIA::pfnGetSize */
70static DECLCALLBACK(uint64_t) drvMediaISOGetSize(PPDMIMEDIA pInterface)
71{
72 PDRVMEDIAISO pThis = PDMIMEDIA_2_DRVMEDIAISO(pInterface);
73 LogFlow(("drvMediaISOGetSize: '%s'\n", pThis->pszFilename));
74
75 uint64_t cbFile;
76 int rc = RTFileGetSize(pThis->hFile, &cbFile);
77 if (RT_SUCCESS(rc))
78 {
79 LogFlow(("drvMediaISOGetSize: returns %lld (%s)\n", cbFile, pThis->pszFilename));
80 return cbFile;
81 }
82
83 AssertMsgFailed(("Error querying ISO file size, rc=%Rrc. (%s)\n", rc, pThis->pszFilename));
84 return 0;
85}
86
87
88/** @copydoc PDMIMEDIA::pfnBiosGetPCHSGeometry */
89static DECLCALLBACK(int) drvMediaISOBiosGetPCHSGeometry(PPDMIMEDIA pInterface, PPDMMEDIAGEOMETRY pPCHSGeometry)
90{
91 return VERR_NOT_IMPLEMENTED;
92}
93
94
95/** @copydoc PDMIMEDIA::pfnBiosSetPCHSGeometry */
96static DECLCALLBACK(int) drvMediaISOBiosSetPCHSGeometry(PPDMIMEDIA pInterface, PCPDMMEDIAGEOMETRY pPCHSGeometry)
97{
98 return VERR_NOT_IMPLEMENTED;
99}
100
101
102/** @copydoc PDMIMEDIA::pfnBiosGetLCHSGeometry */
103static DECLCALLBACK(int) drvMediaISOBiosGetLCHSGeometry(PPDMIMEDIA pInterface, PPDMMEDIAGEOMETRY pLCHSGeometry)
104{
105 return VERR_NOT_IMPLEMENTED;
106}
107
108
109/** @copydoc PDMIMEDIA::pfnBiosSetLCHSGeometry */
110static DECLCALLBACK(int) drvMediaISOBiosSetLCHSGeometry(PPDMIMEDIA pInterface, PCPDMMEDIAGEOMETRY pLCHSGeometry)
111{
112 return VERR_NOT_IMPLEMENTED;
113}
114
115
116/**
117 * Read bits.
118 *
119 * @see PDMIMEDIA::pfnRead for details.
120 */
121static DECLCALLBACK(int) drvMediaISORead(PPDMIMEDIA pInterface, uint64_t off, void *pvBuf, size_t cbRead)
122{
123 PDRVMEDIAISO pThis = PDMIMEDIA_2_DRVMEDIAISO(pInterface);
124 LogFlow(("drvMediaISORead: off=%#llx pvBuf=%p cbRead=%#x (%s)\n", off, pvBuf, cbRead, pThis->pszFilename));
125
126 Assert(pThis->hFile != NIL_RTFILE);
127 Assert(pvBuf);
128
129 /*
130 * Seek to the position and read.
131 */
132 int rc = RTFileReadAt(pThis->hFile, off, pvBuf, cbRead, NULL);
133 if (RT_SUCCESS(rc))
134 Log2(("drvMediaISORead: off=%#llx pvBuf=%p cbRead=%#x (%s)\n"
135 "%16.*Rhxd\n",
136 off, pvBuf, cbRead, pThis->pszFilename,
137 cbRead, pvBuf));
138 else
139 AssertMsgFailed(("RTFileReadAt(%RTfile, %#llx, %p, %#x) -> %Rrc ('%s')\n",
140 pThis->hFile, off, pvBuf, cbRead, rc, pThis->pszFilename));
141 LogFlow(("drvMediaISORead: returns %Rrc\n", rc));
142 return rc;
143}
144
145
146/** @copydoc PDMIMEDIA::pfnWrite */
147static DECLCALLBACK(int) drvMediaISOWrite(PPDMIMEDIA pInterface, uint64_t off, const void *pvBuf, size_t cbWrite)
148{
149 AssertMsgFailed(("Attempt to write to an ISO file!\n"));
150 return VERR_NOT_IMPLEMENTED;
151}
152
153
154/** @copydoc PDMIMEDIA::pfnFlush */
155static DECLCALLBACK(int) drvMediaISOFlush(PPDMIMEDIA pInterface)
156{
157 /* No buffered data that still needs to be written. */
158 return VINF_SUCCESS;
159}
160
161
162/** @copydoc PDMIMEDIA::pfnGetUuid */
163static DECLCALLBACK(int) drvMediaISOGetUuid(PPDMIMEDIA pInterface, PRTUUID pUuid)
164{
165 LogFlow(("drvMediaISOGetUuid: returns VERR_NOT_IMPLEMENTED\n"));
166 return VERR_NOT_IMPLEMENTED;
167}
168
169
170/** @copydoc PDMIMEDIA::pfnIsReadOnly */
171static DECLCALLBACK(bool) drvMediaISOIsReadOnly(PPDMIMEDIA pInterface)
172{
173 return true;
174}
175
176/* -=-=-=-=- PDMIBASE -=-=-=-=- */
177
178/**
179 * @interface_method_impl{PDMIBASE,pfnQueryInterface}
180 */
181static DECLCALLBACK(void *) drvMediaISOQueryInterface(PPDMIBASE pInterface, const char *pszIID)
182{
183 PPDMDRVINS pDrvIns = PDMIBASE_2_DRVINS(pInterface);
184 PDRVMEDIAISO pThis = PDMINS_2_DATA(pDrvIns, PDRVMEDIAISO);
185 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
186 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIA, &pThis->IMedia);
187 return NULL;
188}
189
190/* -=-=-=-=- PDMDRVREG -=-=-=-=- */
191
192/**
193 * Destruct a driver instance.
194 *
195 * Most VM resources are freed by the VM. This callback is provided so that any non-VM
196 * resources can be freed correctly.
197 *
198 * @param pDrvIns The driver instance data.
199 */
200static DECLCALLBACK(void) drvMediaISODestruct(PPDMDRVINS pDrvIns)
201{
202 PDRVMEDIAISO pThis = PDMINS_2_DATA(pDrvIns, PDRVMEDIAISO);
203 LogFlow(("drvMediaISODestruct: '%s'\n", pThis->pszFilename));
204 PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns);
205
206 RTFileClose(pThis->hFile);
207 pThis->hFile = NIL_RTFILE;
208
209 if (pThis->pszFilename)
210 {
211 MMR3HeapFree(pThis->pszFilename);
212 pThis->pszFilename = NULL;
213 }
214}
215
216
217/**
218 * Construct a ISO media driver instance.
219 *
220 * @copydoc FNPDMDRVCONSTRUCT
221 */
222static DECLCALLBACK(int) drvMediaISOConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
223{
224 PDRVMEDIAISO pThis = PDMINS_2_DATA(pDrvIns, PDRVMEDIAISO);
225 PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns);
226
227 /*
228 * Init the static parts.
229 */
230 pThis->pDrvIns = pDrvIns;
231 pThis->hFile = NIL_RTFILE;
232 /* IBase */
233 pDrvIns->IBase.pfnQueryInterface = drvMediaISOQueryInterface;
234 /* IMedia */
235 pThis->IMedia.pfnRead = drvMediaISORead;
236 pThis->IMedia.pfnWrite = drvMediaISOWrite;
237 pThis->IMedia.pfnFlush = drvMediaISOFlush;
238 pThis->IMedia.pfnGetSize = drvMediaISOGetSize;
239 pThis->IMedia.pfnGetUuid = drvMediaISOGetUuid;
240 pThis->IMedia.pfnIsReadOnly = drvMediaISOIsReadOnly;
241 pThis->IMedia.pfnBiosGetPCHSGeometry = drvMediaISOBiosGetPCHSGeometry;
242 pThis->IMedia.pfnBiosSetPCHSGeometry = drvMediaISOBiosSetPCHSGeometry;
243 pThis->IMedia.pfnBiosGetLCHSGeometry = drvMediaISOBiosGetLCHSGeometry;
244 pThis->IMedia.pfnBiosSetLCHSGeometry = drvMediaISOBiosSetLCHSGeometry;
245
246 /*
247 * Read the configuration.
248 */
249 if (!CFGMR3AreValuesValid(pCfg, "Path\0"))
250 return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
251
252 char *pszName;
253 int rc = CFGMR3QueryStringAlloc(pCfg, "Path", &pszName);
254 if (RT_FAILURE(rc))
255 return PDMDRV_SET_ERROR(pDrvIns, rc, N_("Failed to query \"Path\" from the config"));
256
257 /*
258 * Open the image.
259 */
260 rc = RTFileOpen(&pThis->hFile, pszName, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
261 if (RT_SUCCESS(rc))
262 {
263 LogFlow(("drvMediaISOConstruct: ISO image '%s' opened successfully.\n", pszName));
264 pThis->pszFilename = pszName;
265 }
266 else
267 {
268 PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("Failed to open ISO file \"%s\""), pszName);
269 MMR3HeapFree(pszName);
270 }
271
272 return rc;
273}
274
275
276/**
277 * ISO media driver registration record.
278 */
279const PDMDRVREG g_DrvMediaISO =
280{
281 /* u32Version */
282 PDM_DRVREG_VERSION,
283 /* szName */
284 "MediaISO",
285 /* szRCMod */
286 "",
287 /* szR0Mod */
288 "",
289 /* pszDescription */
290 "ISO media access driver.",
291 /* fFlags */
292 PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
293 /* fClass. */
294 PDM_DRVREG_CLASS_MEDIA,
295 /* cMaxInstances */
296 ~0,
297 /* cbInstance */
298 sizeof(DRVMEDIAISO),
299 /* pfnConstruct */
300 drvMediaISOConstruct,
301 /* pfnDestruct */
302 drvMediaISODestruct,
303 /* pfnRelocate */
304 NULL,
305 /* pfnIOCtl */
306 NULL,
307 /* pfnPowerOn */
308 NULL,
309 /* pfnReset */
310 NULL,
311 /* pfnSuspend */
312 NULL,
313 /* pfnResume */
314 NULL,
315 /* pfnAttach */
316 NULL,
317 /* pfnDetach */
318 NULL,
319 /* pfnPowerOff */
320 NULL,
321 /* pfnSoftReset */
322 NULL,
323 /* u32EndVersion */
324 PDM_DRVREG_VERSION
325};
326
Note: See TracBrowser for help on using the repository browser.

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