http://bugs.winehq.org/show_bug.cgi?id=20331
Summary: VirtualAlloc() should allocate addresses low to high Product: Wine Version: 1.1.31 Platform: PC URL: http://rh-software.com/ OS/Version: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: ntdll AssignedTo: wine-bugs@winehq.org ReportedBy: ray@pobox.co.uk
Currently when VirtualAlloc() is called with a NULL address high addresses are sometimes returned rather than low addresses. Looking at http://msdn.microsoft.com/en-us/library/aa366887(VS.85).aspx you will see there is the MEM_TOP_DOWN option to specify that high addresses should be used, thus when this is not specified low addresses should be used. This is the situation on Windows NT4 through to Server 2008 R2/Windows 7.
To show this effect download http://rh-software.com/downloads/siv.zip, extract the files and issue the command: wine siv -save=[memory]=stdout which on my system gives: [memory] [windows]
Area Start Address Limit Address Size Size Proportion Elapsed MB/sec
0 0x02B80000 0x67F80000 0x65400000 1.58GB 54.95% 0.010 1 0x7F000000 0x7FC00000 0x00C00000 12.00MB 0.41% 0.005 2 0x7FFF0000 0x81FF0000 0x02000000 32.00MB 1.09% 0.005 3 0xB75C0000 0xB79C0000 0x00400000 4.00MB 0.14% 0.005 4 0xB6CA0000 0xB70A0000 0x00400000 4.00MB 0.14% 0.005 5 0xB6890000 0xB6C90000 0x00400000 4.00MB 0.14% 0.005 ...
I think this may only show the issue for systems with >= 3.5GB of ram. I am wondering if it might be related to addresses > 0x80000000 (signed vs. unsigned tests). Note that SIV is linked with /largeaddressaware.