diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index f61fa5cb643a0d67518636446e0b049457553ace..64d4ff065d29a73b10f9ea7e98f443db4a952863 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -266,6 +266,8 @@ static void add_reserved_area( void *addr, size_t size )
         size -= (char *)USER_SPACE_LIMIT - (char *)addr;
         addr = USER_SPACE_LIMIT;
     }
+    /* blow away existing mappings */
+    wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE | MAP_FIXED );
     wine_mmap_add_reserved_area( addr, size );
 }
 
diff --git a/libs/wine/mmap.c b/libs/wine/mmap.c
index b3edee0e793b87398b0bf3123636e63ca99e74f3..e52d0e36d558bda7fbdcc17652c6905e4eb4edc7 100644
--- a/libs/wine/mmap.c
+++ b/libs/wine/mmap.c
@@ -201,32 +201,13 @@ static void reserve_area( void *addr, void *end )
 {
     void *ptr;
     size_t size = (char *)end - (char *)addr;
-    struct list *prev;
-    struct reserved_area *area;
 
     if ((ptr = wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE )) != (void *)-1)
     {
         if (ptr == addr)
         {
-            if (!end) size--;  /* avoid wrap-around */
-            /* try to merge it with the previous one */
-            if ((prev = list_tail( &reserved_areas )))
-            {
-                area = LIST_ENTRY( prev, struct reserved_area, entry );
-                if (area && (char *)area->base + area->size == (char *)ptr)
-                {
-                    area->size += size;
-                    return;
-                }
-            }
-            /* create a new area */
-            if ((area = malloc( sizeof(*area) )))
-            {
-                area->base = addr;
-                area->size = size;
-                list_add_tail( &reserved_areas, &area->entry );
-                return;
-            }
+            wine_mmap_add_reserved_area( addr, size );
+            return;
         }
         else munmap( ptr, size );
     }
@@ -287,11 +268,6 @@ void wine_mmap_add_reserved_area( void *addr, size_t size )
 
     if (!((char *)addr + size)) size--;  /* avoid wrap-around */
 
-#ifdef HAVE_MMAP
-    /* blow away existing mappings */
-    wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE | MAP_FIXED );
-#endif
-
     LIST_FOR_EACH( ptr, &reserved_areas )
     {
         area = LIST_ENTRY( ptr, struct reserved_area, entry );