Index: /trunk/include/VBox/pdmdev.h
===================================================================
--- /trunk/include/VBox/pdmdev.h	(revision 25892)
+++ /trunk/include/VBox/pdmdev.h	(revision 25893)
@@ -86,11 +86,11 @@
  * Device relocation callback.
  *
- * When this callback is called the device instance data, and if the
- * device have a GC component, is being relocated, or/and the selectors
- * have been changed. The device must use the chance to perform the
- * necessary pointer relocations and data updates.
+ * This is called when the instance data has been relocated in raw-mode context
+ * (RC).  It is also called when the RC hypervisor selects changes.  The device
+ * must fixup all necessary pointers and re-query all interfaces to other RC
+ * devices and drivers.
  *
- * Before the GC code is executed the first time, this function will be
- * called with a 0 delta so GC pointer calculations can be one in one place.
+ * Before the RC code is executed the first time, this function will be called
+ * with a 0 delta so RC pointer calculations can be one in one place.
  *
  * @param   pDevIns     Pointer to the device instance.
@@ -102,5 +102,4 @@
 /** Pointer to a FNPDMDEVRELOCATE() function. */
 typedef FNPDMDEVRELOCATE *PFNPDMDEVRELOCATE;
-
 
 /**
@@ -238,8 +237,9 @@
 
 
-/** PDM Device Registration Structure,
- * This structure is used when registering a device from
- * VBoxInitDevices() in HC Ring-3. PDM will continue use till
- * the VM is terminated.
+/**
+ * PDM Device Registration Structure.
+ *
+ * This structure is used when registering a device from VBoxInitDevices() in HC
+ * Ring-3.  PDM will continue use till the VM is terminated.
  */
 typedef struct PDMDEVREG
@@ -260,11 +260,11 @@
 
     /** Flags, combination of the PDM_DEVREG_FLAGS_* \#defines. */
-    RTUINT              fFlags;
+    uint32_t            fFlags;
     /** Device class(es), combination of the PDM_DEVREG_CLASS_* \#defines. */
-    RTUINT              fClass;
+    uint32_t            fClass;
     /** Maximum number of instances (per VM). */
-    RTUINT              cMaxInstances;
+    uint32_t            cMaxInstances;
     /** Size of the instance data. */
-    RTUINT              cbInstance;
+    uint32_t            cbInstance;
 
     /** Construct instance - required. */
Index: /trunk/include/VBox/pdmdrv.h
===================================================================
--- /trunk/include/VBox/pdmdrv.h	(revision 25892)
+++ /trunk/include/VBox/pdmdrv.h	(revision 25893)
@@ -92,4 +92,24 @@
 
 /**
+ * Driver relocation callback.
+ *
+ * This is called when the instance data has been relocated in raw-mode context
+ * (RC).  It is also called when the RC hypervisor selects changes.  The driver
+ * must fixup all necessary pointers and re-query all interfaces to other RC
+ * devices and drivers.
+ *
+ * Before the RC code is executed the first time, this function will be called
+ * with a 0 delta so RC pointer calculations can be one in one place.
+ *
+ * @param   pDrvIns     Pointer to the driver instance.
+ * @param   offDelta    The relocation delta relative to the old location.
+ *
+ * @remark  A relocation CANNOT fail.
+ */
+typedef DECLCALLBACK(void) FNPDMDRVRELOCATE(PPDMDRVINS pDrvIns, RTGCINTPTR offDelta);
+/** Pointer to a FNPDMDRVRELOCATE() function. */
+typedef FNPDMDRVRELOCATE *PFNPDMDRVRELOCATE;
+
+/**
  * Driver I/O Control interface.
  *
@@ -107,7 +127,7 @@
  * @param   pcbOut      Where to store the actual size of the output data.
  */
-typedef DECLCALLBACK(int) FNPDMDRVIOCTL(PPDMDRVINS pDrvIns, RTUINT uFunction,
-                                        void *pvIn, RTUINT cbIn,
-                                        void *pvOut, RTUINT cbOut, PRTUINT pcbOut);
+typedef DECLCALLBACK(int) FNPDMDRVIOCTL(PPDMDRVINS pDrvIns, uint32_t uFunction,
+                                        void *pvIn, uint32_t cbIn,
+                                        void *pvOut, uint32_t cbOut, uint32_t *pcbOut);
 /** Pointer to a FNPDMDRVIOCTL() function. */
 typedef FNPDMDRVIOCTL *PFNPDMDRVIOCTL;
@@ -195,8 +215,9 @@
 
 
-/** PDM Driver Registration Structure,
- * This structure is used when registering a driver from
- * VBoxInitDrivers() (HC Ring-3). PDM will continue use till
- * the VM is terminated.
+/**
+ * PDM Driver Registration Structure.
+ *
+ * This structure is used when registering a driver from VBoxInitDrivers() (in
+ * host ring-3 context).  PDM will continue use till the VM is terminated.
  */
 typedef struct PDMDRVREG
@@ -206,4 +227,10 @@
     /** Driver name. */
     char                szDriverName[32];
+    /** Name of the raw-mode context module (no path).
+     * Only evalutated if PDM_DRVREG_FLAGS_RC is set. */
+    char                szRCMod[32];
+    /** Name of the ring-0 module (no path).
+     * Only evalutated if PDM_DRVREG_FLAGS_R0 is set. */
+    char                szR0Mod[32];
     /** The description of the driver. The UTF-8 string pointed to shall, like this structure,
      * remain unchanged from registration till VM destruction. */
@@ -211,11 +238,11 @@
 
     /** Flags, combination of the PDM_DRVREG_FLAGS_* \#defines. */
-    RTUINT              fFlags;
+    uint32_t            fFlags;
     /** Driver class(es), combination of the PDM_DRVREG_CLASS_* \#defines. */
-    RTUINT              fClass;
+    uint32_t            fClass;
     /** Maximum number of instances (per VM). */
-    RTUINT              cMaxInstances;
+    uint32_t            cMaxInstances;
     /** Size of the instance data. */
-    RTUINT              cbInstance;
+    uint32_t            cbInstance;
 
     /** Construct instance - required. */
@@ -223,4 +250,6 @@
     /** Destruct instance - optional. */
     PFNPDMDRVDESTRUCT   pfnDestruct;
+    /** Relocation command - optional. */
+    PFNPDMDRVRELOCATE   pfnRelocate;
     /** I/O control - optional. */
     PFNPDMDRVIOCTL      pfnIOCtl;
@@ -250,5 +279,5 @@
 
 /** Current DRVREG version number. */
-#define PDM_DRVREG_VERSION  UINT32_C(0x80030000)
+#define PDM_DRVREG_VERSION                      UINT32_C(0x80030000)
 
 /** PDM Driver Flags.
@@ -599,5 +628,5 @@
      * @thread  The emulation thread.
      */
