This look more reasonable?
Thanks,
Chris
* dlls/winedos/module.c:
Chris Morgan <cmorgan(a)alum.wpi.edu>
Call CreateProcessA() when executing non-dos applications from a dos application.
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 10 Oct 2002 22:08:48 -0000
@@ -339,17 +339,68 @@
/***********************************************************************
* MZ_Exec
+ *
+ * this may only be called from existing DOS processes
*/
BOOL WINAPI MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk )
{
- /* 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? */
+ DWORD binType;
+ STARTUPINFOA st;
+ PROCESS_INFORMATION pe;
+ BOOL status;
+
HANDLE hFile = CreateFileA( filename, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, 0);
BOOL ret = FALSE;
+
+ if(!GetBinaryTypeA(filename, &binType)) /* determine what kind of binary this is */
+ {
+ return FALSE; /* binary is not an executable */
+ }
+
if (hFile == INVALID_HANDLE_VALUE) return FALSE;
+
+ /* handle non-dos executables */
+ if(binType != SCS_DOS_BINARY)
+ {
+ if(func == 0) /* load and execute */
+ {
+ BYTE fullCmdLine[512];
+ LPBYTE psp_start = (LPBYTE)((DWORD)DOSVM_psp << 4);
+ PDB16 *psp = (PDB16 *)psp_start;
+ ExecBlock *blk = (ExecBlock *)paramblk;
+ LPBYTE cmdline = PTR_REAL_TO_LIN(SELECTOROF(blk->cmdline),OFFSETOF(blk->cmdline));
+ LPBYTE envblock = PTR_REAL_TO_LIN(psp->environment, 0);
+ BYTE cmdLength = cmdline[0];
+ cmdline[cmdLength + 1] = 0; /* null terminate and remove the \r at the end */
+ cmdline++; /* the first character contains the length of the command line */
+
+ snprintf(fullCmdLine, sizeof(fullCmdLine), "%s %s", filename, cmdline); /* build the full command line */
+
+ ZeroMemory (&st, sizeof(STARTUPINFOA));
+ st.cb = sizeof(STARTUPINFOA);
+ status = CreateProcessA (NULL, fullCmdLine, NULL, NULL, TRUE,
+ 0, envblock, NULL, &st, &pe);
+
+ /* wait here until the child process is complete */
+ WaitForSingleObject(pe.hProcess, INFINITE);
+
+ /* clean up PROCESS_INFORMATION handles */
+ CloseHandle(pe.hProcess);
+ CloseHandle(pe.hThread);
+
+ ret = TRUE;
+ } else
+ {
+ FIXME("EXEC type of %d not implemented for non-dos executables\n", func);
+ ret = FALSE;
+ }
+
+ CloseHandle(hFile);
+ return ret;
+ } /* if(binType != SCS_DOS_BINARY) */
+
+ /* handle dos executables */
switch (func) {
case 0: /* load and execute */
case 1: /* load but don't execute */