krnl386.exe: Propagate DOS startup errors up to winevdm.
This commit is contained in:
parent
44a17d27bb
commit
173957d294
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue