Index: /trunk/src/VBox/GuestHost/HGSMI/HGSMICommon.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/HGSMI/HGSMICommon.cpp	(revision 71590)
+++ /trunk/src/VBox/GuestHost/HGSMI/HGSMICommon.cpp	(revision 71591)
@@ -89,7 +89,5 @@
 }
 
-static uint32_t hgsmiHashProcess(uint32_t hash,
-                                 const void *pvData,
-                                 size_t cbData)
+static uint32_t hgsmiHashProcess(uint32_t hash, const void RT_UNTRUSTED_VOLATILE_HSTGST *pvData, size_t cbData)
 {
     const uint8_t *pu8Data = (const uint8_t *)pvData;
@@ -114,7 +112,6 @@
 }
 
-uint32_t HGSMIChecksum(HGSMIOFFSET offBuffer,
-                       const HGSMIBUFFERHEADER *pHeader,
-                       const HGSMIBUFFERTAIL *pTail)
+uint32_t HGSMIChecksum(HGSMIOFFSET offBuffer, const HGSMIBUFFERHEADER RT_UNTRUSTED_VOLATILE_HSTGST *pHeader,
+                       const HGSMIBUFFERTAIL RT_UNTRUSTED_VOLATILE_HSTGST *pTail)
 {
     uint32_t u32Checksum = hgsmiHashBegin();
@@ -127,8 +124,5 @@
 }
 
-int HGSMIAreaInitialize(HGSMIAREA *pArea,
-                        void *pvBase,
-                        HGSMISIZE cbArea,
-                        HGSMIOFFSET offBase)
+int HGSMIAreaInitialize(HGSMIAREA *pArea, void *pvBase, HGSMISIZE cbArea, HGSMIOFFSET offBase)
 {
     uint8_t *pu8Base = (uint8_t *)pvBase;
@@ -198,5 +192,5 @@
     RT_ZERO(pHeader->u.au8Union);
 
-    HGSMIBUFFERTAIL *pTail = HGSMIBufferTailFromPtr(pHeader, u32DataSize);
+    HGSMIBUFFERTAIL RT_UNTRUSTED_VOLATILE_HSTGST *pTail = HGSMIBufferTailFromPtr(pHeader, u32DataSize);
     pTail->u32Reserved = 0;
     pTail->u32Checksum = HGSMIChecksum(offBuffer, pHeader, pTail);
@@ -205,9 +199,5 @@
 }
 
-int HGSMIHeapSetup(HGSMIHEAP *pHeap,
-                   void *pvBase,
-                   HGSMISIZE cbArea,
-                   HGSMIOFFSET offBase,
-                   const HGSMIENV *pEnv)
+int HGSMIHeapSetup(HGSMIHEAP *pHeap, void *pvBase, HGSMISIZE cbArea, HGSMIOFFSET offBase, const HGSMIENV *pEnv)
 {
     HGSMI_ASSERT_PTR_RETURN(pHeap, VERR_INVALID_PARAMETER);
@@ -236,8 +226,8 @@
 }
 
-void *HGSMIHeapAlloc(HGSMIHEAP *pHeap,
-                     HGSMISIZE cbData,
-                     uint8_t u8Channel,
-                     uint16_t u16ChannelInfo)
+void RT_UNTRUSTED_VOLATILE_HOST *HGSMIHeapAlloc(HGSMIHEAP *pHeap,
+                                                HGSMISIZE cbData,
+                                                uint8_t u8Channel,
+                                                uint16_t u16ChannelInfo)
 {
     HGSMISIZE cbAlloc = HGSMIBufferRequiredSize(cbData);
@@ -257,23 +247,19 @@
 }
 
-void HGSMIHeapFree(HGSMIHEAP *pHeap,
-                   void *pvData)
+void HGSMIHeapFree(HGSMIHEAP *pHeap, void RT_UNTRUSTED_VOLATILE_GUEST *pvData)
 {
     if (pvData)
     {
-        HGSMIBUFFERHEADER *pHeader = HGSMIBufferHeaderFromData(pvData);
+        HGSMIBUFFERHEADER RT_UNTRUSTED_VOLATILE_HOST *pHeader = HGSMIBufferHeaderFromData(pvData);
         HGSMIHeapBufferFree(pHeap, pHeader);
     }
 }
 
