ntdll: Report memory areas in DOS memory to be free even when not reserved.

This commit is contained in:
Alexandre Julliard 2010-11-04 17:32:42 +01:00
parent 332361c1bb
commit 3fa03e1c78
1 changed files with 17 additions and 12 deletions

View File

@ -137,6 +137,7 @@ static void *address_space_limit;
static void *user_space_limit; static void *user_space_limit;
static void *working_set_limit; static void *working_set_limit;
#endif /* __i386__ */ #endif /* __i386__ */
static void * const address_space_start = (void *)0x110000;
#define ROUND_ADDR(addr,mask) \ #define ROUND_ADDR(addr,mask) \
((void *)((UINT_PTR)(addr) & ~(UINT_PTR)(mask))) ((void *)((UINT_PTR)(addr) & ~(UINT_PTR)(mask)))
@ -726,7 +727,6 @@ struct alloc_area
*/ */
static int alloc_reserved_area_callback( void *start, size_t size, void *arg ) static int alloc_reserved_area_callback( void *start, size_t size, void *arg )
{ {
static void * const address_space_start = (void *)0x110000;
struct alloc_area *alloc = arg; struct alloc_area *alloc = arg;
void *end = (char *)start + size; void *end = (char *)start + size;
@ -2072,7 +2072,7 @@ static int get_free_mem_state_callback( void *start, size_t size, void *arg )
return 0; return 0;
} }
if (info->BaseAddress >= start) if (info->BaseAddress >= start || start <= address_space_start)
{ {
/* it's a real free area */ /* it's a real free area */
info->State = MEM_FREE; info->State = MEM_FREE;
@ -2203,17 +2203,22 @@ NTSTATUS WINAPI NtQueryVirtualMemory( HANDLE process, LPCVOID addr,
{ {
/* not in a reserved area at all, pretend it's allocated */ /* not in a reserved area at all, pretend it's allocated */
#ifdef __i386__ #ifdef __i386__
if (base >= (char *)address_space_start)
{
info->State = MEM_RESERVE; info->State = MEM_RESERVE;
info->Protect = PAGE_NOACCESS; info->Protect = PAGE_NOACCESS;
info->AllocationProtect = PAGE_NOACCESS; info->AllocationProtect = PAGE_NOACCESS;
info->Type = MEM_PRIVATE; info->Type = MEM_PRIVATE;
#else }
else
#endif
{
info->State = MEM_FREE; info->State = MEM_FREE;
info->Protect = PAGE_NOACCESS; info->Protect = PAGE_NOACCESS;
info->AllocationBase = 0; info->AllocationBase = 0;
info->AllocationProtect = 0; info->AllocationProtect = 0;
info->Type = 0; info->Type = 0;
#endif }
} }
} }
else else