Alexandre Julliard : ntdll: Don't worry about the DOS area on non-x86.

Alexandre Julliard julliard at winehq.org
Fri Dec 17 11:30:39 CST 2010


Module: wine
Branch: master
Commit: e39c6d0474eebea464b37dfdc557b703282129a2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e39c6d0474eebea464b37dfdc557b703282129a2

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Dec 16 10:25:14 2010 +0100

ntdll: Don't worry about the DOS area on non-x86.

---

 dlls/ntdll/virtual.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 6f8b9a3..3ce0884 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -122,6 +122,7 @@ static RTL_CRITICAL_SECTION csVirtual = { &critsect_debug, -1, 0, 0, 0, 0 };
 static void *address_space_limit = (void *)0xc0000000;  /* top of the total available address space */
 static void *user_space_limit    = (void *)0x7fff0000;  /* top of the user address space */
 static void *working_set_limit   = (void *)0x7fff0000;  /* top of the current working set */
+static void *address_space_start = (void *)0x110000;    /* keep DOS area clear */
 #elif defined(__x86_64__)
 # define page_mask  0xfff
 # define page_shift 12
@@ -129,6 +130,7 @@ static void *working_set_limit   = (void *)0x7fff0000;  /* top of the current wo
 static void *address_space_limit = (void *)0x7fffffff0000;
 static void *user_space_limit    = (void *)0x7fffffff0000;
 static void *working_set_limit   = (void *)0x7fffffff0000;
+static void *address_space_start = (void *)0x10000;
 #else
 static UINT page_shift;
 static UINT_PTR page_size;
@@ -136,8 +138,8 @@ static UINT_PTR page_mask;
 static void *address_space_limit;
 static void *user_space_limit;
 static void *working_set_limit;
+static void *address_space_start = (void *)0x10000;
 #endif  /* __i386__ */
-static void * const address_space_start = (void *)0x110000;
 
 #define ROUND_ADDR(addr,mask) \
    ((void *)((UINT_PTR)(addr) & ~(UINT_PTR)(mask)))
@@ -1071,7 +1073,7 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz
 
     server_enter_uninterrupted_section( &csVirtual, &sigset );
 
-    if (base >= (char *)0x110000)  /* make sure the DOS area remains free */
+    if (base >= (char *)address_space_start)  /* make sure the DOS area remains free */
         status = map_view( &view, base, total_size, mask, FALSE,
                            VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY | VPROT_IMAGE );
 
@@ -1367,6 +1369,7 @@ void virtual_init(void)
 {
     const char *preload;
     void *heap_base;
+    size_t size;
     struct file_view *heap_view;
 
 #ifndef page_mask
@@ -1397,9 +1400,10 @@ void virtual_init(void)
                                   VIRTUAL_HEAP_SIZE, NULL, NULL );
     create_view( &heap_view, heap_base, VIRTUAL_HEAP_SIZE, VPROT_COMMITTED | VPROT_READ | VPROT_WRITE );
 
-    /* make the DOS area accessible to hide bugs in broken apps like Excel 2003 */
-    if (wine_mmap_is_in_reserved_area( (void *)0x10000, 0x100000 ) == 1)
-        wine_anon_mmap( (void *)0x10000, 0x100000, PROT_READ | PROT_WRITE, MAP_FIXED );
+    /* make the DOS area accessible (except the low 64K) to hide bugs in broken apps like Excel 2003 */
+    size = (char *)address_space_start - (char *)0x10000;
+    if (size && wine_mmap_is_in_reserved_area( (void*)0x10000, size ) == 1)
+        wine_anon_mmap( (void *)0x10000, size, PROT_READ | PROT_WRITE, MAP_FIXED );
 }
 
 




More information about the wine-cvs mailing list