-    DECLR3CALLBACKMEMBER(int, pfnPDMQueueCreate,(PPDMDRVINS pDrvIns, RTUINT cbItem, RTUINT cItems, uint32_t cMilliesInterval,
+    DECLR3CALLBACKMEMBER(int, pfnPDMQueueCreate,(PPDMDRVINS pDrvIns, uint32_t cbItem, uint32_t cItems, uint32_t cMilliesInterval,
                                                  PFNPDMQUEUEDRV pfnCallback, const char *pszName, PPDMQUEUE *ppQueue));
 
@@ -972,5 +1001,5 @@
  * @copydoc PDMDRVHLP::pfnPDMQueueCreate
  */
-DECLINLINE(int) PDMDrvHlpPDMQueueCreate(PPDMDRVINS pDrvIns, RTUINT cbItem, RTUINT cItems, uint32_t cMilliesInterval,
+DECLINLINE(int) PDMDrvHlpPDMQueueCreate(PPDMDRVINS pDrvIns, uint32_t cbItem, uint32_t cItems, uint32_t cMilliesInterval,
                                         PFNPDMQUEUEDRV pfnCallback, const char *pszName, PPDMQUEUE *ppQueue)
 {
Index: /trunk/src/VBox/Devices/Audio/audio.c
===================================================================
--- /trunk/src/VBox/Devices/Audio/audio.c	(revision 25892)
+++ /trunk/src/VBox/Devices/Audio/audio.c	(revision 25893)
@@ -2056,4 +2056,8 @@
     /* szDriverName */
     "AUDIO",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "AUDIO Driver",
@@ -2070,4 +2074,6 @@
     /* pfnDestruct */
     drvAudioDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Input/DrvKeyboardQueue.cpp
===================================================================
--- /trunk/src/VBox/Devices/Input/DrvKeyboardQueue.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Input/DrvKeyboardQueue.cpp	(revision 25893)
@@ -334,4 +334,8 @@
     /* szDriverName */
     "KeyboardQueue",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Keyboard queue driver to plug in between the key source and the device to do queueing and inter-thread transport.",
@@ -346,4 +350,6 @@
     /* pfnConstruct */
     drvKbdQueueConstruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnDestruct */
     NULL,
Index: /trunk/src/VBox/Devices/Input/DrvMouseQueue.cpp
===================================================================
--- /trunk/src/VBox/Devices/Input/DrvMouseQueue.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Input/DrvMouseQueue.cpp	(revision 25893)
@@ -228,6 +228,6 @@
 
 /**
- * Construct a mouse driver instance. 
- *  
+ * Construct a mouse driver instance.
+ *
  * @copydoc FNPDMDRVCONSTRUCT
  */
@@ -322,4 +322,8 @@
     /* szDriverName */
     "MouseQueue",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Mouse queue driver to plug in between the key source and the device to do queueing and inter-thread transport.",
@@ -334,4 +338,6 @@
     /* pfnConstruct */
     drvMouseQueueConstruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnDestruct */
     NULL,
Index: /trunk/src/VBox/Devices/Network/DrvIntNet.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DrvIntNet.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Network/DrvIntNet.cpp	(revision 25893)
@@ -1137,4 +1137,8 @@
     /* szDriverName */
     "IntNet",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Internal Networking Transport Driver",
@@ -1151,4 +1155,6 @@
     /* pfnDestruct */
     drvIntNetDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Network/DrvNAT.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 25893)
@@ -241,5 +241,5 @@
     {
         RTReqProcess(pThis->pRecvReqQueue, 0);
-        if (ASMAtomicReadU32(&pThis->cPkt) == 0) 
+        if (ASMAtomicReadU32(&pThis->cPkt) == 0)
             RTSemEventWait(pThis->EventRecv, RT_INDEFINITE_WAIT);
     }
@@ -268,5 +268,5 @@
     {
         RTReqProcess(pThis->pUrgRecvReqQueue, 0);
-        if (ASMAtomicReadU32(&pThis->cUrgPkt) == 0) 
+        if (ASMAtomicReadU32(&pThis->cUrgPkt) == 0)
         {
             int rc = RTSemEventWait(pThis->EventUrgRecv, RT_INDEFINITE_WAIT);
@@ -295,10 +295,10 @@
         AssertRC(rc);
     }
-    else if (   RT_FAILURE(rc) 
+    else if (   RT_FAILURE(rc)
              && (  rc == VERR_TIMEOUT
                 && rc == VERR_INTERRUPTED))
     {
         AssertRC(rc);
-    } 
+    }
 
     rc = RTCritSectLeave(&pThis->csDevAccess);
@@ -306,5 +306,5 @@
 
     slirp_ext_m_free(pThis->pNATState, pvArg);
-    if (ASMAtomicDecU32(&pThis->cUrgPkt) == 0) 
+    if (ASMAtomicDecU32(&pThis->cUrgPkt) == 0)
     {
         drvNATRecvWakeup(pThis->pDrvIns, pThis->pRecvThread);
@@ -324,8 +324,8 @@
     {
         rc = RTSemEventWait(pThis->EventRecv, RT_INDEFINITE_WAIT);
-        if (   RT_FAILURE(rc) 
+        if (   RT_FAILURE(rc)
             && ( rc == VERR_TIMEOUT
                  || rc == VERR_INTERRUPTED))
-            goto done_unlocked; 
+            goto done_unlocked;
     }
 
@@ -337,6 +337,6 @@
         rc = pThis->pPort->pfnReceive(pThis->pPort, pu8Buf, cb);
         AssertRC(rc);
-    } 
-    else if (   RT_FAILURE(rc) 
+    }
+    else if (   RT_FAILURE(rc)
              && (  rc != VERR_TIMEOUT
                 && rc != VERR_INTERRUPTED))
@@ -1148,7 +1148,7 @@
             rc = RTSemEventCreate(&pThis->EventUrgRecv);
             rc = RTCritSectInit(&pThis->csDevAccess);
-            rc = PDMDrvHlpTMTimerCreate(pThis->pDrvIns, TMCLOCK_REAL/*enmClock*/, drvNATSlowTimer, 
+            rc = PDMDrvHlpTMTimerCreate(pThis->pDrvIns, TMCLOCK_REAL/*enmClock*/, drvNATSlowTimer,
                     pThis, TMTIMER_FLAGS_NO_CRIT_SECT/*flags*/, "NATSlowTmr", &pThis->pTmrSlow);
-            rc = PDMDrvHlpTMTimerCreate(pThis->pDrvIns, TMCLOCK_REAL/*enmClock*/, drvNATFastTimer, 
+            rc = PDMDrvHlpTMTimerCreate(pThis->pDrvIns, TMCLOCK_REAL/*enmClock*/, drvNATFastTimer,
                     pThis, TMTIMER_FLAGS_NO_CRIT_SECT/*flags*/, "NATFastTmr", &pThis->pTmrFast);
 
@@ -1211,4 +1211,8 @@
     /* szDriverName */
     "NAT",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "NAT Network Transport Driver",
@@ -1225,4 +1229,6 @@
     /* pfnDestruct */
     drvNATDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Network/DrvNetSniffer.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DrvNetSniffer.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Network/DrvNetSniffer.cpp	(revision 25893)
@@ -490,4 +490,8 @@
     /* szDriverName */
     "NetSniffer",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Network Sniffer Filter Driver",
@@ -504,4 +508,6 @@
     /* pfnDestruct */
     drvNetSnifferDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Network/DrvTAP.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DrvTAP.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Network/DrvTAP.cpp	(revision 25893)
@@ -1067,4 +1067,8 @@
     /* szDriverName */
     "HostInterface",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "TAP Network Transport Driver",
@@ -1081,4 +1085,6 @@
     /* pfnDestruct */
     drvTAPDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/PC/DrvACPI.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DrvACPI.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/PC/DrvACPI.cpp	(revision 25893)
@@ -749,5 +749,5 @@
      * Check that no-one is attached to us.
      */
-    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER, 
+    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
                     ("Configuration error: Not possible to attach anything to this driver!\n"),
                     VERR_PDM_DRVINS_NO_ATTACH);
@@ -777,4 +777,8 @@
     /* szDriverName */
     "ACPIHost",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "ACPI Host Driver",
@@ -791,4 +795,6 @@
     /* pfnDestruct */
     drvACPIDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
@@ -804,7 +810,7 @@
     NULL,
     /* pfnDetach */
-    NULL, 
+    NULL,
     /* pfnPowerOff */
-    NULL, 
+    NULL,
     /* pfnSoftReset */
     NULL,
Index: /trunk/src/VBox/Devices/PC/DrvAcpiCpu.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DrvAcpiCpu.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/PC/DrvAcpiCpu.cpp	(revision 25893)
@@ -89,5 +89,5 @@
      * Check that no-one is attached to us.
      */
-    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER, 
+    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
                     ("Configuration error: Not possible to attach anything to this driver!\n"),
                     VERR_PDM_DRVINS_NO_ATTACH);
@@ -105,4 +105,8 @@
     /* szDriverName */
     "ACPICpu",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "ACPI CPU Driver",
@@ -119,4 +123,6 @@
     /* pfnDestruct */
     drvACPICpuDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
@@ -132,7 +138,7 @@
     NULL,
     /* pfnDetach */
-    NULL, 
+    NULL,
     /* pfnPowerOff */
-    NULL, 
+    NULL,
     /* pfnSoftReset */
     NULL,
Index: /trunk/src/VBox/Devices/Parallel/DrvHostParallel.cpp
===================================================================
--- /trunk/src/VBox/Devices/Parallel/DrvHostParallel.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Parallel/DrvHostParallel.cpp	(revision 25893)
@@ -406,4 +406,8 @@
     /* szDriverName */
     "HostParallel",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Parallel host driver.",
@@ -420,4 +424,6 @@
     /* pfnDestruct */
     drvHostParallelDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Serial/DrvChar.cpp
===================================================================
--- /trunk/src/VBox/Devices/Serial/DrvChar.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Serial/DrvChar.cpp	(revision 25893)
@@ -304,5 +304,5 @@
 /**
  * Construct a char driver instance.
- *  
+ *
  * @copydoc FNPDMDRVCONSTRUCT
  */
@@ -343,5 +343,5 @@
         return PDMDrvHlpVMSetError(pDrvIns, VERR_PDM_MISSING_INTERFACE_BELOW, RT_SRC_POS, N_("Char#%d has no stream interface below"), pDrvIns->iInstance);
 
-    /* 
+    /*
      * Don't start the receive thread if the driver doesn't support reading
      */
@@ -414,4 +414,8 @@
     /* szDriverName */
     "Char",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Generic char driver.",
@@ -428,4 +432,6 @@
     /* pfnDestruct */
     drvCharDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
@@ -441,7 +447,7 @@
     NULL,
     /* pfnDetach */
-    NULL, 
+    NULL,
     /* pfnPowerOff */
-    NULL, 
+    NULL,
     /* pfnSoftReset */
     NULL,
Index: /trunk/src/VBox/Devices/Serial/DrvHostSerial.cpp
===================================================================
--- /trunk/src/VBox/Devices/Serial/DrvHostSerial.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Serial/DrvHostSerial.cpp	(revision 25893)
@@ -1468,5 +1468,9 @@
     /* szDriverName */
     "Host Serial",
-    /* pszDescription */
+        /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
+/* pszDescription */
     "Host serial driver.",
     /* fFlags */
@@ -1482,4 +1486,6 @@
     /* pfnDestruct */
     drvHostSerialDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Serial/DrvNamedPipe.cpp
===================================================================
--- /trunk/src/VBox/Devices/Serial/DrvNamedPipe.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Serial/DrvNamedPipe.cpp	(revision 25893)
@@ -617,4 +617,8 @@
     /* szDriverName */
     "NamedPipe",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Named Pipe stream driver.",
@@ -631,4 +635,6 @@
     /* pfnDestruct */
     drvNamedPipeDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Serial/DrvRawFile.cpp
===================================================================
--- /trunk/src/VBox/Devices/Serial/DrvRawFile.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Serial/DrvRawFile.cpp	(revision 25893)
@@ -219,4 +219,8 @@
     /* szDriverName */
     "RawFile",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "RawFile stream driver.",
@@ -233,4 +237,6 @@
     /* pfnDestruct */
     drvRawFileDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Storage/DrvBlock.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvBlock.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Storage/DrvBlock.cpp	(revision 25893)
@@ -903,4 +903,8 @@
     /* szDriverName */
     "Block",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Generic block driver.",
@@ -916,4 +920,6 @@
     drvblockConstruct,
     /* pfnDestruct */
+    NULL,
+    /* pfnRelocate */
     NULL,
     /* pfnIOCtl */
Index: /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 25893)
@@ -830,4 +830,8 @@
     /* szDriverName */
     "HostDVD",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Host DVD Block Driver.",
@@ -844,4 +848,6 @@
     /* pfnDestruct */
     drvHostDvdDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Storage/DrvHostFloppy.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostFloppy.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Storage/DrvHostFloppy.cpp	(revision 25893)
@@ -204,4 +204,8 @@
     /* szDriverName */
     "HostFloppy",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Host Floppy Block Driver.",
@@ -218,4 +222,6 @@
     /* pfnDestruct */
     DRVHostBaseDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
@@ -231,7 +237,7 @@
     NULL,
     /* pfnDetach */
-    NULL, 
+    NULL,
     /* pfnPowerOff */
-    NULL, 
+    NULL,
     /* pfnSoftReset */
     NULL,
Index: /trunk/src/VBox/Devices/Storage/DrvMediaISO.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvMediaISO.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Storage/DrvMediaISO.cpp	(revision 25893)
@@ -319,4 +319,8 @@
     /* szDriverName */
     "MediaISO",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "ISO media access driver.",
@@ -333,4 +337,6 @@
     /* pfnDestruct */
     drvMediaISODestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
@@ -346,7 +352,7 @@
     NULL,
     /* pfnDetach */
-    NULL, 
+    NULL,
     /* pfnPowerOff */
-    NULL, 
+    NULL,
     /* pfnSoftReset */
     NULL,
Index: /trunk/src/VBox/Devices/Storage/DrvRawImage.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvRawImage.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Storage/DrvRawImage.cpp	(revision 25893)
@@ -92,7 +92,7 @@
 /**
  * Construct a raw image driver instance.
- *  
+ *
  * @copydoc FNPDMDRVCONSTRUCT
- */ 
+ */
 static DECLCALLBACK(int) drvRawImageConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags)
 {
@@ -369,4 +369,8 @@
     /* szDriverName */
     "RawImage",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Raw image access driver.",
@@ -383,4 +387,6 @@
     /* pfnDestruct */
     drvRawImageDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
@@ -396,7 +402,7 @@
     NULL,
     /* pfnDetach */
-    NULL, 
+    NULL,
     /* pfnPowerOff */
-    NULL, 
+    NULL,
     /* pfnSoftReset */
     NULL,
Index: /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 25893)
@@ -1028,4 +1028,8 @@
     /* szDriverName */
     "SCSI",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Generic SCSI driver.",
@@ -1042,4 +1046,6 @@
     /* pfnDestruct */
     drvscsiDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Storage/DrvSCSIHost.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvSCSIHost.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Storage/DrvSCSIHost.cpp	(revision 25893)
@@ -500,4 +500,8 @@
     /* szDriverName */
     "SCSIHost",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Host SCSI driver.",
@@ -514,4 +518,6 @@
     /* pfnDestruct */
     drvscsihostDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Devices/Storage/DrvVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 25892)
+++ /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 25893)
@@ -1318,4 +1318,8 @@
     /* szDriverName */
     "VD",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Generic VBox disk media driver.",
@@ -1332,4 +1336,6 @@
     /* pfnDestruct */
     drvvdDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Frontends/VBoxBFE/DisplayImpl.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxBFE/DisplayImpl.cpp	(revision 25892)
+++ /trunk/src/VBox/Frontends/VBoxBFE/DisplayImpl.cpp	(revision 25893)
@@ -1249,4 +1249,8 @@
     /* szDriverName */
     "MainDisplay",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main display driver (Main as in the API).",
@@ -1262,4 +1266,6 @@
     VMDisplay::drvConstruct,
     /* pfnDestruct */
+    NULL,
+    /* pfnRelocate */
     NULL,
     /* pfnIOCtl */
Index: /trunk/src/VBox/Frontends/VBoxBFE/KeyboardImpl.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxBFE/KeyboardImpl.cpp	(revision 25892)
+++ /trunk/src/VBox/Frontends/VBoxBFE/KeyboardImpl.cpp	(revision 25893)
@@ -220,5 +220,5 @@
     if (!CFGMR3AreValuesValid(pCfgHandle, "Object\0"))
         return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
-    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER, 
+    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
                     ("Configuration error: Not possible to attach anything to this driver!\n"),
                     VERR_PDM_DRVINS_NO_ATTACH);
