mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +00:00
Implement all remaining switches for the START command.
svn path=/trunk/; revision=40198
This commit is contained in:
parent
d17f538267
commit
2895b48a31
4 changed files with 70 additions and 20 deletions
|
@ -163,6 +163,7 @@ OSVERSIONINFO osvi;
|
||||||
HANDLE hIn;
|
HANDLE hIn;
|
||||||
HANDLE hOut;
|
HANDLE hOut;
|
||||||
HANDLE hConsole;
|
HANDLE hConsole;
|
||||||
|
LPTSTR lpOriginalEnvironment;
|
||||||
HANDLE CMD_ModuleHandle;
|
HANDLE CMD_ModuleHandle;
|
||||||
|
|
||||||
static NtQueryInformationProcessProc NtQueryInformationProcessPtr = NULL;
|
static NtQueryInformationProcessProc NtQueryInformationProcessPtr = NULL;
|
||||||
|
@ -1928,6 +1929,8 @@ int cmd_main (int argc, const TCHAR *argv[])
|
||||||
CONSOLE_SCREEN_BUFFER_INFO Info;
|
CONSOLE_SCREEN_BUFFER_INFO Info;
|
||||||
INT nExitCode;
|
INT nExitCode;
|
||||||
|
|
||||||
|
lpOriginalEnvironment = DuplicateEnvironment();
|
||||||
|
|
||||||
GetCurrentDirectory(MAX_PATH,startPath);
|
GetCurrentDirectory(MAX_PATH,startPath);
|
||||||
_tchdir(startPath);
|
_tchdir(startPath);
|
||||||
|
|
||||||
|
@ -1959,6 +1962,8 @@ int cmd_main (int argc, const TCHAR *argv[])
|
||||||
/* do the cleanup */
|
/* do the cleanup */
|
||||||
Cleanup();
|
Cleanup();
|
||||||
|
|
||||||
|
cmd_free(lpOriginalEnvironment);
|
||||||
|
|
||||||
cmd_exit(nExitCode);
|
cmd_exit(nExitCode);
|
||||||
return(nExitCode);
|
return(nExitCode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
extern HANDLE hOut;
|
extern HANDLE hOut;
|
||||||
extern HANDLE hIn;
|
extern HANDLE hIn;
|
||||||
extern HANDLE hConsole;
|
extern HANDLE hConsole;
|
||||||
|
extern LPTSTR lpOriginalEnvironment;
|
||||||
extern WORD wColor;
|
extern WORD wColor;
|
||||||
extern WORD wDefColor;
|
extern WORD wDefColor;
|
||||||
extern BOOL bCtrlBreak;
|
extern BOOL bCtrlBreak;
|
||||||
|
@ -437,6 +438,7 @@ INT CommandScreen (LPTSTR);
|
||||||
INT cmd_set (LPTSTR);
|
INT cmd_set (LPTSTR);
|
||||||
|
|
||||||
/* Prototypes for SETLOCAL.C */
|
/* Prototypes for SETLOCAL.C */
|
||||||
|
LPTSTR DuplicateEnvironment(VOID);
|
||||||
INT cmd_setlocal (LPTSTR);
|
INT cmd_setlocal (LPTSTR);
|
||||||
INT cmd_endlocal (LPTSTR);
|
INT cmd_endlocal (LPTSTR);
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,8 @@ typedef struct _SETLOCAL {
|
||||||
} SETLOCAL;
|
} SETLOCAL;
|
||||||
|
|
||||||
/* Create a copy of the current environment */
|
/* Create a copy of the current environment */
|
||||||
static LPTSTR DuplicateEnvironment()
|
LPTSTR
|
||||||
|
DuplicateEnvironment(VOID)
|
||||||
{
|
{
|
||||||
LPTSTR Environ = GetEnvironmentStrings();
|
LPTSTR Environ = GetEnvironmentStrings();
|
||||||
LPTSTR End, EnvironCopy;
|
LPTSTR End, EnvironCopy;
|
||||||
|
|
|
@ -49,9 +49,15 @@ INT cmd_start (LPTSTR Rest)
|
||||||
PROCESS_INFORMATION prci;
|
PROCESS_INFORMATION prci;
|
||||||
STARTUPINFO stui;
|
STARTUPINFO stui;
|
||||||
INT i = 0;
|
INT i = 0;
|
||||||
DWORD Priority = 0;
|
#ifdef UNICODE
|
||||||
|
DWORD dwCreationFlags = CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT;
|
||||||
|
#else
|
||||||
|
DWORD dwCreationFlags = CREATE_NEW_CONSOLE;
|
||||||
|
#endif
|
||||||
|
DWORD dwAffinityMask = 0;
|
||||||
LPTSTR lpTitle = NULL;
|
LPTSTR lpTitle = NULL;
|
||||||
LPTSTR lpDirectory = NULL;
|
LPTSTR lpDirectory = NULL;
|
||||||
|
LPTSTR lpEnvironment = NULL;
|
||||||
WORD wShowWindow = SW_SHOWNORMAL;
|
WORD wShowWindow = SW_SHOWNORMAL;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
|
@ -86,6 +92,11 @@ INT cmd_start (LPTSTR Rest)
|
||||||
}
|
}
|
||||||
StripQuotes(lpDirectory);
|
StripQuotes(lpDirectory);
|
||||||
}
|
}
|
||||||
|
else if (_totupper(*option) == _T('I'))
|
||||||
|
{
|
||||||
|
/* rest of the option is apparently ignored */
|
||||||
|
lpEnvironment = lpOriginalEnvironment;
|
||||||
|
}
|
||||||
else if (!_tcsicmp(option, _T("MIN")))
|
else if (!_tcsicmp(option, _T("MIN")))
|
||||||
{
|
{
|
||||||
wShowWindow = SW_MINIMIZE;
|
wShowWindow = SW_MINIMIZE;
|
||||||
|
@ -94,29 +105,58 @@ INT cmd_start (LPTSTR Rest)
|
||||||
{
|
{
|
||||||
wShowWindow = SW_MAXIMIZE;
|
wShowWindow = SW_MAXIMIZE;
|
||||||
}
|
}
|
||||||
|
else if (!_tcsicmp(option, _T("AFFINITY")))
|
||||||
|
{
|
||||||
|
TCHAR *end;
|
||||||
|
while (_istspace(*Rest))
|
||||||
|
Rest++;
|
||||||
|
option = GetParameter(&Rest);
|
||||||
|
/* Affinity mask is given in hexadecimal */
|
||||||
|
dwAffinityMask = _tcstoul(option, &end, 16);
|
||||||
|
if (*end != _T('\0') || dwAffinityMask == 0 ||
|
||||||
|
dwAffinityMask == (DWORD)-1)
|
||||||
|
{
|
||||||
|
ConErrResPrintf(STRING_ERROR_INVALID_PARAM_FORMAT, option);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
dwCreationFlags |= CREATE_SUSPENDED;
|
||||||
|
}
|
||||||
|
else if (!_tcsicmp(option, _T("B")))
|
||||||
|
{
|
||||||
|
dwCreationFlags &= ~CREATE_NEW_CONSOLE;
|
||||||
|
dwCreationFlags |= CREATE_NEW_PROCESS_GROUP;
|
||||||
|
}
|
||||||
else if (!_tcsicmp(option, _T("LOW")))
|
else if (!_tcsicmp(option, _T("LOW")))
|
||||||
{
|
{
|
||||||
Priority = IDLE_PRIORITY_CLASS;
|
dwCreationFlags |= IDLE_PRIORITY_CLASS;
|
||||||
}
|
}
|
||||||
else if (!_tcsicmp(option, _T("NORMAL")))
|
else if (!_tcsicmp(option, _T("NORMAL")))
|
||||||
{
|
{
|
||||||
Priority = NORMAL_PRIORITY_CLASS;
|
dwCreationFlags |= NORMAL_PRIORITY_CLASS;
|
||||||
}
|
}
|
||||||
else if (!_tcsicmp(option, _T("HIGH")))
|
else if (!_tcsicmp(option, _T("HIGH")))
|
||||||
{
|
{
|
||||||
Priority = HIGH_PRIORITY_CLASS;
|
dwCreationFlags |= HIGH_PRIORITY_CLASS;
|
||||||
}
|
}
|
||||||
else if (!_tcsicmp(option, _T("REALTIME")))
|
else if (!_tcsicmp(option, _T("REALTIME")))
|
||||||
{
|
{
|
||||||
Priority = REALTIME_PRIORITY_CLASS;
|
dwCreationFlags |= REALTIME_PRIORITY_CLASS;
|
||||||
}
|
}
|
||||||
else if (!_tcsicmp(option, _T("ABOVENORMAL")))
|
else if (!_tcsicmp(option, _T("ABOVENORMAL")))
|
||||||
{
|
{
|
||||||
Priority = ABOVE_NORMAL_PRIORITY_CLASS;
|
dwCreationFlags |= ABOVE_NORMAL_PRIORITY_CLASS;
|
||||||
}
|
}
|
||||||
else if (!_tcsicmp(option, _T("BELOWNORMAL")))
|
else if (!_tcsicmp(option, _T("BELOWNORMAL")))
|
||||||
{
|
{
|
||||||
Priority = BELOW_NORMAL_PRIORITY_CLASS;
|
dwCreationFlags |= BELOW_NORMAL_PRIORITY_CLASS;
|
||||||
|
}
|
||||||
|
else if (!_tcsicmp(option, _T("SEPARATE")))
|
||||||
|
{
|
||||||
|
dwCreationFlags |= CREATE_SEPARATE_WOW_VDM;
|
||||||
|
}
|
||||||
|
else if (!_tcsicmp(option, _T("SHARED")))
|
||||||
|
{
|
||||||
|
dwCreationFlags |= CREATE_SHARED_WOW_VDM;
|
||||||
}
|
}
|
||||||
else if (!_tcsicmp(option, _T("W")) ||
|
else if (!_tcsicmp(option, _T("W")) ||
|
||||||
!_tcsicmp(option, _T("WAIT")))
|
!_tcsicmp(option, _T("WAIT")))
|
||||||
|
@ -223,18 +263,18 @@ INT cmd_start (LPTSTR Rest)
|
||||||
stui.lpTitle = lpTitle;
|
stui.lpTitle = lpTitle;
|
||||||
stui.wShowWindow = wShowWindow;
|
stui.wShowWindow = wShowWindow;
|
||||||
|
|
||||||
if (bBat == TRUE)
|
bCreate = CreateProcess(bBat ? comspec : szFullName,
|
||||||
{
|
szFullCmdLine, NULL, NULL, TRUE, dwCreationFlags,
|
||||||
bCreate = CreateProcess (NULL, szFullCmdLine, NULL, NULL, FALSE,
|
lpEnvironment, lpDirectory, &stui, &prci);
|
||||||
CREATE_NEW_CONSOLE | Priority, NULL, lpDirectory, &stui, &prci);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bCreate = CreateProcess (szFullName, szFullCmdLine, NULL, NULL, FALSE,
|
|
||||||
CREATE_NEW_CONSOLE | Priority, NULL, lpDirectory, &stui, &prci);
|
|
||||||
}
|
|
||||||
if (bCreate)
|
if (bCreate)
|
||||||
|
{
|
||||||
|
if (dwAffinityMask)
|
||||||
|
{
|
||||||
|
SetProcessAffinityMask(prci.hProcess, dwAffinityMask);
|
||||||
|
ResumeThread(prci.hThread);
|
||||||
|
}
|
||||||
CloseHandle(prci.hThread);
|
CloseHandle(prci.hThread);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -246,8 +286,10 @@ INT cmd_start (LPTSTR Rest)
|
||||||
if (!bCreate)
|
if (!bCreate)
|
||||||
{
|
{
|
||||||
/* CreateProcess didn't work; try ShellExecute */
|
/* CreateProcess didn't work; try ShellExecute */
|
||||||
prci.hProcess = RunFile(SEE_MASK_NOCLOSEPROCESS, szFullName,
|
DWORD flags = SEE_MASK_NOCLOSEPROCESS;
|
||||||
param, lpDirectory, wShowWindow);
|
if (!(dwCreationFlags & CREATE_NEW_CONSOLE))
|
||||||
|
flags |= SEE_MASK_NO_CONSOLE;
|
||||||
|
prci.hProcess = RunFile(flags, szFullName, param, lpDirectory, wShowWindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prci.hProcess != NULL)
|
if (prci.hProcess != NULL)
|
||||||
|
|
Loading…
Reference in a new issue