Author: hbelusca
Date: Sun Apr 5 23:42:26 2015
New Revision: 67069
URL:
http://svn.reactos.org/svn/reactos?rev=67069&view=rev
Log:
[KERNEL32]
- Use the correct console critical section when setting console control handlers.
- Hold the console critical section in FreeConsole (so that we avoid freeing the console
while also running code in the console control dispatcher...).
Modified:
trunk/reactos/dll/win32/kernel32/client/console/console.c
Modified: trunk/reactos/dll/win32/kernel32/client/console/console.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/client/console/console.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/client/console/console.c [iso-8859-1] Sun Apr 5
23:42:26 2015
@@ -1346,15 +1346,19 @@
DECLSPEC_HOTPATCH
FreeConsole(VOID)
{
+ BOOL Success = TRUE;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_FREECONSOLE FreeConsoleRequest = &ApiMessage.Data.FreeConsoleRequest;
HANDLE ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ RtlEnterCriticalSection(&ConsoleLock);
+
/* We must have a non-trivial handle to close */
if (ConsoleHandle == NULL) // IsConsoleHandle(ConsoleHandle)
{
SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
+ Success = FALSE;
+ goto Quit;
}
/* Set up the data to send to the Console Server */
@@ -1370,7 +1374,8 @@
if (!NT_SUCCESS(ApiMessage.Status))
{
BaseSetLastNTError(ApiMessage.Status);
- return FALSE;
+ Success = FALSE;
+ goto Quit;
}
/* Reset the console handle */
@@ -1380,7 +1385,9 @@
CloseHandle(InputWaitHandle);
InputWaitHandle = INVALID_HANDLE_VALUE;
- return TRUE;
+Quit:
+ RtlLeaveCriticalSection(&ConsoleLock);
+ return Success;
}
@@ -2007,18 +2014,15 @@
{
BOOL Ret;
- RtlEnterCriticalSection(&BaseDllDirectoryLock);
+ RtlEnterCriticalSection(&ConsoleLock);
+
if (Add)
- {
Ret = AddConsoleCtrlHandler(HandlerRoutine);
- }
else
- {
Ret = RemoveConsoleCtrlHandler(HandlerRoutine);
- }
-
- RtlLeaveCriticalSection(&BaseDllDirectoryLock);
- return(Ret);
+
+ RtlLeaveCriticalSection(&ConsoleLock);
+ return Ret;
}