@@ -267,4 +267,8 @@
     /* szDriverName */
     "MainKeyboard",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main keyboard driver (Main as in the API).",
@@ -281,4 +285,6 @@
     /* pfnDestruct */
     Keyboard::drvDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
@@ -294,7 +300,7 @@
     NULL,
     /* pfnDetach */
-    NULL, 
+    NULL,
     /* pfnPowerOff */
-    NULL, 
+    NULL,
     /* pfnSoftReset */
     NULL,
Index: /trunk/src/VBox/Frontends/VBoxBFE/MouseImpl.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxBFE/MouseImpl.cpp	(revision 25892)
+++ /trunk/src/VBox/Frontends/VBoxBFE/MouseImpl.cpp	(revision 25893)
@@ -274,4 +274,8 @@
     /* szDriverName */
     "MainMouse",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main mouse driver (Main as in the API).",
@@ -288,4 +292,6 @@
     /* pfnDestruct */
     Mouse::drvDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Frontends/VBoxBFE/StatusImpl.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxBFE/StatusImpl.cpp	(revision 25892)
+++ /trunk/src/VBox/Frontends/VBoxBFE/StatusImpl.cpp	(revision 25893)
@@ -141,5 +141,5 @@
     if (!CFGMR3AreValuesValid(pCfgHandle, "papLeds\0First\0Last\0"))
         return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
