kernel32: Remove the DOS/Win16/OS2 binary distinction.
They all need to be run through winevdm. Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
57512807b9
commit
1060567cc5
|
@ -69,8 +69,6 @@ enum binary_type
|
|||
BINARY_UNKNOWN = 0,
|
||||
BINARY_PE,
|
||||
BINARY_WIN16,
|
||||
BINARY_OS216,
|
||||
BINARY_DOS,
|
||||
BINARY_UNIX_EXE,
|
||||
BINARY_UNIX_LIB
|
||||
};
|
||||
|
|
|
@ -259,54 +259,6 @@ BOOL WINAPI DisableThreadLibraryCalls( HMODULE hModule )
|
|||
}
|
||||
|
||||
|
||||
/* Check whether a file is an OS/2 or a very old Windows executable
|
||||
* by testing on import of KERNEL.
|
||||
*
|
||||
* Reading the module imports is the only reasonable way of discerning
|
||||
* old Windows binaries from OS/2 ones.
|
||||
*/
|
||||
static DWORD MODULE_Decide_OS2_OldWin(HANDLE hfile, const IMAGE_DOS_HEADER *mz, const IMAGE_OS2_HEADER *ne)
|
||||
{
|
||||
DWORD currpos = SetFilePointer( hfile, 0, NULL, SEEK_CUR);
|
||||
DWORD ret = BINARY_OS216;
|
||||
LPWORD modtab = NULL;
|
||||
LPSTR nametab = NULL;
|
||||
DWORD len;
|
||||
int i;
|
||||
|
||||
/* read modref table */
|
||||
if ( (SetFilePointer( hfile, mz->e_lfanew + ne->ne_modtab, NULL, SEEK_SET ) == -1)
|
||||
|| (!(modtab = HeapAlloc( GetProcessHeap(), 0, ne->ne_cmod*sizeof(WORD))))
|
||||
|| (!(ReadFile(hfile, modtab, ne->ne_cmod*sizeof(WORD), &len, NULL)))
|
||||
|| (len != ne->ne_cmod*sizeof(WORD)) )
|
||||
goto done;
|
||||
|
||||
/* read imported names table */
|
||||
if ( (SetFilePointer( hfile, mz->e_lfanew + ne->ne_imptab, NULL, SEEK_SET ) == -1)
|
||||
|| (!(nametab = HeapAlloc( GetProcessHeap(), 0, ne->ne_enttab - ne->ne_imptab)))
|
||||
|| (!(ReadFile(hfile, nametab, ne->ne_enttab - ne->ne_imptab, &len, NULL)))
|
||||
|| (len != ne->ne_enttab - ne->ne_imptab) )
|
||||
goto done;
|
||||
|
||||
for (i=0; i < ne->ne_cmod; i++)
|
||||
{
|
||||
LPSTR module = &nametab[modtab[i]];
|
||||
TRACE("modref: %.*s\n", module[0], &module[1]);
|
||||
if (!(strncmp(&module[1], "KERNEL", module[0])))
|
||||
{ /* very old Windows file */
|
||||
MESSAGE("This seems to be a very old (pre-3.0) Windows executable. Expect crashes, especially if this is a real-mode binary !\n");
|
||||
ret = BINARY_WIN16;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
HeapFree( GetProcessHeap(), 0, modtab);
|
||||
HeapFree( GetProcessHeap(), 0, nametab);
|
||||
SetFilePointer( hfile, currpos, NULL, SEEK_SET); /* restore filepos */
|
||||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* MODULE_GetBinaryType
|
||||
*/
|
||||
|
@ -460,7 +412,7 @@ void MODULE_get_binary_info( HANDLE hfile, struct binary_info *info )
|
|||
* This will tell us if there is more header information
|
||||
* to read or not.
|
||||
*/
|
||||
info->type = BINARY_DOS;
|
||||
info->type = BINARY_WIN16;
|
||||
info->arch = IMAGE_FILE_MACHINE_I386;
|
||||
if (SetFilePointer( hfile, header.mz.e_lfanew, NULL, SEEK_SET ) == -1) return;
|
||||
if (!ReadFile( hfile, &ext_header, sizeof(ext_header), &len, NULL ) || len < 4) return;
|
||||
|
@ -504,28 +456,6 @@ void MODULE_get_binary_info( HANDLE hfile, struct binary_info *info )
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (!memcmp( &ext_header.os2.ne_magic, "NE", 2 ))
|
||||
{
|
||||
/* This is a Windows executable (NE) header. This can
|
||||
* mean either a 16-bit OS/2 or a 16-bit Windows or even a
|
||||
* DOS program (running under a DOS extender). To decide
|
||||
* which, we'll have to read the NE header.
|
||||
*/
|
||||
if (len >= sizeof(ext_header.os2))
|
||||
{
|
||||
if (ext_header.os2.ne_flags & NE_FFLAGS_LIBMODULE) info->flags |= BINARY_FLAG_DLL;
|
||||
switch ( ext_header.os2.ne_exetyp )
|
||||
{
|
||||
case 1: info->type = BINARY_OS216; break; /* OS/2 */
|
||||
case 2: info->type = BINARY_WIN16; break; /* Windows */
|
||||
case 3: info->type = BINARY_DOS; break; /* European MS-DOS 4.x */
|
||||
case 4: info->type = BINARY_WIN16; break; /* Windows 386; FIXME: is this 32bit??? */
|
||||
case 5: info->type = BINARY_DOS; break; /* BOSS, Borland Operating System Services */
|
||||
/* other types, e.g. 0 is: "unknown" */
|
||||
default: info->type = MODULE_Decide_OS2_OldWin(hfile, &header.mz, &ext_header.os2); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2478,9 +2478,7 @@ static BOOL create_process_impl( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_A
|
|||
retv = create_process( hFile, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr,
|
||||
inherit, flags, startup_info, info, unixdir, &binary_info, FALSE );
|
||||
break;
|
||||
case BINARY_OS216:
|
||||
case BINARY_WIN16:
|
||||
case BINARY_DOS:
|
||||
TRACE( "starting %s as Win16/DOS binary\n", debugstr_w(name) );
|
||||
retv = create_vdm_process( name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr,
|
||||
inherit, flags, startup_info, info, unixdir, &binary_info, FALSE );
|
||||
|
@ -2498,7 +2496,7 @@ static BOOL create_process_impl( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_A
|
|||
if (!strcmpiW( p, comW ) || !strcmpiW( p, pifW ))
|
||||
{
|
||||
TRACE( "starting %s as DOS binary\n", debugstr_w(name) );
|
||||
binary_info.type = BINARY_DOS;
|
||||
binary_info.type = BINARY_WIN16;
|
||||
binary_info.arch = IMAGE_FILE_MACHINE_I386;
|
||||
retv = create_vdm_process( name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr,
|
||||
inherit, flags, startup_info, info, unixdir,
|
||||
|
@ -2640,12 +2638,10 @@ static void exec_process( LPCWSTR name )
|
|||
/* check for .com or .pif extension */
|
||||
if (!(p = strrchrW( name, '.' ))) break;
|
||||
if (strcmpiW( p, comW ) && strcmpiW( p, pifW )) break;
|
||||
binary_info.type = BINARY_DOS;
|
||||
binary_info.type = BINARY_WIN16;
|
||||
binary_info.arch = IMAGE_FILE_MACHINE_I386;
|
||||
/* fall through */
|
||||
case BINARY_OS216:
|
||||
case BINARY_WIN16:
|
||||
case BINARY_DOS:
|
||||
TRACE( "starting %s as Win16/DOS binary\n", debugstr_w(name) );
|
||||
create_vdm_process( name, GetCommandLineW(), NULL, NULL, NULL, NULL,
|
||||
FALSE, 0, &startup_info, &info, NULL, &binary_info, TRUE );
|
||||
|
|
Loading…
Reference in New Issue