The only problem in the head code appears to be in the linker, which it turns out has a problem when it's told there's 3GB of user address space. Since Windows only offers a 3GB user address space in what passes for Microsoft's high end server editions of the operating system, it is unlikely that this is necessary. My solution is to drop the user address space to 2GB - if 3GB is desired, it probably should be a configurable option rather than hard coded as is the case now. I dealt with a related FIXME along the way. diff -u -r1.4 virtual.c --- dlls/ntdll/virtual.c 7 Jan 2003 20:36:28 -0000 1.4 +++ dlls/ntdll/virtual.c 28 Apr 2003 00:05:58 -0000 @@ -102,7 +102,8 @@ # define page_mask 0xfff # define page_shift 12 # define page_size 0x1000 -# define ADDRESS_SPACE_LIMIT ((void *)0xc0000000) /* top of the user address space */ +/*# define ADDRESS_SPACE_LIMIT ((void *)0xc0000000) /* top of the user address space */ +#define ADDRESS_SPACE_LIMIT ((void *) 0x80000000) #else static UINT page_shift; static UINT page_mask; @@ -1180,13 +1181,24 @@ MEMORY_BASIC_INFORMATION *info = buffer; if (info_class != MemoryBasicInformation) return STATUS_INVALID_INFO_CLASS; - if (ADDRESS_SPACE_LIMIT && addr >= ADDRESS_SPACE_LIMIT) - return STATUS_WORKING_SET_LIMIT_RANGE; /* FIXME */ - if (!is_current_process( process )) { ERR("Unsupported on other process\n"); return STATUS_ACCESS_DENIED; + } + + if (ADDRESS_SPACE_LIMIT && addr >= ADDRESS_SPACE_LIMIT) + { + info->BaseAddress = ADDRESS_SPACE_LIMIT; + info->AllocationBase = ADDRESS_SPACE_LIMIT; + info->AllocationProtect = PAGE_NOACCESS; + info->RegionSize = 0; + info->RegionSize -= (unsigned long) ADDRESS_SPACE_LIMIT; + info->State = MEM_COMMIT; + info->Protect = PAGE_NOACCESS; + info->Type = MEM_PRIVATE; + *res_len = sizeof(*info); + return STATUS_SUCCESS; } base = ROUND_ADDR( addr, page_mask );