-    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER, 
+    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
                     ("Configuration error: Not possible to attach anything to this driver!\n"),
                     VERR_PDM_DRVINS_NO_ATTACH);
@@ -211,4 +211,8 @@
     /* szDriverName */
     "MainStatus",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main status driver (Main as in the API).",
@@ -225,4 +229,6 @@
     /* pfnDestruct */
     VMStatus::drvDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
@@ -238,7 +244,7 @@
     NULL,
     /* pfnDetach */
-    NULL, 
+    NULL,
     /* pfnPowerOff */
-    NULL, 
+    NULL,
     /* pfnSoftReset */
     NULL,
Index: /trunk/src/VBox/Frontends/VBoxBFE/VMMDevInterface.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxBFE/VMMDevInterface.cpp	(revision 25892)
+++ /trunk/src/VBox/Frontends/VBoxBFE/VMMDevInterface.cpp	(revision 25893)
@@ -500,4 +500,8 @@
     /* szDriverName */
     "HGCM",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main VMMDev driver (Main as in the API).",
@@ -514,4 +518,6 @@
     /* pfnDestruct */
     VMMDev::drvDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Main/AudioSnifferInterface.cpp
===================================================================
--- /trunk/src/VBox/Main/AudioSnifferInterface.cpp	(revision 25892)
+++ /trunk/src/VBox/Main/AudioSnifferInterface.cpp	(revision 25893)
@@ -157,6 +157,6 @@
 
 /**
- * Construct a AudioSniffer driver instance. 
- *  
+ * Construct a AudioSniffer driver instance.
+ *
  * @copydoc FNPDMDRVCONSTRUCT
  */