-void *HGSMIHeapBufferAlloc(HGSMIHEAP *pHeap,
-                           HGSMISIZE cbBuffer)
-{
-    void *pvBuf = HGSMIMAAlloc(&pHeap->ma, cbBuffer);
-    return pvBuf;
-}
-
-void HGSMIHeapBufferFree(HGSMIHEAP *pHeap,
-                         void *pvBuf)
+void RT_UNTRUSTED_VOLATILE_HSTGST *HGSMIHeapBufferAlloc(HGSMIHEAP *pHeap, HGSMISIZE cbBuffer)
+{
+    return HGSMIMAAlloc(&pHeap->ma, cbBuffer);
+}
+
+void HGSMIHeapBufferFree(HGSMIHEAP *pHeap, void RT_UNTRUSTED_VOLATILE_GUEST *pvBuf)
 {
     HGSMIMAFree(&pHeap->ma, pvBuf);
@@ -282,7 +268,10 @@
 typedef struct HGSMIBUFFERCONTEXT
 {
-    const volatile HGSMIBUFFERHEADER *pHeader; /**< The original buffer header. */
-    void *pvData;                              /**< Payload data in the buffer./ */
-    uint32_t cbData;                           /**< Size of data  */
+    /** The original buffer header. */
+    const HGSMIBUFFERHEADER RT_UNTRUSTED_VOLATILE_HSTGST *pHeader;
+    /** Payload data in the buffer. */
+    void RT_UNTRUSTED_VOLATILE_HSTGST *pvData;
+    /** Size of data  */
+    uint32_t cbData;
 } HGSMIBUFFERCONTEXT;
 
@@ -294,7 +283,5 @@
  * @param pBufferContext Where to write information about the buffer.
  */
-static int hgsmiVerifyBuffer(const HGSMIAREA *pArea,
-                             HGSMIOFFSET offBuffer,
-                             HGSMIBUFFERCONTEXT *pBufferContext)
+static int hgsmiVerifyBuffer(const HGSMIAREA *pArea, HGSMIOFFSET offBuffer, HGSMIBUFFERCONTEXT *pBufferContext)
 {
     // LogFlowFunc(("buffer 0x%x, area %p %x [0x%x;0x%x]\n",
@@ -313,6 +300,7 @@
     else
     {
-        void *pvBuffer = HGSMIOffsetToPointer(pArea, offBuffer);
-        HGSMIBUFFERHEADER header = *HGSMIBufferHeaderFromPtr(pvBuffer);
+        void RT_UNTRUSTED_VOLATILE_HSTGST *pvBuffer = HGSMIOffsetToPointer(pArea, offBuffer);
+        HGSMIBUFFERHEADER header;
+        memcpy(&header, (void *)HGSMIBufferHeaderFromPtr(pvBuffer), sizeof(header));
         ASMCompilerBarrier();
 
@@ -325,5 +313,6 @@
         if (header.u32DataSize <= pArea->offLast - offBuffer)
         {
-            HGSMIBUFFERTAIL tail = *HGSMIBufferTailFromPtr(pvBuffer, header.u32DataSize);
+            HGSMIBUFFERTAIL tail;
+            memcpy(&tail, (void *)HGSMIBufferTailFromPtr(pvBuffer, header.u32DataSize), sizeof(tail));
             ASMCompilerBarrier();
 
Index: /trunk/src/VBox/GuestHost/HGSMI/HGSMIMemAlloc.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/HGSMI/HGSMIMemAlloc.cpp	(revision 71590)
+++ /trunk/src/VBox/GuestHost/HGSMI/HGSMIMemAlloc.cpp	(revision 71591)
@@ -575,10 +575,9 @@
 }
 
-HGSMIOFFSET HGSMIMAPointerToOffset(const HGSMIMADATA *pMA, const void *pv)
-{
-    if (HGSMIAreaContainsPointer(&pMA->area, pv))
-    {
-        return HGSMIPointerToOffset(&pMA->area, pv);
-    }
+HGSMIOFFSET HGSMIMAPointerToOffset(const HGSMIMADATA *pMA, const void RT_UNTRUSTED_VOLATILE_GUEST *pv)
+{
+    uintptr_t off = (uintptr_t)pv - (uintptr_t)pMA->area.pu8Base;
+    if (off < pMA->area.cbArea)
+        return pMA->area.offBase + off;
 
     HGSMI_ASSERT_FAILED();
@@ -586,5 +585,5 @@
 }
 
-void *HGSMIMAOffsetToPointer(const HGSMIMADATA *pMA, HGSMIOFFSET off)
+static void RT_UNTRUSTED_VOLATILE_HSTGST *HGSMIMAOffsetToPointer(const HGSMIMADATA *pMA, HGSMIOFFSET off)
 {
     if (HGSMIAreaContainsOffset(&pMA->area, off))
@@ -597,5 +596,5 @@
 }
 
-void *HGSMIMAAlloc(HGSMIMADATA *pMA, HGSMISIZE cb)
+void RT_UNTRUSTED_VOLATILE_HSTGST *HGSMIMAAlloc(HGSMIMADATA *pMA, HGSMISIZE cb)
 {
     HGSMIOFFSET off = hgsmiMAAlloc(pMA, cb);
@@ -603,5 +602,5 @@
 }
 
-void HGSMIMAFree(HGSMIMADATA *pMA, void *pv)
+void HGSMIMAFree(HGSMIMADATA *pMA, void RT_UNTRUSTED_VOLATILE_GUEST *pv)
 {
     HGSMIOFFSET off = HGSMIMAPointerToOffset(pMA, pv);
