Alexandre Julliard : kernel32: Remove the DOS/Win16/ OS2 binary distinction.

Alexandre Julliard julliard at winehq.org
Tue Sep 25 14:56:34 CDT 2018


Module: wine
Branch: master
Commit: 1060567cc592aaf7aa453d43a0a48bf7e9ac87f3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=1060567cc592aaf7aa453d43a0a48bf7e9ac87f3

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Sep 25 19:23:00 2018 +0200

kernel32: Remove the DOS/Win16/OS2 binary distinction.

They all need to be run through winevdm.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/kernel_private.h |  2 --
 dlls/kernel32/module.c         | 72 +-----------------------------------------
 dlls/kernel32/process.c        |  8 ++---
 3 files changed, 3 insertions(+), 79 deletions(-)

diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h
index 9073e18..b465d17 100644
--- a/dlls/kernel32/kernel_private.h
+++ b/dlls/kernel32/kernel_private.h
@@ -69,8 +69,6 @@ enum binary_type
     BINARY_UNKNOWN = 0,
     BINARY_PE,
     BINARY_WIN16,
-    BINARY_OS216,
-    BINARY_DOS,
     BINARY_UNIX_EXE,
     BINARY_UNIX_LIB
 };
diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index 31e3014..f03b498 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -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;
-                }
-            }
-        }
     }
 }
 
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index b0b5ccf..e159047 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -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 );




More information about the wine-cvs mailing list