Implement start execute support for bat/cmd file. woking in windows
Modified: trunk/reactos/subsys/system/cmd/start.c

Modified: trunk/reactos/subsys/system/cmd/start.c
--- trunk/reactos/subsys/system/cmd/start.c	2005-08-24 23:05:07 UTC (rev 17525)
+++ trunk/reactos/subsys/system/cmd/start.c	2005-08-24 23:07:51 UTC (rev 17526)
@@ -24,6 +24,12 @@
 	TCHAR rest[CMDLINE_LENGTH];
 	TCHAR param[CMDLINE_LENGTH];
 	BOOL bWait = FALSE;
+	BOOL bBat  = FALSE;
+	BOOL bCreate = FALSE;
+	TCHAR szFullCmdLine [CMDLINE_LENGTH];
+	PROCESS_INFORMATION prci;
+	STARTUPINFO stui;
+
 	param[0] = _T('\0');
 	
 	if (_tcsncmp (Rest, _T("/?"), 2) == 0)
@@ -115,39 +121,61 @@
 	if (!_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".bat")) ||
 	    !_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".cmd")))
 	{
+		bBat = TRUE;				
+		memset(szFullCmdLine,0,CMDLINE_LENGTH * sizeof(TCHAR));
+
+		/* FIXME : use comspec instead */
+		if (!SearchForExecutable (_T("CMD"), szFullCmdLine))
+	    {
+		    error_bad_command ();
+		    return 1;
+	    }
+       		
+		memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)],_T("\" /K "), 5 * sizeof(TCHAR));		
+		memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)], szFullName, _tcslen(szFullName) * sizeof(TCHAR));
+		memcpy(&szFullCmdLine[1], &szFullCmdLine[2], _tcslen(szFullCmdLine) * sizeof(TCHAR)); 
+        szFullCmdLine[0] = _T('\"');			
+	}
+
 #ifdef _DEBUG
 		DebugPrintf (_T("[BATCH: %s %s]\n"), szFullName, rest);
 #endif
+		
 
-		ConErrResPuts(STRING_START_ERROR1);
-	}
-	else
-	{
-		/* exec the program */
-		TCHAR szFullCmdLine [CMDLINE_LENGTH];
-		PROCESS_INFORMATION prci;
-		STARTUPINFO stui;
-
 #ifdef _DEBUG
 		DebugPrintf (_T("[EXEC: %s %s]\n"), szFullName, rest);
 #endif
 		/* build command line for CreateProcess() */
-		_tcscpy (szFullCmdLine, first);
-		if( param )
+		if (bBat == FALSE)
+		{
+		  _tcscpy (szFullCmdLine, first);
+		  if( param )
 		  {
 		    _tcscat(szFullCmdLine, _T(" ") );
 		    _tcscat (szFullCmdLine, param);
 		  }
+		}
 
 		/* fill startup info */
 		memset (&stui, 0, sizeof (STARTUPINFO));
 		stui.cb = sizeof (STARTUPINFO);
 		stui.dwFlags = STARTF_USESHOWWINDOW;
 		stui.wShowWindow = SW_SHOWDEFAULT;
-
-		if (CreateProcess (szFullName, szFullCmdLine, NULL, NULL, FALSE,
-		                   CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci))
+		        
+		if (bBat == TRUE)
 		{
+		 bCreate = CreateProcess (NULL, szFullCmdLine, NULL, NULL, FALSE,
+			 CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci);
+		}
+		else
+		{
+		 bCreate = CreateProcess (szFullName, szFullCmdLine, NULL, NULL, FALSE,
+			DETACHED_PROCESS, NULL, NULL, &stui, &prci);
+		
+		}
+		
+		if (bCreate)
+		{
 			if (bWait)
 			{
 				DWORD dwExitCode;
@@ -166,7 +194,7 @@
 			ErrorMessage(GetLastError (),
 			              _T("Error executing CreateProcess()!!\n"));
 		}
-	}
+//	}
 
 	return 0;
 }