From 2dc9ed3006dde794113c490ba15e06af551c8788 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 7 May 2008 17:33:50 +0200 Subject: [PATCH] winedos: Print better diagnostics when a DOS app fails to start. --- dlls/kernel32/wowthunk.c | 2 +- dlls/winedos/dosmem.c | 2 -- dlls/winedos/dosvm.c | 13 +++++++------ dlls/winedos/module.c | 20 +++++++++++++++++--- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/dlls/kernel32/wowthunk.c b/dlls/kernel32/wowthunk.c index 791f7cf96a0..e86c582f4b9 100644 --- a/dlls/kernel32/wowthunk.c +++ b/dlls/kernel32/wowthunk.c @@ -593,7 +593,7 @@ BOOL WINAPI K32WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags, __wine_pop_frame( &frame ); if (errno != 0) /* enter_vm86 will fall with ENOSYS on x64 kernels */ { - ERR("__wine_enter_vm86 failed (errno=%d)\n", errno); + WARN("__wine_enter_vm86 failed (errno=%d)\n", errno); if (errno == ENOSYS) SetLastError(ERROR_NOT_SUPPORTED); else diff --git a/dlls/winedos/dosmem.c b/dlls/winedos/dosmem.c index 876a3e7966a..76bf10c0d55 100644 --- a/dlls/winedos/dosmem.c +++ b/dlls/winedos/dosmem.c @@ -511,8 +511,6 @@ BOOL DOSMEM_MapDosLayout(void) ERR( "Need full access to the first megabyte for DOS mode\n" ); ExitProcess(1); } - MESSAGE( "Warning: unprotecting memory to allow real-mode calls.\n" - " NULL pointer accesses will no longer be caught.\n" ); /* copy the BIOS and ISR area down */ memcpy( DOSMEM_dosmem, DOSMEM_sysmem, 0x400 + 0x100 ); DOSMEM_sysmem = DOSMEM_dosmem; diff --git a/dlls/winedos/dosvm.c b/dlls/winedos/dosvm.c index 7defba15a8b..4a86855368b 100644 --- a/dlls/winedos/dosvm.c +++ b/dlls/winedos/dosvm.c @@ -569,15 +569,16 @@ static LONG WINAPI exception_handler(EXCEPTION_POINTERS *eptr) return EXCEPTION_CONTINUE_SEARCH; } -int WINAPI DOSVM_Enter( CONTEXT86 *context ) +INT WINAPI DOSVM_Enter( CONTEXT86 *context ) { + INT ret = 0; if (!ISV86(context)) ERR( "Called with protected mode context!\n" ); __TRY { - WOWCallback16Ex( 0, WCB16_REGS, 0, NULL, (DWORD *)context ); - TRACE_(module)( "vm86 returned: %s\n", strerror(errno) ); + if (!WOWCallback16Ex( 0, WCB16_REGS, 0, NULL, (DWORD *)context )) ret = -1; + TRACE_(module)( "ret %d err %u\n", ret, GetLastError() ); } __EXCEPT(exception_handler) { @@ -585,7 +586,7 @@ int WINAPI DOSVM_Enter( CONTEXT86 *context ) } __ENDTRY - return 0; + return ret; } /*********************************************************************** @@ -645,8 +646,8 @@ void WINAPI DOSVM_PIC_ioport_out( WORD port, BYTE val) */ INT WINAPI DOSVM_Enter( CONTEXT86 *context ) { - ERR_(module)("DOS realmode not supported on this architecture!\n"); - return -1; + SetLastError( ERROR_NOT_SUPPORTED ); + return -1; } /*********************************************************************** diff --git a/dlls/winedos/module.c b/dlls/winedos/module.c index ade7732fd9e..ac35e8545b4 100644 --- a/dlls/winedos/module.c +++ b/dlls/winedos/module.c @@ -614,7 +614,7 @@ void WINAPI MZ_RunInThread( PAPCFUNC proc, ULONG_PTR arg ) static DWORD WINAPI MZ_DOSVM( LPVOID lpExtra ) { CONTEXT context; - DWORD ret; + INT ret; dosvm_pid = getpid(); @@ -628,9 +628,23 @@ static DWORD WINAPI MZ_DOSVM( LPVOID lpExtra ) context.EFlags = V86_FLAG | VIF_MASK; DOSVM_SetTimer(0x10000); ret = DOSVM_Enter( &context ); - + if (ret == -1) + { + /* fetch the app name from the environment */ + PDB16 *psp = PTR_REAL_TO_LIN( DOSVM_psp, 0 ); + char *env = PTR_REAL_TO_LIN( psp->environment, 0 ); + while (*env) env += strlen(env) + 1; + env += 1 + sizeof(WORD); + + if (GetLastError() == ERROR_NOT_SUPPORTED) + MESSAGE( "wine: Cannot start DOS application %s\n" + " because vm86 mode is not supported on this platform.\n", + debugstr_a(env) ); + else + FIXME( "vm86 mode failed error %u\n", GetLastError() ); + } dosvm_pid = 0; - return ret; + return ret != 0; } static BOOL MZ_InitTask(void) -- 2.11.4.GIT