@@ -172,5 +172,5 @@
     if (!CFGMR3AreValuesValid(pCfgHandle, "Object\0"))
         return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
-    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER, 
+    AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
                     ("Configuration error: Not possible to attach anything to this driver!\n"),
                     VERR_PDM_DRVINS_NO_ATTACH);
@@ -221,4 +221,8 @@
     /* szDriverName */
     "MainAudioSniffer",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main Audio Sniffer driver (Main as in the API).",
@@ -235,4 +239,6 @@
     /* pfnDestruct */
     AudioSniffer::drvDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
@@ -248,7 +254,7 @@
     NULL,
     /* pfnDetach */
-    NULL, 
+    NULL,
     /* pfnPowerOff */
-    NULL, 
+    NULL,
     /* pfnSoftReset */
     NULL,
Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 25892)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 25893)
@@ -7976,4 +7976,8 @@
     /* szDriverName */
     "MainStatus",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main status driver (Main as in the API).",
@@ -7990,4 +7994,6 @@
     /* pfnDestruct */
     Console::drvStatus_Destruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Main/DisplayImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/DisplayImpl.cpp	(revision 25892)
+++ /trunk/src/VBox/Main/DisplayImpl.cpp	(revision 25893)
@@ -3508,4 +3508,8 @@
     /* szDriverName */
     "MainDisplay",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main display driver (Main as in the API).",
@@ -3522,4 +3526,6 @@
     /* pfnDestruct */
     Display::drvDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Main/KeyboardImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/KeyboardImpl.cpp	(revision 25892)
