To further my porting work, I've patched my copy of DOSMEM.C like this:
else if (dos_init && !already_mapped) { if (DOSMEM_dosmem) { ERR( "Needs access to the first megabyte for DOS mode\n" ); ExitProcess(1); } MESSAGE( "Warning: unprotecting the first 64KB of memory to allow real-mode calls.\n" " NULL pointer accesses will no longer be caught.\n" );
/* James Day added the if/FIXME/return false around this VirtualProtect because OzWin on my AMD K6-3 gave this result: wine --debugmsg +dosmem ozwin2 fixme:toolhelp:InterruptRegister16 (0000, 0x26f00ba), stub. Warning: unprotecting the first 64KB of memory to allow real-mode calls. NULL pointer accesses will no longer be caught. fixme:dosmem:DOSMEM_Init Failed to unprotect first 64KB of memory. init=1, done=1, mapped=0 fixme:toolhelp:InterruptUnRegister16 (0000), stub. */ if ( ! VirtualProtect( NULL, 0x10000, PAGE_EXECUTE_READWRITE, NULL ) ) { FIXME("Failed to unprotect first 64KB of memory. init=%d, done=%d, mapped=%d\n", (int)dos_init, already_done, already_mapped); return FALSE; } /* copy the BIOS and ISR area down */ memcpy( DOSMEM_dosmem, DOSMEM_sysmem, 0x400 + 0x100 );
NtProtectVirtualMemory is returning STATUS_INVALID_PARAMETER to VirtualProtectEx and DOSMEM_Init wasn't handling this failure gracefully - the memcpy was tripping the debugger and falling flat, taking the application with it.
Anyone got any better ideas? Want more information on what's happening, like which of the STATUS_INVALID_PARAMETER cases is happening?
Lindows 3.0 OS (Debian plus bits), Wine 20021125 compiled here with only this change. Not running as root. 128MB of RAM.
___________________________________________________ The ALL NEW CS2000 from CompuServe Better! Faster! More Powerful! 250 FREE hours! Sign-on Now! http://www.compuserve.com/trycsrv/cs2000/webmail/