[ros-diffs] [jmorlan] 40289: Make cmd able to (sort of) work without a console.

jmorlan at svn.reactos.org jmorlan at svn.reactos.org
Sun Mar 29 21:17:46 CEST 2009


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=40289&r1=40288&r2=40289&view=diff
==============================================================================
--- 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=40289&r1=40288&r2=40289&view=diff
==============================================================================
--- 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?rev=40289&r1=40288&r2=40289&view=diff
==============================================================================
--- 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?rev=40289&r1=40288&r2=40289&view=diff
==============================================================================
--- 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;



More information about the Ros-diffs mailing list