krnl386.exe: Propagate DOS startup errors up to winevdm.

This commit is contained in:
Alexandre Julliard 2010-11-11 18:01:05 +01:00
parent 44a17d27bb
commit 173957d294
2 changed files with 39 additions and 34 deletions

View File

@ -114,7 +114,7 @@ static WORD init_cs,init_ip,init_ss,init_sp;
static HANDLE dosvm_thread, loop_thread; static HANDLE dosvm_thread, loop_thread;
static DWORD dosvm_tid, loop_tid; static DWORD dosvm_tid, loop_tid;
static void MZ_Launch( LPCSTR cmdtail, int length ); static DWORD MZ_Launch( LPCSTR cmdtail, int length );
static BOOL MZ_InitTask(void); static BOOL MZ_InitTask(void);
static void MZ_CreatePSP( LPVOID lpPSP, WORD env, WORD par ) static void MZ_CreatePSP( LPVOID lpPSP, WORD env, WORD par )
@ -434,7 +434,11 @@ void __wine_load_dos_exe( LPCSTR filename, LPCSTR cmdline )
} }
if (MZ_DoLoadImage( hFile, filename, NULL, 0 )) if (MZ_DoLoadImage( hFile, filename, NULL, 0 ))
MZ_Launch( dos_cmdtail, dos_length ); {
DWORD err = MZ_Launch( dos_cmdtail, dos_length );
/* if we get back here it failed */
SetLastError( err );
}
} }
/*********************************************************************** /***********************************************************************
@ -633,24 +637,9 @@ static DWORD WINAPI MZ_DOSVM( LPVOID lpExtra )
context.EFlags = V86_FLAG | VIF_MASK; context.EFlags = V86_FLAG | VIF_MASK;
DOSVM_SetTimer(0x10000); DOSVM_SetTimer(0x10000);
ret = DOSVM_Enter( &context ); ret = DOSVM_Enter( &context );
if (ret == -1) if (ret == -1) ret = GetLastError();
{
/* 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"
" Try running the application with DOSBox.\n",
debugstr_a(env) );
else
FIXME( "vm86 mode failed error %u\n", GetLastError() );
}
dosvm_pid = 0; dosvm_pid = 0;
return ret != 0; return ret;
} }
static BOOL MZ_InitTask(void) static BOOL MZ_InitTask(void)
@ -669,7 +658,7 @@ static BOOL MZ_InitTask(void)
return TRUE; return TRUE;
} }
static void MZ_Launch( LPCSTR cmdtail, int length ) static DWORD MZ_Launch( LPCSTR cmdtail, int length )
{ {
TDB *pTask = GlobalLock16( GetCurrentTask() ); TDB *pTask = GlobalLock16( GetCurrentTask() );
BYTE *psp_start = PTR_REAL_TO_LIN( DOSVM_psp, 0 ); BYTE *psp_start = PTR_REAL_TO_LIN( DOSVM_psp, 0 );
@ -696,9 +685,10 @@ static void MZ_Launch( LPCSTR cmdtail, int length )
dosvm_thread = 0; dosvm_tid = 0; dosvm_thread = 0; dosvm_tid = 0;
CloseHandle(loop_thread); CloseHandle(loop_thread);
loop_thread = 0; loop_tid = 0; loop_thread = 0; loop_tid = 0;
if (rv) return rv;
VGA_Clean(); VGA_Clean();
ExitProcess(rv); ExitProcess(0);
} }
/*********************************************************************** /***********************************************************************
@ -756,8 +746,7 @@ BOOL MZ_Current( void )
*/ */
void __wine_load_dos_exe( LPCSTR filename, LPCSTR cmdline ) void __wine_load_dos_exe( LPCSTR filename, LPCSTR cmdline )
{ {
FIXME("DOS executables not supported on this platform\n"); SetLastError( ERROR_NOT_SUPPORTED );
SetLastError(ERROR_BAD_FORMAT);
} }
/*********************************************************************** /***********************************************************************

View File

@ -101,6 +101,30 @@ typedef struct {
#include "poppack.h" #include "poppack.h"
/***********************************************************************
* start_dos_exe
*/
static void start_dos_exe( LPCSTR filename, LPCSTR cmdline )
{
MEMORY_BASIC_INFORMATION mem_info;
const char *reason;
if (VirtualQuery( NULL, &mem_info, sizeof(mem_info) ) && mem_info.State != MEM_FREE)
{
__wine_load_dos_exe( filename, cmdline );
if (GetLastError() == ERROR_NOT_SUPPORTED)
reason = "because vm86 mode is not supported on this platform";
else
reason = wine_dbg_sprintf( "It failed with error code %u", GetLastError() );
}
else reason = "because the DOS memory range is unavailable";
WINE_MESSAGE( "winevdm: Cannot start DOS application %s\n", filename );
WINE_MESSAGE( " %s.\n", reason );
WINE_MESSAGE( " Try running this application with DOSBox.\n" );
ExitProcess(1);
}
/*********************************************************************** /***********************************************************************
* read_pif_file * read_pif_file
*pif386rec_tu *pif386rec_tu
@ -244,8 +268,7 @@ static VOID pif_cmd( char *filename, char *cmdline)
* - hot key's * - hot key's
* - etc. * - etc.
*/ */
__wine_load_dos_exe( progpath, cmdline ); start_dos_exe( progpath, cmdline );
return;
} }
/*********************************************************************** /***********************************************************************
@ -382,7 +405,6 @@ int main( int argc, char *argv[] )
STARTUPINFOA info; STARTUPINFOA info;
char *cmdline, *appname, **first_arg; char *cmdline, *appname, **first_arg;
char *p; char *p;
MEMORY_BASIC_INFORMATION mem_info;
if (!argv[1]) usage(); if (!argv[1]) usage();
@ -439,15 +461,9 @@ int main( int argc, char *argv[] )
pif_cmd( appname, cmdline + 1); pif_cmd( appname, cmdline + 1);
else else
{ {
if (!VirtualQuery( NULL, &mem_info, sizeof(mem_info) ) || mem_info.State == MEM_FREE)
{
WINE_MESSAGE( "winevdm: unable to exec '%s': DOS memory range unavailable\n", appname );
ExitProcess(1);
}
/* try DOS format */ /* try DOS format */
/* loader expects arguments to be regular C strings */ /* loader expects arguments to be regular C strings */
__wine_load_dos_exe( appname, cmdline + 1 ); start_dos_exe( appname, cmdline + 1 );
} }
/* if we get back here it failed */ /* if we get back here it failed */
instance = GetLastError(); instance = GetLastError();