fixing bug 690 by Brandon Turner. note ms only allown start "notepad" or
"note"pad not notep"ad or notepad" but we do that, for we think it is
a
bug in ms cmd that only allowing " at start of a file name to start the
apps.
Modified: trunk/reactos/subsys/system/cmd/cmd.c
_____
Modified: trunk/reactos/subsys/system/cmd/cmd.c
--- trunk/reactos/subsys/system/cmd/cmd.c 2005-08-08 16:58:30 UTC
(rev 17217)
+++ trunk/reactos/subsys/system/cmd/cmd.c 2005-08-08 18:59:56 UTC
(rev 17218)
@@ -287,14 +287,18 @@
/*
* This command (in first) was not found in the command table
*
- * first - first word on command line
- * rest - rest of command line
+ * Full - whole command line
+ * First - first word on command line
+ * Rest - rest of command line
*/
static VOID
-Execute (LPTSTR full, LPTSTR first, LPTSTR rest)
+Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest)
{
TCHAR szFullName[MAX_PATH];
+ TCHAR first[MAX_PATH];
+ TCHAR rest[MAX_PATH];
+ TCHAR full[MAX_PATH];
#ifndef __REACTOS__
TCHAR szWindowTitle[MAX_PATH];
#endif
@@ -304,6 +308,51 @@
DebugPrintf (_T("Execute: \'%s\' \'%s\'\n"), first, rest);
#endif
+ /* Though it was already parsed once, we have a different set of
rules
+ for parsing before we pass to CreateProccess */
+ if(!_tcschr(Full,_T('\"')))
+ {
+ _tcscpy(first,First);
+ _tcscpy(rest,Rest);
+ _tcscpy(full,Full);
+ }
+ else
+ {
+ INT i = 0;
+ BOOL bInside = FALSE;
+ rest[0] = _T('\0');
+ full[0] = _T('\0');
+ first[0] = _T('\0');
+ _tcscpy(first,Full);
+ /* find the end of the command and start of the args */
+ for(i = 0; i < _tcslen(first); i++)
+ {
+ if(!_tcsncmp(&first[i], _T("\""), 1))
+ bInside = !bInside;
+ if(!_tcsncmp(&first[i], _T(" "), 1) && !bInside)
+ {
+ _tcscpy(rest,&first[i]);
+ first[i] = _T('\0');
+ break;
+ }
+
+ }
+ i = 0;
+ /* remove any slashes */
+ while(i < _tcslen(first))
+ {
+ if(!_tcsncmp (&first[i], _T("\""), 1))
+ memcpy(&first[i],&first[i + 1],
_tcslen(&first[i]));
+ else
+ i++;
+ }
+ /* Drop quotes around it just in case there is a space
*/
+ _tcscpy(full,_T("\""));
+ _tcscat(full,first);
+ _tcscat(full,_T("\" "));
+ _tcscat(full,rest);
+ }
+
/* check for a drive change */
if ((_istalpha (first[0])) && (!_tcscmp (first + 1, _T(":"))))
{