Index: /trunk/include/VBox/VBoxVideo.h
===================================================================
--- /trunk/include/VBox/VBoxVideo.h	(revision 20008)
+++ /trunk/include/VBox/VBoxVideo.h	(revision 20009)
@@ -267,4 +267,6 @@
     int32_t iDisplay; /* display index */
     int32_t Reserved; /* reserved, must be null*/
+    uint64_t GuestVBVAReserved1; /* field internally used by the guest VBVA cmd handling, must NOT be modified by clients */
+    uint64_t GuestVBVAReserved2; /* field internally used by the guest VBVA cmd handling, must NOT be modified by clients */
     char body[1];
 } VBOXVHWACMD;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h	(revision 20008)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h	(revision 20009)
@@ -253,10 +253,16 @@
 
 #ifdef VBOX_WITH_HGSMI
-DECLCALLBACK(int) vboxVHWACommandHanlder(void *pvHandler, uint16_t u16ChannelInfo, void *pvBuffer, HGSMISIZE cbBuffer);
+DECLCALLBACK(int) vboxVBVAHostCommandHanlder(void *pvHandler, uint16_t u16ChannelInfo, void *pvBuffer, HGSMISIZE cbBuffer);
+void vboxVBVAHostCommandComplete(PPDEV ppdev, void *pvBuffer);
 
  #ifdef VBOX_WITH_VIDEOHWACCEL
-VBOXVHWACMD* vboxVHWACreateCommand (PPDEV ppdev, VBOXVHWACMD_LENGTH cbCmd);
-void vboxVHWAFreeCommand (PPDEV ppdev, VBOXVHWACMD* pCmd);
-void vboxVHWASubmitCommand (PPDEV ppdev, VBOXVHWACMD* pCmd);
+
+typedef DECLCALLBACK(void) FNVBOXVHWACMDCOMPLETION(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext);
+typedef FNVBOXVHWACMDCOMPLETION *PFNVBOXVHWACMDCOMPLETION;
+
+VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_LENGTH cbCmd);
+void vboxVHWACommandFree (PPDEV ppdev, VBOXVHWACMD* pCmd);
+BOOL vboxVHWACommandSubmit (PPDEV ppdev, VBOXVHWACMD* pCmd);
+void vboxVHWACommandSubmitAssynch (PPDEV ppdev, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext);
  #endif
 #endif
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/screen.c
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/screen.c	(revision 20008)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/screen.c	(revision 20009)
@@ -124,5 +124,5 @@
             ppdev->hMpHGSMI = Callbacks.hContext;
             ppdev->pfnHGSMICommandComplete = Callbacks.pfnCompletionHandler;
-            HandlerReg.pfnHandler = vboxVHWACommandHanlder;
+            HandlerReg.pfnHandler = vboxVBVAHostCommandHanlder;
             HandlerReg.pvHandler = ppdev;
             HandlerReg.u8Channel = HGSMI_CH_VBVA;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/vbox.c
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/vbox.c	(revision 20008)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/vbox.c	(revision 20009)
@@ -692,5 +692,5 @@
 # ifdef VBOX_WITH_VIDEOHWACCEL
 
-VBOXVHWACMD* vboxVHWACreateCommand (PPDEV ppdev, VBOXVHWACMD_LENGTH cbCmd)
+VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_LENGTH cbCmd)
 {
     VBOXVHWACMD* pHdr = (VBOXVHWACMD*)HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap,
@@ -700,5 +700,5 @@
     if (!pHdr)
     {
-        DISPDBG((0, "VBoxDISP::vboxVHWACreateCommand: HGSMIHeapAlloc failed\n"));
+        DISPDBG((0, "VBoxDISP::vboxVHWACommandCreate: HGSMIHeapAlloc failed\n"));
     }
 
@@ -706,35 +706,71 @@
 }
 