+++ /trunk/src/VBox/Main/KeyboardImpl.cpp	(revision 25893)
@@ -332,4 +332,8 @@
     /* szDriverName */
     "MainKeyboard",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main keyboard driver (Main as in the API).",
@@ -346,4 +350,6 @@
     /* pfnDestruct */
     Keyboard::drvDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Main/MouseImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MouseImpl.cpp	(revision 25892)
+++ /trunk/src/VBox/Main/MouseImpl.cpp	(revision 25893)
@@ -459,4 +459,8 @@
     /* szDriverName */
     "MainMouse",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main mouse driver (Main as in the API).",
@@ -473,4 +477,6 @@
     /* pfnDestruct */
     Mouse::drvDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Main/VMMDevInterface.cpp
===================================================================
--- /trunk/src/VBox/Main/VMMDevInterface.cpp	(revision 25892)
+++ /trunk/src/VBox/Main/VMMDevInterface.cpp	(revision 25893)
@@ -836,4 +836,8 @@
     /* szDriverName */
     "HGCM",
+    /* szRCMod */
+    "",
+    /* szR0Mod */
+    "",
     /* pszDescription */
     "Main VMMDev driver (Main as in the API).",
@@ -850,4 +854,6 @@
     /* pfnDestruct */
     VMMDev::drvDestruct,
+    /* pfnRelocate */
+    NULL,
     /* pfnIOCtl */
     NULL,
Index: /trunk/src/VBox/Main/include/KeyboardImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/KeyboardImpl.h	(revision 25892)
+++ /trunk/src/VBox/Main/include/KeyboardImpl.h	(revision 25893)
@@ -107,4 +107,4 @@
 };
 
-#endif // ____H_KEYBOARDIMPL
+#endif // !____H_KEYBOARDIMPL
 /* vi: set tabstop=4 shiftwidth=4 expandtab: */
Index: /trunk/src/VBox/VMM/PDMDevHlp.cpp
===================================================================
--- /trunk/src/VBox/VMM/PDMDevHlp.cpp	(revision 25892)
+++ /trunk/src/VBox/VMM/PDMDevHlp.cpp	(revision 25893)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2007 Sun Microsystems, Inc.
+ * Copyright (C) 2006-2010 Sun Microsystems, Inc.
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
Index: /trunk/src/VBox/VMM/PDMDevice.cpp
===================================================================
--- /trunk/src/VBox/VMM/PDMDevice.cpp	(revision 25892)
+++ /trunk/src/VBox/VMM/PDMDevice.cpp	(revision 25893)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2007 Sun Microsystems, Inc.
+ * Copyright (C) 2006-2010 Sun Microsystems, Inc.
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
Index: /trunk/src/VBox/VMM/PDMDriver.cpp
===================================================================
--- /trunk/src/VBox/VMM/PDMDriver.cpp	(revision 25892)
+++ /trunk/src/VBox/VMM/PDMDriver.cpp	(revision 25893)
@@ -276,21 +276,47 @@
      */
     AssertPtrReturn(pDrvReg, VERR_INVALID_POINTER);
-    AssertMsgReturn(pDrvReg->u32Version == PDM_DRVREG_VERSION, ("%#x\n", pDrvReg->u32Version), VERR_PDM_UNKNOWN_DRVREG_VERSION);
+    AssertMsgReturn(pDrvReg->u32Version == PDM_DRVREG_VERSION,
+                    ("%#x\n", pDrvReg->u32Version),
+                    VERR_PDM_UNKNOWN_DRVREG_VERSION);
     AssertReturn(pDrvReg->szDriverName[0], VERR_PDM_INVALID_DRIVER_REGISTRATION);
     AssertMsgReturn(memchr(pDrvReg->szDriverName, '\0', sizeof(pDrvReg->szDriverName)),
                     (".*s\n", sizeof(pDrvReg->szDriverName), pDrvReg->szDriverName),
                     VERR_PDM_INVALID_DRIVER_REGISTRATION);
