[Bug 36013] New: bleem! (PlayStation emulator) fails on startup, complaining with 'Not enough memory to load program!'

wine-bugs at winehq.org wine-bugs at winehq.org
Wed Apr 16 11:40:22 CDT 2014


https://bugs.winehq.org/show_bug.cgi?id=36013

            Bug ID: 36013
           Summary: bleem! (PlayStation emulator) fails on startup,
                    complaining with 'Not enough memory to load program!'
           Product: Wine
           Version: 1.7.16
          Hardware: x86
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: -unknown
          Assignee: wine-bugs at winehq.org
          Reporter: focht at gmx.net

Hello folks,

continuation of bug 34618

You need my 1-byte binary patch from bug 34618 to bypass the Win9X debugger
check:

--- snip ---
$ printf '\x30' | dd of=bleem\!.exe bs=1 seek=349588 count=1 conv=notrunc
--- snip ---

WINEPREFIX Windows version must be set to 'Win9X' variant.

Relevant part of trace log:

--- snip ---
$ pwd
/home/focht/.wine/drive_c/Program Files/bleem/bleem!

$ WINEDEBUG=+tid,+seh,+relay,+vxd wine ./bleem\!.exe >>log.txt 2>&1
...

0023:Call KERNEL32.CreateFileA(004011e0 "C:\\Program
Files\\bleem\\bleem!\\bleem!.exe",80000000,00000001,00000000,00000003,00000080,00000000)
ret=0040107c
0023:Ret  KERNEL32.CreateFileA() retval=0000005c ret=0040107c
0023:Call
KERNEL32.CreateFileMappingA(0000005c,00000000,00000002,00000000,00000000,00000000)
ret=00401096
0023:Ret  KERNEL32.CreateFileMappingA() retval=00000060 ret=00401096
0023:Call KERNEL32.MapViewOfFile(00000060,00000004,00000000,00000000,00000000)
ret=004010ad
0023:Ret  KERNEL32.MapViewOfFile() retval=00340000 ret=004010ad
0023:Call krnl386.exe16.VxDCall0(002a0000) ret=003958ad
0023:  eax=004022a4 ebx=000000b5 ecx=00000000 edx=00000005 esi=0033feb0
edi=0033fbac ebp=0033fe38 esp=0033fb08 ds=002b es=002b fs=0063 gs=006b
flags=00000202
0023:Call KERNEL32.LoadLibraryW(7e6dd0e4 L"vwin32.vxd") ret=7e6acb8c
...
0023:Ret  KERNEL32.LoadLibraryW() retval=7e400000 ret=7e6acb8c
0023:Call KERNEL32.GetProcAddress(7e400000,7e6c08de "VxDCall") ret=7e6acbf8
0023:Ret  KERNEL32.GetProcAddress() retval=7e4066ac ret=7e6acbf8
0023:Call vwin32.vxd.VxDCall(002a0000,0033f794) ret=7e6acc68
0023:Call KERNEL32.GetVersion() ret=7e406cc7
0023:Ret  KERNEL32.GetVersion() retval=c0000a04 ret=7e406cc7
0023:Ret  vwin32.vxd.VxDCall() retval=0000040a ret=7e6acc68
0023:Ret  krnl386.exe16.VxDCall0() retval=0000040a ret=003958ad
0023:  eax=0000040a ebx=000000b5 ecx=00000000 edx=00000005 esi=0033feb0
edi=0033fbac ebp=0033fe38 esp=0033fb08 ds=002b es=002b fs=0063 gs=006b
flags=00000202
0023:Call krnl386.exe16.VxDCall0(002a002a) ret=003958c0
0023:  eax=004022a4 ebx=002a002a ecx=00000000 edx=00000005 esi=0033feb0
edi=0033fbac ebp=0033fe38 esp=0033fb0c ds=002b es=002b fs=0063 gs=006b
flags=00000206
0023:Call vwin32.vxd.VxDCall(002a002a,0033f798) ret=7e6acc68
0023:Ret  vwin32.vxd.VxDCall() retval=0000004f ret=7e6acc68
0023:Ret  krnl386.exe16.VxDCall0() retval=0000004f ret=003958c0
0023:  eax=0000004f ebx=002a002a ecx=00000000 edx=00000005 esi=0033feb0
edi=0033fbac ebp=0033fe38 esp=0033fb10 ds=002b es=002b fs=0063 gs=006b
flags=00000206
0023:Call krnl386.exe16.VxDCall0(00010000) ret=00395737
0023:  eax=004022a4 ebx=00000010 ecx=0005b944 edx=00000000 esi=0033fb60
edi=0034fa0c ebp=8005a244 esp=0033fafc ds=002b es=002b fs=0063 gs=006b
flags=00000202
0023:Call KERNEL32.LoadLibraryW(7e6dd0c0 L"vmm.vxd") ret=7e6acb8c
...
0023:Ret  KERNEL32.LoadLibraryW() retval=7e1e0000 ret=7e6acb8c
0023:Call KERNEL32.GetProcAddress(7e1e0000,7e6c08de "VxDCall") ret=7e6acbf8
0023:Ret  KERNEL32.GetProcAddress() retval=7e1ee794 ret=7e6acbf8
0023:Call vmm.vxd.VxDCall(00010000,0033f788) ret=7e6acc68
0023:trace:vxd:VMM_VxDCall PageReserve: page: 80000400, npages: 0000005c,
flags: 00000008 partial stub!
0023:Call KERNEL32.VirtualAlloc(00000000,0005c000,00002000,00000000)
ret=7e1eea61
0023:Ret  KERNEL32.VirtualAlloc() retval=00000000 ret=7e1eea61
0023:trace:vxd:VMM_VxDCall PageReserve: returning: (nil)
0023:Ret  vmm.vxd.VxDCall() retval=ffffffff ret=7e6acc68
0023:Ret  krnl386.exe16.VxDCall0() retval=ffffffff ret=00395737
0023:  eax=ffffffff ebx=00000010 ecx=0005b944 edx=00000000 esi=0033fb60
edi=0034fa0c ebp=8005a244 esp=0033fb08 ds=002b es=002b fs=0063 gs=006b
flags=00000202
0023:Call KERNEL32.UnmapViewOfFile(00340000) ret=004010d6
0023:Ret  KERNEL32.UnmapViewOfFile() retval=00000001 ret=004010d6
0023:Call KERNEL32.CloseHandle(00000060) ret=004010e1
0023:Ret  KERNEL32.CloseHandle() retval=00000001 ret=004010e1
0023:Call KERNEL32.CloseHandle(0000005c) ret=004010ec
0023:Ret  KERNEL32.CloseHandle() retval=00000001 ret=004010ec
0023:Call user32.MessageBeep(00000010) ret=004010ff
0023:Call winex11.drv.SystemParametersInfo(00000001,00000000,0033fdcc,00000000)
ret=7ec19bd2
0023:Ret  winex11.drv.SystemParametersInfo() retval=00000000 ret=7ec19bd2
0023:Call winex11.drv.Beep() ret=7ebffc49
0023:Ret  winex11.drv.Beep() retval=00000001 ret=7ebffc49
0023:Ret  user32.MessageBeep() retval=00000001 ret=004010ff
0023:Call user32.MessageBoxA(00000000,00401336 "Not enough memory to load
program!\n\nClose other applications and try again.",004012e5 "bleem,
llc.",00011010) ret=0040111c 
--- snip ---

The emulator uses VMM.VXD service 'PageReserve' with 'PR_FIXED' attributes to
request a chunk of memory.

VirtualAlloc() with '0' page protection attributes (line 162) doesn't make
sense here, probably a typo.

Source:
http://source.winehq.org/git/wine.git/blob/ae9b07fdc0f8b179d87db07c8ecd2c07f67446dc:/dlls/vmm.vxd/vmm.c#l136

--- snip ---
136 DWORD WINAPI VMM_VxDCall( DWORD service, CONTEXT *context )
137 {
138     static int warned;
139
140     switch ( LOWORD(service) )
141     {
142     case 0x0000: /* PageReserve */
143     {
144         LPVOID address;
145         LPVOID ret;
146         ULONG page = stack32_pop( context );
147         ULONG npages = stack32_pop( context );
148         ULONG flags = stack32_pop( context );
149
150         TRACE("PageReserve: page: %08x, npages: %08x, flags: %08x partial
stub!\n",
151             page, npages, flags );
152
153         if ( page == PR_SYSTEM ) {
154             ERR("Can't reserve ring 1 memory\n");
155             return -1;
156         }
157         /* FIXME: This has to be handled separately for the separate
158                 address-spaces we now have */
159         if ( page == PR_PRIVATE || page == PR_SHARED ) page = 0;
160         /* FIXME: Handle flags in some way */
161         address = (LPVOID )(page * page_size);
162         ret = VirtualAlloc ( address, npages * page_size, MEM_RESERVE, 0 );
163         TRACE("PageReserve: returning: %p\n", ret );
164         if ( ret == NULL )
165             return -1;
166         else
167             return (DWORD )ret;
168     }
...
--- snip ---

$ sha1sum demo-v1_4.exe 
b05c7c4023046fabec5a47aac0754ad0ac6b2325  demo-v1_4.exe

$ du -sh demo-v1_4.exe 
444K    demo-v1_4.exe

$ wine --version
wine-1.7.16-178-g7e874ae

Regards

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list