Index: /trunk/src/VBox/VMM/VMMR0/GMMR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/GMMR0.cpp	(revision 29545)
+++ /trunk/src/VBox/VMM/VMMR0/GMMR0.cpp	(revision 29546)
@@ -1823,5 +1823,5 @@
     {
         case GMMACCOUNT_BASE:
-            if (RT_UNLIKELY(pGVM->gmm.s.Allocated.cBasePages + pGVM->gmm.s.cBalloonedPages + cPages > pGVM->gmm.s.Reserved.cBasePages))
+            if (RT_UNLIKELY(pGVM->gmm.s.Allocated.cBasePages + pGVM->gmm.s.cBalloonedPages + pGVM->gmm.s.cSharedPages + cPages > pGVM->gmm.s.Reserved.cBasePages))
             {
                 Log(("gmmR0AllocatePages:Base: Reserved=%#llx Allocated+Ballooned+Requested=%#llx+%#llx+%#x!\n",
@@ -2711,5 +2711,5 @@
     {
         case GMMACCOUNT_BASE:
-            if (RT_UNLIKELY(pGVM->gmm.s.Allocated.cBasePages < cPages))
+            if (RT_UNLIKELY(pGVM->gmm.s.Allocated.cBasePages + pGVM->gmm.s.cSharedPages < cPages))
             {
                 Log(("gmmR0FreePages: allocated=%#llx cPages=%#x!\n", pGVM->gmm.s.Allocated.cBasePages, cPages));
@@ -2743,4 +2743,5 @@
     int rc = VINF_SUCCESS;
     uint32_t iPage;
+    uint32_t cSharedPages = 0;
     for (iPage = 0; iPage < cPages; iPage++)
     {
@@ -2769,4 +2770,5 @@
                 Assert(pGVM->gmm.s.cSharedPages);
                 pGVM->gmm.s.cSharedPages--;
+                cSharedPages++;
                 Assert(pPage->Shared.cRefs);
                 if (!--pPage->Shared.cRefs)
@@ -2789,4 +2791,6 @@
     }
 
+    Assert(iPage > cSharedPages);
+
     /*
      * Update the account.
@@ -2794,5 +2798,5 @@
     switch (enmAccount)
     {
-        case GMMACCOUNT_BASE:   pGVM->gmm.s.Allocated.cBasePages   -= iPage; break;
+        case GMMACCOUNT_BASE:   pGVM->gmm.s.Allocated.cBasePages   -= (iPage - cSharedPages); break;
         case GMMACCOUNT_SHADOW: pGVM->gmm.s.Allocated.cShadowPages -= iPage; break;
         case GMMACCOUNT_FIXED:  pGVM->gmm.s.Allocated.cFixedPages  -= iPage; break;
