Author: jmorlan
Date: Sun Mar 29 23:17:45 2009
New Revision: 40289
URL:
http://svn.reactos.org/svn/reactos?rev=40289&view=rev
Log:
Make cmd able to (sort of) work without a console.
Modified:
trunk/reactos/base/shell/cmd/cmd.c
trunk/reactos/base/shell/cmd/cmd.h
trunk/reactos/base/shell/cmd/cmdinput.c
trunk/reactos/base/shell/cmd/console.c
Modified: trunk/reactos/base/shell/cmd/cmd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.c?rev=4…
==============================================================================
--- trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] Sun Mar 29 23:17:45 2009
@@ -164,7 +164,6 @@
OSVERSIONINFO osvi;
HANDLE hIn;
HANDLE hOut;
-HANDLE hConsole;
LPTSTR lpOriginalEnvironment;
HANDLE CMD_ModuleHandle;
@@ -1380,7 +1379,12 @@
}
}
- ReadCommand (readline, CMDLINE_LENGTH - 1);
+ if (!ReadCommand(readline, CMDLINE_LENGTH - 1))
+ {
+ bExit = TRUE;
+ return FALSE;
+ }
+
if (CheckCtrlBreak(BREAK_INPUT))
{
ConOutPuts(_T("\n"));
@@ -1805,6 +1809,7 @@
*/
int cmd_main (int argc, const TCHAR *argv[])
{
+ HANDLE hConsole;
TCHAR startPath[MAX_PATH];
CONSOLE_SCREEN_BUFFER_INFO Info;
INT nExitCode;
@@ -1821,12 +1826,16 @@
hConsole = CreateFile(_T("CONOUT$"), GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
- if (GetConsoleScreenBufferInfo(hConsole, &Info) == FALSE)
- {
- ConErrFormatMessage(GetLastError());
- return(1);
- }
- wDefColor = Info.wAttributes;
+ if (hConsole != INVALID_HANDLE_VALUE)
+ {
+ if (!GetConsoleScreenBufferInfo(hConsole, &Info))
+ {
+ ConErrFormatMessage(GetLastError());
+ return(1);
+ }
+ wDefColor = Info.wAttributes;
+ CloseHandle(hConsole);
+ }
InputCodePage= GetConsoleCP();
OutputCodePage = GetConsoleOutputCP();
Modified: trunk/reactos/base/shell/cmd/cmd.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.h?rev=4…
==============================================================================
--- trunk/reactos/base/shell/cmd/cmd.h [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cmd.h [iso-8859-1] Sun Mar 29 23:17:45 2009
@@ -53,7 +53,6 @@
/* global variables */
extern HANDLE hOut;
extern HANDLE hIn;
-extern HANDLE hConsole;
extern LPTSTR lpOriginalEnvironment;
extern WORD wColor;
extern WORD wDefColor;
@@ -120,7 +119,7 @@
/* Prototypes for CMDINPUT.C */
-VOID ReadCommand (LPTSTR, INT);
+BOOL ReadCommand (LPTSTR, INT);
/* Prototypes for CMDTABLE.C */
Modified: trunk/reactos/base/shell/cmd/cmdinput.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmdinput.c?…
==============================================================================
--- trunk/reactos/base/shell/cmd/cmdinput.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cmdinput.c [iso-8859-1] Sun Mar 29 23:17:45 2009
@@ -126,8 +126,9 @@
/* read in a command line */
-VOID ReadCommand (LPTSTR str, INT maxlen)
+BOOL ReadCommand (LPTSTR str, INT maxlen)
{
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
SHORT orgx; /* origin x/y */
SHORT orgy;
SHORT curx; /*current x/y cursor position*/
@@ -149,11 +150,30 @@
TCHAR PreviousChar;
#endif
+ if (!GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
+ {
+ /* No console */
+ HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
+ DWORD dwRead;
+ CHAR chr;
+ do
+ {
+ if (!ReadFile(hStdin, &chr, 1, &dwRead, NULL) || !dwRead)
+ return FALSE;
+#ifdef _UNICODE
+ MultiByteToWideChar(InputCodePage, 0, &chr, 1, &str[charcount++], 1);
+#endif
+ } while (chr != '\n' && charcount < maxlen);
+ str[charcount] = _T('\0');
+ return TRUE;
+ }
+
/* get screen size */
- GetScreenSize (&maxx, &maxy);
-
- GetCursorXY (&orgx, &orgy);
- GetCursorXY (&curx, &cury);
+ maxx = csbi.dwSize.X;
+ maxy = csbi.dwSize.Y;
+
+ curx = orgx = csbi.dwCursorPosition.X;
+ cury = orgy = csbi.dwCursorPosition.Y;
memset (str, 0, maxlen * sizeof (TCHAR));
@@ -590,4 +610,5 @@
/* expand all aliases */
ExpandAlias (str, maxlen);
#endif /* FEATURE_ALIAS */
+ return TRUE;
}
Modified: trunk/reactos/base/shell/cmd/console.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/console.c?r…
==============================================================================
--- trunk/reactos/base/shell/cmd/console.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/console.c [iso-8859-1] Sun Mar 29 23:17:45 2009
@@ -413,7 +413,7 @@
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
- GetConsoleScreenBufferInfo (hConsole, &csbi);
+ GetConsoleScreenBufferInfo (GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
*x = csbi.dwCursorPosition.X;
*y = csbi.dwCursorPosition.Y;
@@ -424,7 +424,7 @@
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
- GetConsoleScreenBufferInfo (hConsole, &csbi);
+ GetConsoleScreenBufferInfo (GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
return csbi.dwCursorPosition.X;
}
@@ -434,7 +434,7 @@
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
- GetConsoleScreenBufferInfo (hConsole, &csbi);
+ GetConsoleScreenBufferInfo (GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
return csbi.dwCursorPosition.Y;
}
@@ -444,7 +444,11 @@
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
- GetConsoleScreenBufferInfo (hConsole, &csbi);
+ if (!GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
+ {
+ csbi.dwSize.X = 80;
+ csbi.dwSize.Y = 25;
+ }
if (maxx)
*maxx = csbi.dwSize.X;