Index: trunk/src/VBox/Devices/VMMDev/VMMDev.cpp
===================================================================
--- trunk/src/VBox/Devices/VMMDev/VMMDev.cpp	(revision 44779)
+++ trunk/src/VBox/Devices/VMMDev/VMMDev.cpp	(revision 44780)
@@ -267,5 +267,5 @@
         return;
 
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
     vmmdevNotifyGuestWorker(pThis, fAddEvents);
     PDMCritSectLeave(&pThis->CritSect);
@@ -288,5 +288,5 @@
 void VMMDevCtlSetGuestFilterMask(PVMMDEV pThis, uint32_t fOrMask, uint32_t fNotMask)
 {
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     const bool fHadEvents = (pThis->u32HostEventFlags & pThis->u32GuestFilterMask) != 0;
@@ -2800,5 +2800,5 @@
 {
     PVMMDEV pThis = RT_FROM_MEMBER(pInterface, VMMDEV, IPort);
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     if (   pThis->mouseXAbs != xAbs
@@ -2834,5 +2834,5 @@
 {
     PVMMDEV pThis = RT_FROM_MEMBER(pInterface, VMMDEV, IPort);
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     uint32_t fOldCaps = pThis->mouseCapabilities;
@@ -2863,5 +2863,5 @@
         return VERR_INVALID_PARAMETER;
 
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     DISPLAYCHANGEREQUEST *pRequest = &pThis->displayChangeData.aRequests[idxDisplay];
@@ -2920,5 +2920,5 @@
 {
     PVMMDEV pThis = RT_FROM_MEMBER(pInterface, VMMDEV, IPort);
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     /* Verify that the new resolution is different and that guest does not yet know about it. */
@@ -2946,5 +2946,5 @@
 {
     PVMMDEV pThis = RT_FROM_MEMBER(pInterface, VMMDEV, IPort);
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     /* Verify that the new resolution is different and that guest does not yet know about it. */
@@ -2969,5 +2969,5 @@
 {
     PVMMDEV pThis = RT_FROM_MEMBER(pInterface, VMMDEV, IPort);
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     bool fSame = (pThis->fVRDPEnabled == fVRDPEnabled);
@@ -2993,5 +2993,5 @@
 {
     PVMMDEV pThis = RT_FROM_MEMBER(pInterface, VMMDEV, IPort);
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     /* Verify that the new resolution is different and that guest does not yet know about it. */
@@ -3022,5 +3022,5 @@
     AssertReturn(fFlags & (VMMDEV_SETCREDENTIALS_GUESTLOGON | VMMDEV_SETCREDENTIALS_JUDGE), VERR_INVALID_PARAMETER);
 
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     /*
@@ -3077,5 +3077,5 @@
     Log(("vmmdevIPort_CpuHotUnplug: idCpuCore=%u idCpuPackage=%u\n", idCpuCore, idCpuPackage));
 
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     if (pThis->fCpuHotPlugEventsEnabled)
@@ -3103,5 +3103,5 @@
     Log(("vmmdevCpuPlug: idCpuCore=%u idCpuPackage=%u\n", idCpuCore, idCpuPackage));
 
-    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
 
     if (pThis->fCpuHotPlugEventsEnabled)
@@ -3693,9 +3693,11 @@
 
     /*
-     * Create the critical section for the device.
+     * We do our own locking entirely. So, install NOP critsect for the device
+     * and create our own critsect for use where it really matters (++).
      */
+    rc = PDMDevHlpSetDeviceCritSect(pDevIns, PDMDevHlpCritSectGetNop(pDevIns));
+    AssertRCReturn(rc, rc);
     rc = PDMDevHlpCritSectInit(pDevIns, &pThis->CritSect, RT_SRC_POS, "VMMDev#%u", iInstance);
     AssertRCReturn(rc, rc);
-    /* Later: pDevIns->pCritSectR3 = &pThis->CritSect; */
 
     /*
