DrvRawFile.cpp revision dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/** @file
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * VBox stream devices:
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Raw file output
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/*
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * additional information or have any questions.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/*******************************************************************************
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync* Header Files *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync*******************************************************************************/
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#define LOG_GROUP LOG_GROUP_DRV_NAMEDPIPE
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <VBox/pdmdrv.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/assert.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/file.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/stream.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/alloc.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/string.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include <iprt/semaphore.h>
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#include "Builtins.h"
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/*******************************************************************************
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync* Defined Constants And Macros *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync*******************************************************************************/
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
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/** Converts a pointer to PDMDRVINS::IBase to a PPDMDRVINS. */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync#define PDMIBASE_2_DRVINS(pInterface) ( (PPDMDRVINS)((uintptr_t)pInterface - RT_OFFSETOF(PDMDRVINS, IBase)) )
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/*******************************************************************************
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync* Structures and Typedefs *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync*******************************************************************************/
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Raw file output driver instance data.
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) */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync char *pszLocation;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /** Flag whether VirtualBox represents the server or client side. */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync RTFILE OutputFile;
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync} DRVRAWFILE, *PDRVRAWFILE;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/*******************************************************************************
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync* Internal Functions *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync*******************************************************************************/
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
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);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (pThis->OutputFile != NIL_RTFILE)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync {
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync size_t cbWritten;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync rc = RTFileWrite(pThis->OutputFile, pvBuf, *pcbWrite, &cbWritten);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (RT_SUCCESS(rc))
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync RTFileFlush(pThis->OutputFile);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *pcbWrite = cbWritten;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync }
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync LogFlow(("%s: returns %Rrc\n", __FUNCTION__, rc));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync return rc;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Queries an interface to the driver.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @returns Pointer to interface.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @returns NULL if the interface was not supported by the driver.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @param pInterface Pointer to this interface structure.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @param enmInterface The requested interface identification.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @thread Any thread.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsyncstatic DECLCALLBACK(void *) drvRawFileQueryInterface(PPDMIBASE pInterface, PDMINTERFACE enmInterface)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_DRVINS(pInterface);
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync PDRVRAWFILE pDrv = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync switch (enmInterface)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync {
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync case PDMINTERFACE_BASE:
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync return &pDrvIns->IBase;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync case PDMINTERFACE_STREAM:
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync return &pDrv->IStream;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync default:
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync return NULL;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync }
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Construct a raw output stream driver instance.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @returns VBox status.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @param pDrvIns The driver instance data.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * If the registration structure is needed, pDrvIns->pDrvReg points to it.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @param pCfgHandle Configuration node handle for the driver. Use this to obtain the configuration
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * of the driver instance. It's also found in pDrvIns->pCfgHandle, but like
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * iInstance it's expected to be used a bit in this function.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsyncstatic DECLCALLBACK(int) drvRawFileConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync int rc;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync char *pszLocation = NULL;
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /*
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Init the static parts.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync pThis->pDrvIns = pDrvIns;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync pThis->pszLocation = NULL;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync pThis->OutputFile = NIL_RTFILE;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* IBase */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync pDrvIns->IBase.pfnQueryInterface = drvRawFileQueryInterface;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* IStream */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync pThis->IStream.pfnWrite = drvRawFileWrite;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /*
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Read the configuration.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (!CFGMR3AreValuesValid(pCfgHandle, "Location\0"))
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync {
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync rc = VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync goto out;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync }
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync rc = CFGMR3QueryStringAlloc(pCfgHandle, "Location", &pszLocation);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (RT_FAILURE(rc))
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync {
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync AssertMsgFailed(("Configuration error: query \"Location\" resulted in %Rrc.\n", rc));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync goto out;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync }
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync pThis->pszLocation = pszLocation;
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync rc = RTFileOpen(&pThis->OutputFile, pThis->pszLocation, RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (RT_FAILURE(rc))
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync {
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync LogRel(("RawFile%d: CreateFile failed rc=%Rrc\n", pThis->pDrvIns->iInstance));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("RawFile#%d failed to create the raw output file %s"), pDrvIns->iInstance, pszLocation);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync }
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsyncout:
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (RT_FAILURE(rc))
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync {
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (pszLocation)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync MMR3HeapFree(pszLocation);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("RawFile#%d failed to initialize"), pDrvIns->iInstance);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync }
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync LogFlow(("drvRawFileConstruct: location %s\n", pszLocation));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync LogRel(("RawFile: location %s\n", pszLocation));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync return VINF_SUCCESS;
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));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (pThis->pszLocation)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync MMR3HeapFree(pThis->pszLocation);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Power off a raw output stream driver instance.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * This does most of the destruction work, to avoid ordering dependencies.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync *
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * @param pDrvIns The driver instance data.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsyncstatic DECLCALLBACK(void) drvRawFilePowerOff(PPDMDRVINS pDrvIns)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync LogFlow(("%s: %s\n", __FUNCTION__, pThis->pszLocation));
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync if (pThis->OutputFile != NIL_RTFILE)
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync RTFileClose(pThis->OutputFile);
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync}
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync/**
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync * Raw file driver registration record.
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsyncconst PDMDRVREG g_DrvRawFile =
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync{
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* u32Version */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync PDM_DRVREG_VERSION,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* szDriverName */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync "RawFile",
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pszDescription */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync "RawFile stream driver.",
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* fFlags */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* fClass. */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync PDM_DRVREG_CLASS_STREAM,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* cMaxInstances */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync ~0,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* cbInstance */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync sizeof(DRVRAWFILE),
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnConstruct */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync drvRawFileConstruct,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnDestruct */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync drvRawFileDestruct,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnIOCtl */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnPowerOn */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnReset */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnSuspend */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnResume */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnDetach */
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync NULL,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync /* pfnPowerOff */
dc1ef3adbbc24e348697c7f7d4b4df5cf4f64c32vboxsync drvRawFilePowerOff,
801238b286a80a5dd67ba56a1f26c0bc98a2a1eavboxsync};