DrvRawFile.cpp revision da3503c04ce76e653401396fe2795a9bc2427a1d
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/* $Id$ */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** @file
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * VBox stream drivers - Raw file output.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Copyright (C) 2006-2010 Sun Microsystems, Inc.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * available from http://www.virtualbox.org. This file is free software;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * General Public License (GPL) as published by the Free Software
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * additional information or have any questions.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Header Files *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#define LOG_GROUP LOG_GROUP_DEFAULT
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <VBox/pdmdrv.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/assert.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/file.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/mem.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/semaphore.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/stream.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/string.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/uuid.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include "Builtins.h"
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Defined Constants And Macros *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Converts a pointer to DRVRAWFILE::IMedia to a PDRVRAWFILE. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#define PDMISTREAM_2_DRVRAWFILE(pInterface) ( (PDRVRAWFILE)((uintptr_t)pInterface - RT_OFFSETOF(DRVRAWFILE, IStream)) )
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** Converts a pointer to PDMDRVINS::IBase to a PPDMDRVINS. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#define PDMIBASE_2_DRVINS(pInterface) ( (PPDMDRVINS)((uintptr_t)pInterface - RT_OFFSETOF(PDMDRVINS, IBase)) )
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Structures and Typedefs *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Raw file output driver instance data.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @implements PDMISTREAM
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsynctypedef struct DRVRAWFILE
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** The stream interface. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDMISTREAM IStream;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** Pointer to the driver instance. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PPDMDRVINS pDrvIns;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** Pointer to the file name. (Freed by MM) */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync char *pszLocation;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** Flag whether VirtualBox represents the server or client side. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync RTFILE OutputFile;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync} DRVRAWFILE, *PDRVRAWFILE;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** @copydoc PDMISTREAM::pfnWrite */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic DECLCALLBACK(int) drvRawFileWrite(PPDMISTREAM pInterface, const void *pvBuf, size_t *pcbWrite)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int rc = VINF_SUCCESS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDRVRAWFILE pThis = PDMISTREAM_2_DRVRAWFILE(pInterface);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogFlow(("%s: pvBuf=%p *pcbWrite=%#x (%s)\n", __FUNCTION__, pvBuf, *pcbWrite, pThis->pszLocation));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Assert(pvBuf);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (pThis->OutputFile != NIL_RTFILE)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync size_t cbWritten;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = RTFileWrite(pThis->OutputFile, pvBuf, *pcbWrite, &cbWritten);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#if 0
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* don't flush here, takes too long and we will loose characters */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (RT_SUCCESS(rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync RTFileFlush(pThis->OutputFile);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#endif
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *pcbWrite = cbWritten;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogFlow(("%s: returns %Rrc\n", __FUNCTION__, rc));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return rc;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @interface_method_impl{PDMIBASE,pfnQueryInterface}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic DECLCALLBACK(void *) drvRawFileQueryInterface(PPDMIBASE pInterface, const char *pszIID)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_DRVINS(pInterface);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (RTUuidCompare2Strs(pszIID, PDMIBASE_IID) == 0)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return &pDrvIns->IBase;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMISTREAM, &pThis->IStream);
0a769a6be37f526faeabe88f77422ee6291afa37vboxsync return NULL;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Construct a raw output stream driver instance.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @copydoc FNPDMDRVCONSTRUCT
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic DECLCALLBACK(int) drvRawFileConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Init the static parts.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pThis->pDrvIns = pDrvIns;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pThis->pszLocation = NULL;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pThis->OutputFile = NIL_RTFILE;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* IBase */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pDrvIns->IBase.pfnQueryInterface = drvRawFileQueryInterface;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* IStream */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pThis->IStream.pfnWrite = drvRawFileWrite;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Read the configuration.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (!CFGMR3AreValuesValid(pCfgHandle, "Location\0"))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertFailedReturn(VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int rc = CFGMR3QueryStringAlloc(pCfgHandle, "Location", &pThis->pszLocation);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (RT_FAILURE(rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertMsgFailedReturn(("Configuration error: query \"Location\" resulted in %Rrc.\n", rc), rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Open the raw file.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = RTFileOpen(&pThis->OutputFile, pThis->pszLocation, RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_NONE);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (RT_FAILURE(rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogRel(("RawFile%d: CreateFile failed rc=%Rrc\n", pDrvIns->iInstance));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("RawFile#%d failed to create the raw output file %s"), pDrvIns->iInstance, pThis->pszLocation);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogFlow(("drvRawFileConstruct: location %s\n", pThis->pszLocation));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogRel(("RawFile#%u: location %s\n", pDrvIns->iInstance, pThis->pszLocation));
4b30f6c72b07654509606857da385afcc09aaae3vboxsync return VINF_SUCCESS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Destruct a raw output stream driver instance.
0a769a6be37f526faeabe88f77422ee6291afa37vboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Most VM resources are freed by the VM. This callback is provided so that
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * any non-VM resources can be freed correctly.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * @param pDrvIns The driver instance data.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
4b30f6c72b07654509606857da385afcc09aaae3vboxsyncstatic DECLCALLBACK(void) drvRawFileDestruct(PPDMDRVINS pDrvIns)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogFlow(("%s: %s\n", __FUNCTION__, pThis->pszLocation));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (pThis->pszLocation)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync MMR3HeapFree(pThis->pszLocation);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (pThis->OutputFile != NIL_RTFILE)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync RTFileClose(pThis->OutputFile);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pThis->OutputFile = NIL_RTFILE;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Power off a raw output stream driver instance.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * This does most of the destruction work, to avoid ordering dependencies.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
4b30f6c72b07654509606857da385afcc09aaae3vboxsync * @param pDrvIns The driver instance data.
4b30f6c72b07654509606857da385afcc09aaae3vboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic DECLCALLBACK(void) drvRawFilePowerOff(PPDMDRVINS pDrvIns)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDRVRAWFILE pThis = PDMINS_2_DATA(pDrvIns, PDRVRAWFILE);
0a769a6be37f526faeabe88f77422ee6291afa37vboxsync LogFlow(("%s: %s\n", __FUNCTION__, pThis->pszLocation));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (pThis->OutputFile != NIL_RTFILE)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
4b30f6c72b07654509606857da385afcc09aaae3vboxsync RTFileClose(pThis->OutputFile);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pThis->OutputFile = NIL_RTFILE;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/**
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Raw file driver registration record.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncconst PDMDRVREG g_DrvRawFile =
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* u32Version */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDM_DRVREG_VERSION,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* szDriverName */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync "RawFile",
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* szRCMod */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync "",
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* szR0Mod */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync "",
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pszDescription */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync "RawFile stream driver.",
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* fFlags */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
0a769a6be37f526faeabe88f77422ee6291afa37vboxsync /* fClass. */
4b30f6c72b07654509606857da385afcc09aaae3vboxsync PDM_DRVREG_CLASS_STREAM,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* cMaxInstances */
4b30f6c72b07654509606857da385afcc09aaae3vboxsync ~0,
4b30f6c72b07654509606857da385afcc09aaae3vboxsync /* cbInstance */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync sizeof(DRVRAWFILE),
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnConstruct */
4b30f6c72b07654509606857da385afcc09aaae3vboxsync drvRawFileConstruct,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnDestruct */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync drvRawFileDestruct,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnRelocate */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync NULL,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnIOCtl */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync NULL,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnPowerOn */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync NULL,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnReset */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync NULL,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnSuspend */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync NULL,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnResume */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync NULL,
0a769a6be37f526faeabe88f77422ee6291afa37vboxsync /* pfnAttach */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync NULL,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnDetach */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync NULL,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnPowerOff */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync drvRawFilePowerOff,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* pfnSoftReset */
0a769a6be37f526faeabe88f77422ee6291afa37vboxsync NULL,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* u32EndVersion */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PDM_DRVREG_VERSION
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync};
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync