DrvRawFile.cpp revision dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/** @file
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * VBox stream devices:
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Raw file output
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/*
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * available from http://www.virtualbox.org. This file is free software;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * you can redistribute it and/or modify it under the terms of the GNU
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * General Public License (GPL) as published by the Free Software
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * additional information or have any questions.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/*******************************************************************************
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync* Header Files *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync*******************************************************************************/
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#define LOG_GROUP LOG_GROUP_DRV_NAMEDPIPE
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#include <VBox/pdmdrv.h>
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#include <iprt/assert.h>
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#include <iprt/file.h>
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#include <iprt/stream.h>
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#include <iprt/alloc.h>
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#include <iprt/string.h>
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#include <iprt/semaphore.h>
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync#include "Builtins.h"
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/*******************************************************************************
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync* Defined Constants And Macros *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync*******************************************************************************/
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/** Converts a pointer to DRVRAWFILE::IMedia to a PDRVRAWFILE. */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#define PDMISTREAM_2_DRVRAWFILE(pInterface) ( (PDRVRAWFILE)((uintptr_t)pInterface - RT_OFFSETOF(DRVRAWFILE, IStream)) )
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/** Converts a pointer to PDMDRVINS::IBase to a PPDMDRVINS. */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync#define PDMIBASE_2_DRVINS(pInterface) ( (PPDMDRVINS)((uintptr_t)pInterface - RT_OFFSETOF(PDMDRVINS, IBase)) )
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/*******************************************************************************
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync* Structures and Typedefs *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync*******************************************************************************/
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/**
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Raw file output driver instance data.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsynctypedef struct DRVRAWFILE
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync{
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /** The stream interface. */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PDMISTREAM IStream;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /** Pointer to the driver instance. */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PPDMDRVINS pDrvIns;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /** Pointer to the file name. (Freed by MM) */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync char *pszLocation;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /** Flag whether VirtualBox represents the server or client side. */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync RTFILE OutputFile;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync} DRVRAWFILE, *PDRVRAWFILE;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/*******************************************************************************
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync* Internal Functions *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync*******************************************************************************/
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/** @copydoc PDMISTREAM::pfnWrite */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsyncstatic DECLCALLBACK(int) drvRawFileWrite(PPDMISTREAM pInterface, const void *pvBuf, size_t *pcbWrite)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync{
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync int rc = VINF_SUCCESS;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PDRVRAWFILE pThis = PDMISTREAM_2_DRVRAWFILE(pInterface);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync LogFlow(("%s: pvBuf=%p *pcbWrite=%#x (%s)\n", __FUNCTION__, pvBuf, *pcbWrite, pThis->pszLocation));
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync Assert(pvBuf);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync if (pThis->OutputFile != NIL_RTFILE)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync {
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync size_t cbWritten;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync rc = RTFileWrite(pThis->OutputFile, pvBuf, *pcbWrite, &cbWritten);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync if (RT_SUCCESS(rc))
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync RTFileFlush(pThis->OutputFile);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync *pcbWrite = cbWritten;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync }
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync LogFlow(("%s: returns %Rrc\n", __FUNCTION__, rc));
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync return rc;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync}
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/**
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Queries an interface to the driver.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * @returns Pointer to interface.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * @returns NULL if the interface was not supported by the driver.
09034c53c75eab7ea04021a749b98e7f78fae85avboxsync * @param pInterface Pointer to this interface structure.
09034c53c75eab7ea04021a749b98e7f78fae85avboxsync * @param enmInterface The requested interface identification.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * @thread Any thread.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsyncstatic DECLCALLBACK(void *) drvRawFileQueryInterface(PPDMIBASE pInterface, PDMINTERFACE enmInterface)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync{
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_DRVINS(pInterface);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PDRVRAWFILE pDrv = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync switch (enmInterface)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync {
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync case PDMINTERFACE_BASE:
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync return &pDrvIns->IBase;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync case PDMINTERFACE_STREAM:
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync return &pDrv->IStream;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync default:
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync return NULL;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync }
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync}
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
09034c53c75eab7ea04021a749b98e7f78fae85avboxsync/**
09034c53c75eab7ea04021a749b98e7f78fae85avboxsync * Construct a raw output stream driver instance.
09034c53c75eab7ea04021a749b98e7f78fae85avboxsync *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * @returns VBox status.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * @param pDrvIns The driver instance data.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * If the registration structure is needed, pDrvIns->pDrvReg points to it.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * @param pCfgHandle Configuration node handle for the driver. Use this to obtain the configuration
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * of the driver instance. It's also found in pDrvIns->pCfgHandle, but like
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * iInstance it's expected to be used a bit in this function.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsyncstatic DECLCALLBACK(int) drvRawFileConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync{
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync int rc;
09034c53c75eab7ea04021a749b98e7f78fae85avboxsync char *pszLocation = NULL;
09034c53c75eab7ea04021a749b98e7f78fae85avboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /*
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Init the static parts.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync pThis->pDrvIns = pDrvIns;
4d0b8f024a4654c1f61c8c4b7e16320719f7fea4vboxsync pThis->pszLocation = NULL;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync pThis->OutputFile = NIL_RTFILE;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* IBase */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync pDrvIns->IBase.pfnQueryInterface = drvRawFileQueryInterface;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* IStream */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync pThis->IStream.pfnWrite = drvRawFileWrite;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /*
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Read the configuration.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync if (!CFGMR3AreValuesValid(pCfgHandle, "Location\0"))
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync {
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync rc = VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync goto out;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync }
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync rc = CFGMR3QueryStringAlloc(pCfgHandle, "Location", &pszLocation);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync if (RT_FAILURE(rc))
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync {
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync AssertMsgFailed(("Configuration error: query \"Location\" resulted in %Rrc.\n", rc));
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync goto out;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync }
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync pThis->pszLocation = pszLocation;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync rc = RTFileOpen(&pThis->OutputFile, pThis->pszLocation, RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync if (RT_FAILURE(rc))
4d0b8f024a4654c1f61c8c4b7e16320719f7fea4vboxsync {
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync LogRel(("RawFile%d: CreateFile failed rc=%Rrc\n", pThis->pDrvIns->iInstance));
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("RawFile#%d failed to create the raw output file %s"), pDrvIns->iInstance, pszLocation);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync }
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsyncout:
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync if (RT_FAILURE(rc))
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync {
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync if (pszLocation)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync MMR3HeapFree(pszLocation);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("RawFile#%d failed to initialize"), pDrvIns->iInstance);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync }
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync LogFlow(("drvRawFileConstruct: location %s\n", pszLocation));
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync LogRel(("RawFile: location %s\n", pszLocation));
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync return VINF_SUCCESS;
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync}
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/**
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Destruct a raw output stream driver instance.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Most VM resources are freed by the VM. This callback is provided so that
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * any non-VM resources can be freed correctly.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * @param pDrvIns The driver instance data.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsyncstatic DECLCALLBACK(void) drvRawFileDestruct(PPDMDRVINS pDrvIns)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync{
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync LogFlow(("%s: %s\n", __FUNCTION__, pThis->pszLocation));
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync if (pThis->pszLocation)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync MMR3HeapFree(pThis->pszLocation);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync}
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/**
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Power off a raw output stream driver instance.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * This does most of the destruction work, to avoid ordering dependencies.
4d0b8f024a4654c1f61c8c4b7e16320719f7fea4vboxsync *
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * @param pDrvIns The driver instance data.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsyncstatic DECLCALLBACK(void) drvRawFilePowerOff(PPDMDRVINS pDrvIns)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync{
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync LogFlow(("%s: %s\n", __FUNCTION__, pThis->pszLocation));
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync if (pThis->OutputFile != NIL_RTFILE)
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync RTFileClose(pThis->OutputFile);
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync}
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync/**
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync * Raw file driver registration record.
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsyncconst PDMDRVREG g_DrvRawFile =
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync{
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* u32Version */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PDM_DRVREG_VERSION,
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* szDriverName */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync "RawFile",
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* pszDescription */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync "RawFile stream driver.",
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* fFlags */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* fClass. */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync PDM_DRVREG_CLASS_STREAM,
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* cMaxInstances */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync ~0,
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* cbInstance */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync sizeof(DRVRAWFILE),
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* pfnConstruct */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync drvRawFileConstruct,
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* pfnDestruct */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync drvRawFileDestruct,
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync /* pfnIOCtl */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync NULL,
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* pfnPowerOn */
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync NULL,
e87df5a63825a4aed74b06f10229ee463b26f5c1vboxsync /* pfnReset */
NULL,
/* pfnSuspend */
NULL,
/* pfnResume */
NULL,
/* pfnDetach */
NULL,
/* pfnPowerOff */
drvRawFilePowerOff,
};