+    AssertMsgReturn(    !(pDrvReg->fFlags & PDM_DRVREG_FLAGS_R0)
+                    ||  (   pDrvReg->szR0Mod[0]
+                         && memchr(pDrvReg->szR0Mod, '\0', sizeof(pDrvReg->szR0Mod))),
+                    ("%s: %.*s\n", pDrvReg->szDriverName, sizeof(pDrvReg->szR0Mod), pDrvReg->szR0Mod),
+                    VERR_PDM_INVALID_DRIVER_REGISTRATION);
+    AssertMsgReturn(    !(pDrvReg->fFlags & PDM_DRVREG_FLAGS_RC)
+                    ||  (   pDrvReg->szRCMod[0]
+                         && memchr(pDrvReg->szRCMod, '\0', sizeof(pDrvReg->szRCMod))),
+                    ("%s: %.*s\n", pDrvReg->szDriverName, sizeof(pDrvReg->szRCMod), pDrvReg->szRCMod),
+                    VERR_PDM_INVALID_DRIVER_REGISTRATION);
+    AssertMsgReturn(VALID_PTR(pDrvReg->pszDescription),
+                    ("%s: %p\n", pDrvReg->szDriverName, pDrvReg->pszDescription),
+                    VERR_PDM_INVALID_DRIVER_REGISTRATION);
+    AssertMsgReturn(!(pDrvReg->fFlags & ~(PDM_DRVREG_FLAGS_HOST_BITS_MASK | PDM_DRVREG_FLAGS_R0 | PDM_DRVREG_FLAGS_RC)),
+                    ("%s: %#x\n", pDrvReg->szDriverName, pDrvReg->fFlags),
+                    VERR_PDM_INVALID_DRIVER_REGISTRATION);
     AssertMsgReturn((pDrvReg->fFlags & PDM_DRVREG_FLAGS_HOST_BITS_MASK) == PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
-                    ("%s: fFlags=%#x\n", pDrvReg->szDriverName, pDrvReg->fFlags),
+                    ("%s: %#x\n", pDrvReg->szDriverName, pDrvReg->fFlags),
                     VERR_PDM_INVALID_DRIVER_HOST_BITS);
-    AssertMsgReturn(pDrvReg->cMaxInstances > 0, ("%s: %#x\n", pDrvReg->szDriverName, pDrvReg->cMaxInstances),
+    AssertMsgReturn(pDrvReg->cMaxInstances > 0,
+                    ("%s: %#x\n", pDrvReg->szDriverName, pDrvReg->cMaxInstances),
                     VERR_PDM_INVALID_DRIVER_REGISTRATION);
-    AssertMsgReturn(pDrvReg->cbInstance <= _1M, ("%s: %#x\n", pDrvReg->szDriverName, pDrvReg->cbInstance),
+    AssertMsgReturn(pDrvReg->cbInstance <= _1M,
+                    ("%s: %#x\n", pDrvReg->szDriverName, pDrvReg->cbInstance),
                     VERR_PDM_INVALID_DRIVER_REGISTRATION);
-    AssertMsgReturn(VALID_PTR(pDrvReg->pfnConstruct), ("%s: %p\n", pDrvReg->szDriverName, pDrvReg->pfnConstruct),
+    AssertMsgReturn(VALID_PTR(pDrvReg->pfnConstruct),
+                    ("%s: %p\n", pDrvReg->szDriverName, pDrvReg->pfnConstruct),
                     VERR_PDM_INVALID_DRIVER_REGISTRATION);
-    AssertMsgReturn(pDrvReg->pfnSoftReset == NULL, ("%s: %p\n", pDrvReg->szDriverName, pDrvReg->pfnSoftReset),
+    AssertMsgReturn(VALID_PTR(pDrvReg->pfnRelocate) || !(pDrvReg->fFlags & PDM_DRVREG_FLAGS_RC),
+                    ("%s: %#x\n", pDrvReg->szDriverName, pDrvReg->cbInstance),
                     VERR_PDM_INVALID_DRIVER_REGISTRATION);
-    AssertMsgReturn(pDrvReg->u32VersionEnd == PDM_DRVREG_VERSION, ("%s: #x\n", pDrvReg->szDriverName, pDrvReg->u32VersionEnd),
+    AssertMsgReturn(pDrvReg->pfnSoftReset == NULL,
+                    ("%s: %p\n", pDrvReg->szDriverName, pDrvReg->pfnSoftReset),
+                    VERR_PDM_INVALID_DRIVER_REGISTRATION);
+    AssertMsgReturn(pDrvReg->u32VersionEnd == PDM_DRVREG_VERSION,
+                    ("%s: #x\n", pDrvReg->szDriverName, pDrvReg->u32VersionEnd),
                     VERR_PDM_INVALID_DRIVER_REGISTRATION);
 
@@ -910,5 +936,5 @@
 
 /** @copydoc PDMDRVHLP::pfnPDMQueueCreate */
-static DECLCALLBACK(int) pdmR3DrvHlp_PDMQueueCreate(PPDMDRVINS pDrvIns, RTUINT cbItem, RTUINT cItems, uint32_t cMilliesInterval,
+static DECLCALLBACK(int) pdmR3DrvHlp_PDMQueueCreate(PPDMDRVINS pDrvIns, uint32_t cbItem, uint32_t cItems, uint32_t cMilliesInterval,
                                                     PFNPDMQUEUEDRV pfnCallback, const char *pszName, PPDMQUEUE *ppQueue)
 {