-void vboxVHWAFreeCommand (PPDEV ppdev, VBOXVHWACMD* pCmd)
+void vboxVHWACommandFree (PPDEV ppdev, VBOXVHWACMD* pCmd)
 {
     HGSMIHeapFree (&ppdev->hgsmiDisplayHeap, pCmd);
 }
 
-void vboxVHWASubmitCommand (PPDEV ppdev, VBOXVHWACMD* pCmd)
-{
+static void vboxVHWACommandCompletionCallbackEvent(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext)
+{
+    PEVENT pEvent = (PEVENT)pContext;
+    LONG oldState = EngSetEvent(pEvent);
+    Assert(!oldState);
+}
+
+BOOL vboxVHWACommandSubmit (PPDEV ppdev, VBOXVHWACMD* pCmd)
+{
+    PEVENT pEvent;
+    BOOL brc = EngCreateEvent(&pEvent);
+    Assert(brc);
+    if(brc)
+    {
+        vboxVHWACommandSubmitAssynch (ppdev, pCmd, vboxVHWACommandCompletionCallbackEvent, pEvent);
+
+        brc = EngWaitForSingleObject(pEvent,
+                NULL /*IN PLARGE_INTEGER  pTimeOut*/
+                );
+        Assert(brc);
+        if(brc)
+        {
+            EngDeleteEvent(pEvent);
+        }
+    }
+    return brc;
+}
+
+/* do not wait for completion */
+void vboxVHWACommandSubmitAssynch (PPDEV ppdev, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext)
+{
+    pCmd->GuestVBVAReserved1 = (uintptr_t)pfnCompletion;
+    pCmd->GuestVBVAReserved2 = (uintptr_t)pContext;
+
     vboxHGSMIBufferSubmit (ppdev, pCmd);
-    if(pCmd->rc == VINF_VHWA_CMD_PENDING)
-    {
-
-    }
-}
-
-/* do not wait for completion */
-void vboxVHWASubmitCommandAssynch (PPDEV ppdev, VBOXVHWACMD* pCmd)
-{
-    vboxHGSMIBufferSubmit (ppdev, pCmd);
+
+    if(pCmd->rc != VINF_VHWA_CMD_PENDING)
+    {
+        /* the command is completed */
+        pfnCompletion(ppdev, pCmd, pContext);
+    }
+
 }
 
 static int vboxVHWAHanldeVHWACmdCompletion(PPDEV ppdev, void *pvBuffer, HGSMISIZE cbBuffer)
 {
-    Assert(0);
-
+    VBOXVHWACMD* pCmd = (VBOXVHWACMD*)pvBuffer;
+    PFNVBOXVHWACMDCOMPLETION pfnCompletion = (PFNVBOXVHWACMDCOMPLETION)pCmd->GuestVBVAReserved1;
+    void * pContext = (void *)pCmd->GuestVBVAReserved2;
+
+    pfnCompletion(ppdev, pCmd, pContext);
+    return 0;
+}
+
+# endif
+
+void vboxVBVAHostCommandComplete(PPDEV ppdev, void *pvBuffer)
+{
     ppdev->pfnHGSMICommandComplete(ppdev->hMpHGSMI, pvBuffer);
-    return 0;
-}
-
-# endif
-
-DECLCALLBACK(int) vboxVHWACommandHanlder(void *pvHandler, uint16_t u16ChannelInfo, void *pvBuffer, HGSMISIZE cbBuffer)
+}
+
+DECLCALLBACK(int) vboxVBVAHostCommandHanlder(void *pvHandler, uint16_t u16ChannelInfo, void *pvBuffer, HGSMISIZE cbBuffer)
 {
     int rc = VINF_SUCCESS;
@@ -752,7 +788,6 @@
         default:
         {
-            ppdev->pfnHGSMICommandComplete(ppdev->hMpHGSMI, pvBuffer);
-        }
-
+            vboxVBVAHostCommandComplete(ppdev, pvBuffer);
+        }
     }
     return rc;
