Consult ne.operating_system field for NE files in GetBinaryType().
diff --git a/loader/module.c b/loader/module.c
index 199be35..feb4974 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -538,7 +538,7 @@
* SCS_WOW_BINARY: A Win16 based application
* SCS_PIF_BINARY: A PIF file that executes an MS-Dos based app
* SCS_POSIX_BINARY: A POSIX based application ( Not implemented )
- * SCS_OS216_BINARY: A 16bit OS/2 based application ( Not implemented )
+ * SCS_OS216_BINARY: A 16bit OS/2 based application
*
* Returns TRUE if the file is an executable in which case
* the value pointed by lpBinaryType is set.
@@ -614,12 +614,25 @@
{
/* The IMAGE_OS2_SIGNATURE indicates that the
* "extended header is a Windows executable (NE)
- * header. This is a bit misleading, but it is
- * documented in the SDK. ( for more details see
- * the neexe.h file )
+ * 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.
*/
- *lpBinaryType = SCS_WOW_BINARY;
- return TRUE;
+
+ IMAGE_OS2_HEADER ne;
+ if ( _llseek( hfile, mz_header.e_lfanew, SEEK_SET ) >= 0 &&
+ _lread( hfile, &ne, sizeof(ne) ) == sizeof(ne) )
+ {
+ switch ( ne.operating_system )
+ {
+ case 2: *lpBinaryType = SCS_WOW_BINARY; return TRUE;
+ case 5: *lpBinaryType = SCS_DOS_BINARY; return TRUE;
+ default: *lpBinaryType = SCS_OS216_BINARY; return TRUE;
+ }
+ }
+ /* Couldn't read header, so abort. */
+ return FALSE;
}
else
{