Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideoHGSMI.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideoHGSMI.cpp	(revision 33950)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideoHGSMI.cpp	(revision 33951)
@@ -659,52 +659,9 @@
 typedef struct _VBVADISP_CHANNELCONTEXT
 {
-    struct _VBVAHOSTCMD * pFirstCmd;
-    struct _VBVAHOSTCMD * pLastCmd;
-    VBOXVCMNSPIN_LOCK pSynchLock;
-#ifdef DEBUG
-    int cCmds;
-#endif
+    /** The generic command handler builds up a list of commands - in reverse
+     * order! - here */
+    VBVAHOSTCMD *pCmd;
     bool bValid;
 }VBVADISP_CHANNELCONTEXT;
-
-#ifdef DEBUG
-void dbgCheckListLocked(const VBVADISP_CHANNELCONTEXT *pList, struct _VBVAHOSTCMD * pCmd)
-{
-    int counter = 0;
-    for(struct _VBVAHOSTCMD * pCur = pList->pFirstCmd; pCur; pCur=pCur->u.pNext)
-    {
-        Assert(pCur != pCmd);
-        if(pCur == pList->pLastCmd)
-        {
-            Assert(pCur->u.pNext == NULL);
-        }
-        if(pCur->u.pNext == NULL)
-        {
-            Assert(pCur == pList->pLastCmd);
-        }
-        counter++;
-    }
-
-    Assert(counter == pList->cCmds);
-}
-
-void dbgCheckList(PVBOXVIDEO_COMMON pCommon, VBVADISP_CHANNELCONTEXT *pList, struct _VBVAHOSTCMD * pCmd)
-{
-    VBOXVCMNIRQL oldIrql;
-    VBoxVideoCmnSpinLockAcquire(commonToPrimaryExt(pCommon), &pList->pSynchLock, &oldIrql);
-
-    dbgCheckListLocked(pList, pCmd);
-
-    VBoxVideoCmnSpinLockRelease(commonToPrimaryExt(pCommon), &pList->pSynchLock, oldIrql);
-}
-
-#define DBG_CHECKLIST_LOCKED(_pl, pc) dbgCheckListLocked(_pl, pc)
-#define DBG_CHECKLIST(_pv, _pl, pc) dbgCheckList(_pv, _pl, pc)
-
-#else
-#define DBG_CHECKLIST_LOCKED(_pl, pc) do{}while(0)
-#define DBG_CHECKLIST(_pv, _pl, pc) do{}while(0)
-#endif
-
 
 typedef struct _VBVA_CHANNELCONTEXTS
@@ -759,4 +716,18 @@
 }
 
+/** Reverses a NULL-terminated linked list of VBVAHOSTCMD structures. */
+static VBVAHOSTCMD *vboxVBVAReverseList(VBVAHOSTCMD *pList)
+{
+    VBVAHOSTCMD *pFirst = NULL;
+    while (pList)
+    {
+        VBVAHOSTCMD *pNext = pList;
+        pList = pList->u.pNext;
+        pNext->u.pNext = pFirst;
+        pFirst = pNext;
+    }
+    return pFirst;
+}
+
 DECLCALLBACK(int) hgsmiHostCmdRequest (HVBOXVIDEOHGSMI hHGSMI, uint8_t u8Channel, uint32_t iDevice, struct _VBVAHOSTCMD ** ppCmd)
 {
@@ -779,18 +750,9 @@
         if(pDispContext)
         {
-            UCHAR oldIrql;
-            VBoxVideoCmnSpinLockAcquire(commonToPrimaryExt(pCommon), &pDispContext->pSynchLock, &oldIrql);
-
-            DBG_CHECKLIST_LOCKED(pDispContext, NULL);
-
-            *ppCmd = pDispContext->pFirstCmd;
-            pDispContext->pFirstCmd = NULL;
-            pDispContext->pLastCmd = NULL;
-#ifdef DEBUG
-            pDispContext->cCmds = 0;
-#endif
-            VBoxVideoCmnSpinLockRelease(commonToPrimaryExt(pCommon), &pDispContext->pSynchLock, oldIrql);
-
-            DBG_CHECKLIST(pCommon, pDispContext, NULL);
+            VBVAHOSTCMD *pCmd;
+            do
+                pCmd = pDispContext->pCmd;
+            while (!ASMAtomicCmpXchgPtr(&pDispContext->pCmd, NULL, pCmd));
+            *ppCmd = vboxVBVAReverseList(pCmd);
 
             return VINF_SUCCESS;
@@ -860,5 +822,4 @@
                         default:
                         {
-                            DBG_CHECKLIST(pCallbacks->pCommon, pHandler, pCur);
                             Assert(u16ChannelInfo==VBVAHG_EVENT);
                             Assert(!pCur->u.Data);
@@ -886,6 +847,4 @@
                 }
 
-                DBG_CHECKLIST(pCallbacks->pCommon, pHandler, pFirst);
-
                 /* we do not support lists currently */
                 Assert(pFirst == pLast);
@@ -898,30 +857,11 @@
                 {
                     Assert(pLast);
-                    UCHAR oldIrql;
-                    VBoxVideoCmnSpinLockAcquire(commonToPrimaryExt(pCallbacks->pCommon),
-                                                &pHandler->pSynchLock,
-                                                &oldIrql);
-
-                    DBG_CHECKLIST_LOCKED(pHandler, pFirst);
-
-                    if(pHandler->pLastCmd)
+                    VBVAHOSTCMD *pCmd;
+                    do
                     {
-                        pHandler->pLastCmd->u.pNext = pFirst;
-                        Assert(pHandler->pFirstCmd);
+                        pCmd = pHandler->pCmd;
+                        pFirst->u.pNext = pCmd;
                     }
-                    else
-                    {
-                        Assert(!pHandler->pFirstCmd);
-                        pHandler->pFirstCmd = pFirst;
-                    }
-                    pHandler->pLastCmd = pLast;
-#ifdef DEBUG
-                    pHandler->cCmds++;
-#endif
-                    DBG_CHECKLIST_LOCKED(pHandler, NULL);
-
-                    VBoxVideoCmnSpinLockRelease(commonToPrimaryExt(pCallbacks->pCommon),
-                                                &pHandler->pSynchLock,
-                                                oldIrql);
+                    while (!ASMAtomicCmpXchgPtr(&pHandler->pCmd, pFirst, pCmd));
                 }
                 else
@@ -977,16 +917,9 @@
         Assert(!pDispContext->bValid);
 #endif
-        Assert(!pDispContext->pFirstCmd);
-        Assert(!pDispContext->pLastCmd);
+        Assert(!pDispContext->pCmd);
         if(!pDispContext->bValid)
         {
             pDispContext->bValid = true;
-            pDispContext->pFirstCmd = NULL;
-            pDispContext->pLastCmd= NULL;
-#ifdef DEBUG
-            pDispContext->cCmds = 0;
-#endif
-
-            VBoxVideoCmnSpinLockCreate(commonToPrimaryExt(pCommon), &pDispContext->pSynchLock);
+            pDispContext->pCmd = NULL;
 
             int rc = VINF_SUCCESS;
