Index: /trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/PGMAllBth.h	(revision 27488)
+++ /trunk/src/VBox/VMM/VMMAll/PGMAllBth.h	(revision 27489)
@@ -805,6 +805,7 @@
                     if (PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED)
                     {
-                        Log(("PGM #PF: Make writable: %RGp %R[pgmpage] pvFault=%RGp uErr=%#x\n",
-                             GCPhys, pPage, pvFault, uErr));
+                        Log(("PGM #PF: Make writable: %RGp %R[pgmpage] pvFault=%RGp uErr=%#x\n", GCPhys, pPage, pvFault, uErr));
+                        Assert(!PGM_PAGE_IS_ZERO(pPage));
+
                         rc = pgmPhysPageMakeWritable(pVM, pPage, GCPhys);
                         if (rc != VINF_SUCCESS)
@@ -1402,11 +1403,15 @@
         {
 #ifndef VBOX_WITH_NEW_LAZY_PAGE_ALLOC
-            /* Try make the page writable if necessary. */
-            if (    PteSrc.n.u1Write
-                &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
+            /* Try to make the page writable if necessary. */
+            if (    PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM
+                &&  (   PGM_PAGE_IS_ZERO(pPage)
+                     || (   PteSrc.n.u1Write
+                         && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
 # ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
-                &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
-# endif
-                &&  PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
+                         && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
+# endif
+                         && PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
+                     )
+               )
             {
                 rc = pgmPhysPageMakeWritable(pVM, pPage, PteSrc.u & GST_PTE_PG_MASK);
@@ -1789,11 +1794,15 @@
                 {
 # ifndef VBOX_WITH_NEW_LAZY_PAGE_ALLOC
-                    /* Try make the page writable if necessary. */
-                    if (    PdeSrc.n.u1Write
-                        &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
+                    /* Try to make the page writable if necessary. */
+                    if (    PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM
+                        &&  (   PGM_PAGE_IS_ZERO(pPage)
+                             || (   PdeSrc.n.u1Write
+                                 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
 #  ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
-                        &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
-#  endif
-                        &&  PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
+                                 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
+#  endif
+                                 && PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
+                             )
+                       )
                     {
                         rc = pgmPhysPageMakeWritable(pVM, pPage, GCPhys);
@@ -2806,11 +2815,15 @@
 
 # ifndef VBOX_WITH_NEW_LAZY_PAGE_ALLOC
-                        /* Try make the page writable if necessary. */
-                        if (    PteDstBase.n.u1Write
-                            &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
-# ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
-                            &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
-# endif
-                            &&  PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
+                        /* Try to make the page writable if necessary. */
+                        if (    PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM
+                            &&  (   PGM_PAGE_IS_ZERO(pPage)
+                                 || (   PteDstBase.n.u1Write
+                                     && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
+#  ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
+                                     && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
+#  endif
+                                     && PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
+                                 )
+                           )
                         {
                             rc = pgmPhysPageMakeWritable(pVM, pPage, GCPhys);
