Author: sir_richard Date: Wed Mar 10 04:32:17 2010 New Revision: 46047
URL: http://svn.reactos.org/svn/reactos?rev=46047&view=rev Log: [KERNEL32]: As indicated by the comment, kernel32 should always connect to the console server, even for non-console apps (the latter will just basically ignore the request). This is needed to (at minimum) setup the Ctrl-C handler, as otherwise, only "true console" apps will have a handler, even though internally, all apps have such a handler. This is what CSRSS needs to call internally for shutting down non-GUI apps, for example. (The default CTRL-C handler will just call ExitProcess).
Modified: trunk/reactos/dll/win32/kernel32/misc/console.c trunk/reactos/dll/win32/kernel32/misc/dllmain.c
Modified: trunk/reactos/dll/win32/kernel32/misc/console.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/con... ============================================================================== --- trunk/reactos/dll/win32/kernel32/misc/console.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/misc/console.c [iso-8859-1] Wed Mar 10 04:32:17 2010 @@ -39,6 +39,7 @@ WINAPI DefaultConsoleCtrlHandler(DWORD Event) { + DPRINT1("Default handler called: %lx\n", Event); switch(Event) { case CTRL_C_EVENT: @@ -75,7 +76,8 @@ DWORD nCode = CodeAndFlag & MAXLONG; UINT i; EXCEPTION_RECORD erException; - + + DPRINT1("Console Dispatcher Active: %lx %lx\n", CodeAndFlag, nCode); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
switch(nCode) @@ -152,6 +154,7 @@ (CodeAndFlag & MINLONG) && ((nCode == CTRL_LOGOFF_EVENT) || (nCode == CTRL_SHUTDOWN_EVENT))) { + DPRINT1("Skipping system/service apps\n"); break; }
@@ -172,7 +175,6 @@ }
RtlLeaveCriticalSection(&ConsoleLock); - ExitThread(nExitCode); }
Modified: trunk/reactos/dll/win32/kernel32/misc/dllmain.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/dll... ============================================================================== --- trunk/reactos/dll/win32/kernel32/misc/dllmain.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/misc/dllmain.c [iso-8859-1] Wed Mar 10 04:32:17 2010 @@ -128,6 +128,7 @@ CSR_API_MESSAGE Request; ULONG CsrRequest; NTSTATUS Status; + BOOLEAN NotConsole = FALSE; PRTL_USER_PROCESS_PARAMETERS Parameters = NtCurrentPeb()->ProcessParameters;
WCHAR lpTest[MAX_PATH]; @@ -143,39 +144,41 @@ { DPRINT("Image is not a console application\n"); Parameters->ConsoleHandle = NULL; - return TRUE; - } - - /* Assume one is needed */ - Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE; - - /* Handle the special flags given to us by BasepInitializeEnvironment */ - if (Parameters->ConsoleHandle == HANDLE_DETACHED_PROCESS) - { - /* No console to create */ - DPRINT("No console to create\n"); - Parameters->ConsoleHandle = NULL; Request.Data.AllocConsoleRequest.ConsoleNeeded = FALSE; } - else if (Parameters->ConsoleHandle == HANDLE_CREATE_NEW_CONSOLE) - { - /* We'll get the real one soon */ - DPRINT("Creating new console\n"); - Parameters->ConsoleHandle = NULL; - } - else if (Parameters->ConsoleHandle == HANDLE_CREATE_NO_WINDOW) - { - /* We'll get the real one soon */ - DPRINT1("NOT SUPPORTED: HANDLE_CREATE_NO_WINDOW\n"); - Parameters->ConsoleHandle = NULL; - } else { - if (Parameters->ConsoleHandle == INVALID_HANDLE_VALUE) - { - Parameters->ConsoleHandle = 0; - } - DPRINT("Using existing console: %x\n", Parameters->ConsoleHandle); + /* Assume one is needed */ + Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE; + + /* Handle the special flags given to us by BasepInitializeEnvironment */ + if (Parameters->ConsoleHandle == HANDLE_DETACHED_PROCESS) + { + /* No console to create */ + DPRINT("No console to create\n"); + Parameters->ConsoleHandle = NULL; + Request.Data.AllocConsoleRequest.ConsoleNeeded = FALSE; + } + else if (Parameters->ConsoleHandle == HANDLE_CREATE_NEW_CONSOLE) + { + /* We'll get the real one soon */ + DPRINT("Creating new console\n"); + Parameters->ConsoleHandle = NULL; + } + else if (Parameters->ConsoleHandle == HANDLE_CREATE_NO_WINDOW) + { + /* We'll get the real one soon */ + DPRINT1("NOT SUPPORTED: HANDLE_CREATE_NO_WINDOW\n"); + Parameters->ConsoleHandle = NULL; + } + else + { + if (Parameters->ConsoleHandle == INVALID_HANDLE_VALUE) + { + Parameters->ConsoleHandle = 0; + } + DPRINT("Using existing console: %x\n", Parameters->ConsoleHandle); + } }
/* Initialize Console Ctrl Handler */ @@ -185,7 +188,7 @@ NrCtrlHandlers = 1; CtrlHandlers = InitialHandler; CtrlHandlers[0] = DefaultConsoleCtrlHandler; - + /* Now use the proper console handle */ Request.Data.AllocConsoleRequest.Console = Parameters->ConsoleHandle;
@@ -194,9 +197,6 @@ * but we don't have one yet, so we will instead simply send a create * console message to the Base Server. When we finally have a Console * Server, this code should be changed to send connection data instead. - * - * Also note that this connection should be made for any console app, even - * in the case above where -we- return. */ CsrRequest = MAKE_CSR_API(ALLOC_CONSOLE, CSR_CONSOLE); Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher; @@ -210,6 +210,8 @@ /* We're lying here, so at least the process can load... */ return TRUE; } + + if (NotConsole) return TRUE;
/* We got the handles, let's set them */ if ((Parameters->ConsoleHandle = Request.Data.AllocConsoleRequest.Console))