PE support in MZ_Exec() /winedos/module.c

Chris Morgan cmorgan at alum.wpi.edu
Sat Sep 21 23:27:50 CDT 2002


I have a .com application that is calling out to dos int21 4Bh to load and 
execute a program.  MZ_Exec assumes this program is always going to be a dos 
executable and the application fails to run and complains that it is a pe 
executable.  So I've started to try and add support for correctly handling pe 
executables.  So far I have a patch like below but I'm thinking that a lot 
more needs to be done in order to fulfill the dos requirements of this 
function and kind of wanted some opinions on this.  This compiles but I 
haven't tested it since the program is at work, just wanted to get some 
feedback.

Thanks,
Chris

Index: dlls/winedos/module.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/module.c,v
retrieving revision 1.21
diff -u -r1.21 module.c
--- dlls/winedos/module.c	30 Aug 2002 00:03:25 -0000	1.21
+++ dlls/winedos/module.c	22 Sep 2002 03:28:00 -0000
@@ -39,6 +39,7 @@
 #endif
 #include "windef.h"
 #include "wine/winbase16.h"
+#include "wine/winbase.h"
 #include "wingdi.h"
 #include "winuser.h"
 #include "winerror.h"
@@ -342,16 +343,29 @@
  */
 BOOL WINAPI MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID 
paramblk )
 {
+  enum binary_type binType;
+  STARTUPINFOA st;
+  PROCESS_INFORMATION pe;
+  BOOL status;
+
   /* this may only be called from existing DOS processes
    * (i.e. one DOS app spawning another) */
-  /* FIXME: do we want to check binary type first, to check
-   * whether it's a NE/PE executable? */
   HANDLE hFile = CreateFileA( filename, GENERIC_READ, FILE_SHARE_READ,
 			     NULL, OPEN_EXISTING, 0, 0);
   BOOL ret = FALSE;
+
+  binType = MODULE_GetBinaryType(hFile);
+
   if (hFile == INVALID_HANDLE_VALUE) return FALSE;
   switch (func) {
   case 0: /* load and execute */
+    if(binType == BINARY_PE_EXE)
+    {
+      ZeroMemory (&st, sizeof(STARTUPINFOA));
+      st.cb = sizeof(STARTUPINFOA);
+      status = CreateProcessA (NULL, filename, NULL, NULL, FALSE,
+                 0, NULL, NULL, &st, &pe);
+    }
   case 1: /* load but don't execute */
     {
       /* save current process's return SS:SP now */




More information about the wine-devel mailing list