ntdll: Use the end of the reserved area as address space limit, in case we have more than 3Gb available.

This commit is contained in:
Alexandre Julliard 2008-10-28 13:51:36 +01:00
parent 6c7720e2ce
commit 56788cc5b6
1 changed files with 18 additions and 10 deletions

View File

@ -122,14 +122,14 @@ static RTL_CRITICAL_SECTION csVirtual = { &critsect_debug, -1, 0, 0, 0, 0 };
# define page_shift 12
# define page_size 0x1000
/* Note: these are Windows limits, you cannot change them. */
# define ADDRESS_SPACE_LIMIT ((void *)0xc0000000) /* top of the total available address space */
# define USER_SPACE_LIMIT ((void *)0x7fff0000) /* top of the user address space */
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 */
#else
static UINT page_shift;
static UINT page_size;
static UINT_PTR page_mask;
# define ADDRESS_SPACE_LIMIT 0 /* no limit needed on other platforms */
# define USER_SPACE_LIMIT 0 /* no limit needed on other platforms */
static void * const address_space_limit = 0; /* no limit needed on other platforms */
static void * const user_space_limit = 0; /* no limit needed on other platforms */
#endif /* __i386__ */
#define ROUND_ADDR(addr,mask) \
@ -141,7 +141,6 @@ static UINT_PTR page_mask;
#define VIRTUAL_DEBUG_DUMP_VIEW(view) \
do { if (TRACE_ON(virtual)) VIRTUAL_DumpView(view); } while (0)
static void *user_space_limit = USER_SPACE_LIMIT;
static void *preload_reserve_start;
static void *preload_reserve_end;
static int use_locks;
@ -685,7 +684,7 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
if (base)
{
if (is_beyond_limit( base, size, ADDRESS_SPACE_LIMIT ))
if (is_beyond_limit( base, size, address_space_limit ))
return STATUS_WORKING_SET_LIMIT_RANGE;
switch (wine_mmap_is_in_reserved_area( base, size ))
@ -1168,6 +1167,13 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz
}
static int get_address_space_limit( void *base, size_t size, void *arg )
{
void **limit = arg;
if ((char *)base + size > (char *)*limit) *limit = (char *)base + size;
return 1;
}
/***********************************************************************
* virtual_init
*/
@ -1191,6 +1197,8 @@ void virtual_init(void)
preload_reserve_end = (void *)end;
}
}
if (address_space_limit)
wine_mmap_enum_reserved_areas( get_address_space_limit, &address_space_limit, 1 );
}
@ -1387,7 +1395,7 @@ void VIRTUAL_UseLargeAddressSpace(void)
{
/* no large address space on win9x */
if (NtCurrentTeb()->Peb->OSPlatformId != VER_PLATFORM_WIN32_NT) return;
user_space_limit = ADDRESS_SPACE_LIMIT;
user_space_limit = address_space_limit;
}
@ -1449,7 +1457,7 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_
/* disallow low 64k, wrap-around and kernel space */
if (((char *)base < (char *)0x10000) ||
((char *)base + size < (char *)base) ||
is_beyond_limit( base, size, ADDRESS_SPACE_LIMIT ))
is_beyond_limit( base, size, address_space_limit ))
return STATUS_INVALID_PARAMETER;
}
else
@ -1730,7 +1738,7 @@ NTSTATUS WINAPI NtQueryVirtualMemory( HANDLE process, LPCVOID addr,
return STATUS_INVALID_INFO_CLASS;
}
}
if (ADDRESS_SPACE_LIMIT && addr >= ADDRESS_SPACE_LIMIT)
if (address_space_limit && addr >= address_space_limit)
return STATUS_WORKING_SET_LIMIT_RANGE;
if (process != NtCurrentProcess())
@ -1781,7 +1789,7 @@ NTSTATUS WINAPI NtQueryVirtualMemory( HANDLE process, LPCVOID addr,
}
size = (char *)user_space_limit - alloc_base;
}
else size = (char *)ADDRESS_SPACE_LIMIT - alloc_base;
else size = (char *)address_space_limit - alloc_base;
view = NULL;
break;
}