cba6719bd64ec749967bbe931230452664109857vboxsync/* $Id$ */
8e2911e5309f5dff976cc7ac17d832d4ee2cdca3vboxsync/** @file
8e2911e5309f5dff976cc7ac17d832d4ee2cdca3vboxsync * VBox stream drivers - Raw file output.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2012 Oracle Corporation
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * available from http://www.virtualbox.org. This file is free software;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * you can redistribute it and/or modify it under the terms of the GNU
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * General Public License (GPL) as published by the Free Software
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/*******************************************************************************
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync* Header Files *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync*******************************************************************************/
cba6719bd64ec749967bbe931230452664109857vboxsync#define LOG_GROUP LOG_GROUP_DEFAULT
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/pdmdrv.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/assert.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/file.h>
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync#include <iprt/mem.h>
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync#include <iprt/semaphore.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/stream.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/string.h>
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync#include <iprt/uuid.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
f5e53763b0a581b0299e98028c6c52192eb06785vboxsync#include "VBoxDD.h"
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/*******************************************************************************
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync* Defined Constants And Macros *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync*******************************************************************************/
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync/** Converts a pointer to DRVRAWFILE::IMedia to a PDRVRAWFILE. */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync#define PDMISTREAM_2_DRVRAWFILE(pInterface) ( (PDRVRAWFILE)((uintptr_t)pInterface - RT_OFFSETOF(DRVRAWFILE, IStream)) )
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/*******************************************************************************
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync* Structures and Typedefs *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync*******************************************************************************/
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Raw file output driver instance data.
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync *
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * @implements PDMISTREAM
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsynctypedef struct DRVRAWFILE
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /** The stream interface. */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync PDMISTREAM IStream;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /** Pointer to the driver instance. */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync PPDMDRVINS pDrvIns;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /** Pointer to the file name. (Freed by MM) */
cba6719bd64ec749967bbe931230452664109857vboxsync char *pszLocation;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /** Flag whether VirtualBox represents the server or client side. */
dc0a54940789f994c84390cb4a9f03da0b492285vboxsync RTFILE hOutputFile;
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync} DRVRAWFILE, *PDRVRAWFILE;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync/* -=-=-=-=- PDMISTREAM -=-=-=-=- */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/** @copydoc PDMISTREAM::pfnWrite */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsyncstatic DECLCALLBACK(int) drvRawFileWrite(PPDMISTREAM pInterface, const void *pvBuf, size_t *pcbWrite)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync int rc = VINF_SUCCESS;
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync PDRVRAWFILE pThis = PDMISTREAM_2_DRVRAWFILE(pInterface);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync LogFlow(("%s: pvBuf=%p *pcbWrite=%#x (%s)\n", __FUNCTION__, pvBuf, *pcbWrite, pThis->pszLocation));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync Assert(pvBuf);
dc0a54940789f994c84390cb4a9f03da0b492285vboxsync if (pThis->hOutputFile != NIL_RTFILE)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync {
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync size_t cbWritten;
dc0a54940789f994c84390cb4a9f03da0b492285vboxsync rc = RTFileWrite(pThis->hOutputFile, pvBuf, *pcbWrite, &cbWritten);
b2b8d2ecd8d9bafa7d53919432c46e86fb377fa7vboxsync#if 0
b2b8d2ecd8d9bafa7d53919432c46e86fb377fa7vboxsync /* don't flush here, takes too long and we will loose characters */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (RT_SUCCESS(rc))
dc0a54940789f994c84390cb4a9f03da0b492285vboxsync RTFileFlush(pThis->hOutputFile);
b2b8d2ecd8d9bafa7d53919432c46e86fb377fa7vboxsync#endif
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *pcbWrite = cbWritten;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync }
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync LogFlow(("%s: returns %Rrc\n", __FUNCTION__, rc));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync return rc;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync/* -=-=-=-=- PDMIBASE -=-=-=-=- */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * @interface_method_impl{PDMIBASE,pfnQueryInterface}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncstatic DECLCALLBACK(void *) drvRawFileQueryInterface(PPDMIBASE pInterface, const char *pszIID)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
9daee41d5cb5a2e8390f015a486e67a6cd52b836vboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
a39ea3668b7019c23a68936259545f9b71bce1aavboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
da3503c04ce76e653401396fe2795a9bc2427a1dvboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMISTREAM, &pThis->IStream);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync return NULL;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync/* -=-=-=-=- PDMDRVREG -=-=-=-=- */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * Power off a raw output stream driver instance.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * This does most of the destruction work, to avoid ordering dependencies.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync *
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * @param pDrvIns The driver instance data.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncstatic DECLCALLBACK(void) drvRawFilePowerOff(PPDMDRVINS pDrvIns)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync LogFlow(("%s: %s\n", __FUNCTION__, pThis->pszLocation));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
dc0a54940789f994c84390cb4a9f03da0b492285vboxsync RTFileClose(pThis->hOutputFile);
dc0a54940789f994c84390cb4a9f03da0b492285vboxsync pThis->hOutputFile = NIL_RTFILE;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Destruct a raw output stream driver instance.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Most VM resources are freed by the VM. This callback is provided so that
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * any non-VM resources can be freed correctly.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @param pDrvIns The driver instance data.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsyncstatic DECLCALLBACK(void) drvRawFileDestruct(PPDMDRVINS pDrvIns)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync LogFlow(("%s: %s\n", __FUNCTION__, pThis->pszLocation));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (pThis->pszLocation)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync MMR3HeapFree(pThis->pszLocation);
cba6719bd64ec749967bbe931230452664109857vboxsync
1e1273b11e17928ec3c3a8fff45121aa7a169413vboxsync if (pThis->hOutputFile != NIL_RTFILE)
1e1273b11e17928ec3c3a8fff45121aa7a169413vboxsync {
1e1273b11e17928ec3c3a8fff45121aa7a169413vboxsync RTFileClose(pThis->hOutputFile);
1e1273b11e17928ec3c3a8fff45121aa7a169413vboxsync pThis->hOutputFile = NIL_RTFILE;
1e1273b11e17928ec3c3a8fff45121aa7a169413vboxsync }
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * Construct a raw output stream driver instance.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * @copydoc FNPDMDRVCONSTRUCT
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
c28fa006ba669ad8f26ae31d00a338379c04ea1bvboxsyncstatic DECLCALLBACK(int) drvRawFileConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /*
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * Init the static parts.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync pThis->pDrvIns = pDrvIns;
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync pThis->pszLocation = NULL;
dc0a54940789f994c84390cb4a9f03da0b492285vboxsync pThis->hOutputFile = NIL_RTFILE;
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* IBase */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync pDrvIns->IBase.pfnQueryInterface = drvRawFileQueryInterface;
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* IStream */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync pThis->IStream.pfnWrite = drvRawFileWrite;
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /*
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * Read the configuration.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync */
c28fa006ba669ad8f26ae31d00a338379c04ea1bvboxsync if (!CFGMR3AreValuesValid(pCfg, "Location\0"))
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync AssertFailedReturn(VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
c28fa006ba669ad8f26ae31d00a338379c04ea1bvboxsync int rc = CFGMR3QueryStringAlloc(pCfg, "Location", &pThis->pszLocation);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync if (RT_FAILURE(rc))
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync AssertMsgFailedReturn(("Configuration error: query \"Location\" resulted in %Rrc.\n", rc), rc);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /*
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * Open the raw file.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync */
dc0a54940789f994c84390cb4a9f03da0b492285vboxsync rc = RTFileOpen(&pThis->hOutputFile, pThis->pszLocation, RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_NONE);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync if (RT_FAILURE(rc))
8bed792bc65abd39393889351f22263ce6c289bfvboxsync {
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync LogRel(("RawFile%d: CreateFile failed rc=%Rrc\n", pDrvIns->iInstance));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("RawFile#%d failed to create the raw output file %s"), pDrvIns->iInstance, pThis->pszLocation);
cba6719bd64ec749967bbe931230452664109857vboxsync }
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync LogFlow(("drvRawFileConstruct: location %s\n", pThis->pszLocation));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync LogRel(("RawFile#%u: location %s\n", pDrvIns->iInstance, pThis->pszLocation));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync return VINF_SUCCESS;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Raw file driver registration record.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsyncconst PDMDRVREG g_DrvRawFile =
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* u32Version */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync PDM_DRVREG_VERSION,
5b465a7c1237993faf8bb50120d247f3f0319adavboxsync /* szName */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync "RawFile",
ad77e3ec3cde24263bc7537575f5cae442bee3b1vboxsync /* szRCMod */
ad77e3ec3cde24263bc7537575f5cae442bee3b1vboxsync "",
ad77e3ec3cde24263bc7537575f5cae442bee3b1vboxsync /* szR0Mod */
ad77e3ec3cde24263bc7537575f5cae442bee3b1vboxsync "",
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pszDescription */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync "RawFile stream driver.",
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* fFlags */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* fClass. */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync PDM_DRVREG_CLASS_STREAM,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* cMaxInstances */
ad48e47654d22f79b025dc4b21cb162cb123801avboxsync ~0U,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* cbInstance */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync sizeof(DRVRAWFILE),
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnConstruct */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync drvRawFileConstruct,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnDestruct */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync drvRawFileDestruct,
ad77e3ec3cde24263bc7537575f5cae442bee3b1vboxsync /* pfnRelocate */
ad77e3ec3cde24263bc7537575f5cae442bee3b1vboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnIOCtl */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnPowerOn */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnReset */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnSuspend */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnResume */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
cba6719bd64ec749967bbe931230452664109857vboxsync /* pfnAttach */
cba6719bd64ec749967bbe931230452664109857vboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnDetach */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnPowerOff */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync drvRawFilePowerOff,
cba6719bd64ec749967bbe931230452664109857vboxsync /* pfnSoftReset */
cba6719bd64ec749967bbe931230452664109857vboxsync NULL,
cba6719bd64ec749967bbe931230452664109857vboxsync /* u32EndVersion */
cba6719bd64ec749967bbe931230452664109857vboxsync PDM_DRVREG_VERSION
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync};
cba6719bd64ec749967bbe931230452664109857vboxsync