Author: hbelusca Date: Sat Jul 6 19:47:53 2013 New Revision: 59435 URL: http://svn.reactos.org/svn/reactos?rev=59435&view=rev Log: [CONSRV] - Use a handle table for storing consoles. Now checking validity of console handles is done in O(1) instead of O(n) as before. I will see later on whether it would be good to have both a handle table and a linked list (which is removed here) for storing them (when condrv will be a real console driver, handles to consoles will be obtained as you would obtain usual handles to devices, etc... so that consoles will be internally stored in a linked list again). - Add a "dummy" frontend to have the possibility to adopt default actions when no frontend is attached to a console, and to always have a valid virtual table for them.
Added: trunk/reactos/win32ss/user/consrv/condrv/dummyfrontend.c (with props) Modified: trunk/reactos/win32ss/user/consrv/CMakeLists.txt trunk/reactos/win32ss/user/consrv/condrv/console.c trunk/reactos/win32ss/user/consrv/console.c trunk/reactos/win32ss/user/consrv/console.h trunk/reactos/win32ss/user/consrv/consrv.h trunk/reactos/win32ss/user/consrv/handle.c trunk/reactos/win32ss/user/consrv/include/conio.h trunk/reactos/win32ss/user/consrv/include/console.h trunk/reactos/win32ss/user/consrv/init.c trunk/reactos/win32ss/user/consrv/procinit.h Modified: trunk/reactos/win32ss/user/consrv/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/CMakeLists.txt?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/CMakeLists.txt [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/CMakeLists.txt [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -21,6 +21,7 @@ condrv/coninput.c condrv/conoutput.c condrv/console.c + condrv/dummyfrontend.c condrv/graphics.c condrv/text.c frontends/input.c Modified: trunk/reactos/win32ss/user/consrv/condrv/console.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/condrv/console.c?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/condrv/console.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/condrv/console.c [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -1,6 +1,6 @@ /* * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Console Server DLL + * PROJECT: ReactOS Console Driver DLL * FILE: win32ss/user/consrv/condrv/console.c * PURPOSE: Console Management Functions * PROGRAMMERS: Gé van Geldorp @@ -34,7 +34,8 @@ /* GLOBALS ********************************************************************/ -static LIST_ENTRY ConsoleList; /* The list of all the allocated consoles */ +static ULONG ConsoleListSize; +static PCONSOLE* ConsoleList; /* The list of all the allocated consoles */ static RTL_RESOURCE ListLock; #define ConDrvLockConsoleListExclusive() \ @@ -47,7 +48,7 @@ RtlReleaseResource(&ListLock) // Adapted from reactos/lib/rtl/unicode.c, RtlCreateUnicodeString line 2180 -BOOLEAN +static BOOLEAN ConsoleCreateUnicodeString(IN OUT PUNICODE_STRING UniDest, IN PCWSTR Source) { @@ -65,7 +66,7 @@ } // Adapted from reactos/lib/rtl/unicode.c, RtlFreeUnicodeString line 431 -VOID +static VOID ConsoleFreeUnicodeString(IN PUNICODE_STRING UnicodeString) { if (UnicodeString->Buffer) @@ -74,6 +75,129 @@ RtlZeroMemory(UnicodeString, sizeof(UNICODE_STRING)); } } + + +static NTSTATUS +InsertConsole(OUT PHANDLE Handle, + IN PCONSOLE Console) +{ +#define CONSOLE_HANDLES_INCREMENT 2 * 3 + + NTSTATUS Status = STATUS_SUCCESS; + ULONG i = 0; + PCONSOLE* Block; + + ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || + (ConsoleList != NULL && ConsoleListSize != 0) ); + + /* All went right, so add the console to the list */ + ConDrvLockConsoleListExclusive(); + DPRINT1("Insert in the list\n"); + + if (ConsoleList) + { + for (i = 0; i < ConsoleListSize; i++) + { + if (ConsoleList[i] == NULL) break; + } + } + + if (i >= ConsoleListSize) + { + DPRINT1("Creation of a new handles table\n"); + /* Allocate a new handles table */ + Block = ConsoleAllocHeap(HEAP_ZERO_MEMORY, + (ConsoleListSize + + CONSOLE_HANDLES_INCREMENT) * sizeof(PCONSOLE)); + if (Block == NULL) + { + Status = STATUS_UNSUCCESSFUL; + goto Quit; + } + + /* If we previously had a handles table, free it and use the new one */ + if (ConsoleList) + { + /* Copy the handles from the old table to the new one */ + RtlCopyMemory(Block, + ConsoleList, + ConsoleListSize * sizeof(PCONSOLE)); + ConsoleFreeHeap(ConsoleList); + } + ConsoleList = Block; + ConsoleListSize += CONSOLE_HANDLES_INCREMENT; + } + + ConsoleList[i] = Console; + *Handle = ULongToHandle((i << 2) | 0x3); + +Quit: + /* Unlock the console list and return status */ + ConDrvUnlockConsoleList(); + return Status; +} + +/* Unused */ +#if 0 +static NTSTATUS +RemoveConsoleByHandle(IN HANDLE Handle) +{ + NTSTATUS Status = STATUS_SUCCESS; + ULONG Index = HandleToULong(Handle) >> 2; + PCONSOLE Console; + + ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || + (ConsoleList != NULL && ConsoleListSize != 0) ); + + /* Remove the console from the list */ + ConDrvLockConsoleListExclusive(); + + if (Index >= ConsoleListSize || + (Console = ConsoleList[Index]) == NULL) + { + Status = STATUS_INVALID_HANDLE; + goto Quit; + } + + ConsoleList[Index] = NULL; + +Quit: + /* Unlock the console list and return status */ + ConDrvUnlockConsoleList(); + return Status; +} +#endif + +static NTSTATUS +RemoveConsoleByPointer(IN PCONSOLE Console) +{ + ULONG i = 0; + + if (!Console) return STATUS_INVALID_PARAMETER; + + ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || + (ConsoleList != NULL && ConsoleListSize != 0) ); + + /* Remove the console from the list */ + ConDrvLockConsoleListExclusive(); + + if (ConsoleList) + { + for (i = 0; i < ConsoleListSize; i++) + { + if (ConsoleList[i] == Console) ConsoleList[i] = NULL; + } + } + + /* Unlock the console list */ + ConDrvUnlockConsoleList(); + + return STATUS_SUCCESS; +} + + +/* For resetting the frontend - defined in dummyfrontend.c */ +VOID ResetFrontEnd(IN PCONSOLE Console); /* PRIVATE FUNCTIONS **********************************************************/ @@ -170,28 +294,6 @@ */ BOOLEAN NTAPI -ConDrvValidateConsolePointer(IN PCONSOLE Console) -{ - PLIST_ENTRY ConsoleEntry; - PCONSOLE CurrentConsole = NULL; - - if (!Console) return FALSE; - - /* The console list must be locked */ - // ASSERT(Console_list_locked); - - ConsoleEntry = ConsoleList.Flink; - while (ConsoleEntry != &ConsoleList) - { - CurrentConsole = CONTAINING_RECORD(ConsoleEntry, CONSOLE, Entry); - ConsoleEntry = ConsoleEntry->Flink; - if (CurrentConsole == Console) return TRUE; - } - - return FALSE; -} - -BOOLEAN NTAPI ConDrvValidateConsoleState(IN PCONSOLE Console, IN CONSOLE_STATE ExpectedState) { @@ -231,13 +333,18 @@ } BOOLEAN NTAPI -ConDrvValidateConsole(IN PCONSOLE Console, +ConDrvValidateConsole(OUT PCONSOLE* Console, + IN HANDLE ConsoleHandle, IN CONSOLE_STATE ExpectedState, IN BOOLEAN LockConsole) { BOOLEAN RetVal = FALSE; + ULONG Index = HandleToULong(ConsoleHandle) >> 2; + PCONSOLE ValidatedConsole; + if (!Console) return FALSE; + *Console = NULL; /* * Forbid creation or deletion of consoles when @@ -245,27 +352,46 @@ */ ConDrvLockConsoleListShared(); - if (ConDrvValidateConsolePointer(Console)) - { - RetVal = ConDrvValidateConsoleUnsafe(Console, - ExpectedState, - LockConsole); - } + if (Index >= ConsoleListSize || + (ValidatedConsole = ConsoleList[Index]) == NULL) + { + /* Unlock the console list */ + ConDrvUnlockConsoleList(); + + return FALSE; + } + + ValidatedConsole = ConsoleList[Index]; /* Unlock the console list and return */ ConDrvUnlockConsoleList(); + + RetVal = ConDrvValidateConsoleUnsafe(ValidatedConsole, + ExpectedState, + LockConsole); + if (RetVal) *Console = ValidatedConsole; + return RetVal; } NTSTATUS NTAPI -ConDrvGrabConsole(IN PCONSOLE Console, - IN BOOLEAN LockConsole) +ConDrvGetConsole(OUT PCONSOLE* Console, + IN HANDLE ConsoleHandle, + IN BOOLEAN LockConsole) { NTSTATUS Status = STATUS_INVALID_HANDLE; - - if (ConDrvValidateConsole(Console, CONSOLE_RUNNING, LockConsole)) - { - InterlockedIncrement(&Console->ReferenceCount); + PCONSOLE GrabConsole; + + if (Console == NULL) return STATUS_INVALID_PARAMETER; + *Console = NULL; + + if (ConDrvValidateConsole(&GrabConsole, + ConsoleHandle, + CONSOLE_RUNNING, + LockConsole)) + { + InterlockedIncrement(&GrabConsole->ReferenceCount); + *Console = GrabConsole; Status = STATUS_SUCCESS; } @@ -309,15 +435,16 @@ DPRINT("CONSRV: ConDrvInitConsoleSupport()\n"); /* Initialize the console list and its lock */ - InitializeListHead(&ConsoleList); + ConsoleListSize = 0; + ConsoleList = NULL; RtlInitializeResource(&ListLock); /* Should call LoadKeyboardLayout */ } - NTSTATUS NTAPI -ConDrvInitConsole(OUT PCONSOLE* NewConsole, +ConDrvInitConsole(OUT PHANDLE NewConsoleHandle, + OUT PCONSOLE* NewConsole, IN PCONSOLE_INFO ConsoleInfo, IN ULONG ConsoleLeaderProcessId) { @@ -325,13 +452,15 @@ SECURITY_ATTRIBUTES SecurityAttributes; // CONSOLE_INFO CapturedConsoleInfo; TEXTMODE_BUFFER_INFO ScreenBufferInfo; + HANDLE ConsoleHandle; PCONSOLE Console; PCONSOLE_SCREEN_BUFFER NewBuffer; // WCHAR DefaultTitle[128]; - if (NewConsole == NULL || ConsoleInfo == NULL) + if (NewConsoleHandle == NULL || NewConsole == NULL || ConsoleInfo == NULL) return STATUS_INVALID_PARAMETER; - + + *NewConsoleHandle = NULL; *NewConsole = NULL; /* @@ -409,7 +538,9 @@ Console->ReferenceCount = 0; InitializeCriticalSection(&Console->Lock); InitializeListHead(&Console->ProcessList); - RtlZeroMemory(&Console->TermIFace, sizeof(Console->TermIFace)); + + /* Initialize the frontend interface */ + ResetFrontEnd(Console); memcpy(Console->Colors, ConsoleInfo->Colors, sizeof(ConsoleInfo->Colors)); Console->ConsoleSize = ConsoleInfo->ConsoleSize; @@ -511,9 +642,13 @@ DPRINT("Console initialized\n"); /* All went right, so add the console to the list */ - ConDrvLockConsoleListExclusive(); - DPRINT("Insert in the list\n"); - InsertTailList(&ConsoleList, &Console->Entry); + Status = InsertConsole(&ConsoleHandle, Console); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + ConDrvDeleteConsole(Console); + return Status; + } /* The initialization is finished */ DPRINT("Change state\n"); @@ -522,11 +657,9 @@ /* Unlock the console */ // LeaveCriticalSection(&Console->Lock); - /* Unlock the console list */ - ConDrvUnlockConsoleList(); - /* Return the newly created console to the caller and a success code too */ - *NewConsole = Console; + *NewConsoleHandle = ConsoleHandle; + *NewConsole = Console; return STATUS_SUCCESS; } @@ -557,7 +690,7 @@ /* We failed, detach the frontend from the console */ FrontEnd->Console = NULL; // For the caller - RtlZeroMemory(&Console->TermIFace, sizeof(Console->TermIFace)); + ResetFrontEnd(Console); return Status; } @@ -581,8 +714,11 @@ /* Deinitialize the frontend BEFORE detaching it from the console */ Console->TermIFace.Vtbl->DeinitFrontEnd(&Console->TermIFace/*, Console*/); - /* Detach the frontend from the console */ - RtlZeroMemory(&Console->TermIFace, sizeof(Console->TermIFace)); + /* + * Detach the frontend from the console: + * reinitialize the frontend interface. + */ + ResetFrontEnd(Console); DPRINT("Terminal FrontEnd unregistered\n"); return STATUS_SUCCESS; @@ -599,19 +735,12 @@ */ ConDrvLockConsoleListExclusive(); - /* Check the existence of the console, and if it's ok, continue */ - if (!ConDrvValidateConsolePointer(Console)) - { - /* Unlock the console list and return */ - ConDrvUnlockConsoleList(); - return; - } - - /* - * If the console is already being destroyed - * (thus not running), just return. - */ - if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) + /* + * If the console is already being destroyed, i.e. not running + * or finishing to be initialized, just return. + */ + if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE) && + !ConDrvValidateConsoleUnsafe(Console, CONSOLE_INITIALIZING, TRUE)) { /* Unlock the console list and return */ ConDrvUnlockConsoleList(); @@ -651,29 +780,21 @@ ConDrvLockConsoleListExclusive(); - /* Re-check the existence of the console, and if it's ok, continue */ - if (!ConDrvValidateConsolePointer(Console)) - { - /* Unlock the console list and return */ + if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_TERMINATING, TRUE)) + { ConDrvUnlockConsoleList(); return; } - if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_TERMINATING, TRUE)) - { - ConDrvUnlockConsoleList(); - return; - } - /* We are now in destruction */ Console->State = CONSOLE_IN_DESTRUCTION; - /* Remove the console from the list */ - RemoveEntryList(&Console->Entry); - /* We really delete the console. Reset the count to be sure. */ Console->ReferenceCount = 0; + /* Remove the console from the list */ + RemoveConsoleByPointer(Console); + /* Discard all entries in the input event queue */ PurgeInputBuffer(Console); @@ -683,6 +804,7 @@ HistoryDeleteBuffers(Console); ConioDeleteScreenBuffer(Console->ActiveBuffer); + Console->ActiveBuffer = NULL; if (!IsListEmpty(&Console->BufferList)) { DPRINT1("BUG: screen buffer list not empty\n"); @@ -709,7 +831,7 @@ } -/* PUBLIC SERVER APIS *********************************************************/ +/* PUBLIC DRIVER APIS *********************************************************/ NTSTATUS NTAPI ConDrvGetConsoleMode(IN PCONSOLE Console, @@ -953,7 +1075,7 @@ PCONSOLE_PROCESS_DATA current; /* If the console is already being destroyed, just return */ - if (!ConDrvValidateConsole(Console, CONSOLE_RUNNING, FALSE)) + if (!ConDrvValidateConsoleState(Console, CONSOLE_RUNNING)) return STATUS_UNSUCCESSFUL; /* Added: trunk/reactos/win32ss/user/consrv/condrv/dummyfrontend.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/condrv/dummyfrontend.c?rev=59435 ============================================================================== --- trunk/reactos/win32ss/user/consrv/condrv/dummyfrontend.c (added) +++ trunk/reactos/win32ss/user/consrv/condrv/dummyfrontend.c [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -0,0 +1,185 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Console Server DLL + * FILE: win32ss/user/consrv/condrv/dummyfrontend.c + * PURPOSE: Dummy Terminal Front-End used when no frontend + * is attached to the specified console. + * PROGRAMMERS: Hermes Belusca-Maito (hermes.belu...@sfr.fr) + */ + +/* INCLUDES *******************************************************************/ + +#include "consrv.h" +#include "include/conio.h" + + +/* DUMMY FRONTEND INTERFACE ***************************************************/ + +static NTSTATUS NTAPI +DummyInitFrontEnd(IN OUT PFRONTEND This, + IN PCONSOLE Console) +{ + /* Load some settings ?? */ + return STATUS_SUCCESS; +} + +static VOID NTAPI +DummyDeinitFrontEnd(IN OUT PFRONTEND This) +{ + /* Free some settings ?? */ +} + +static VOID NTAPI +DummyDrawRegion(IN OUT PFRONTEND This, + SMALL_RECT* Region) +{ +} + +static VOID NTAPI +DummyWriteStream(IN OUT PFRONTEND This, + SMALL_RECT* Region, + SHORT CursorStartX, + SHORT CursorStartY, + UINT ScrolledLines, + PWCHAR Buffer, + UINT Length) +{ +} + +static BOOL NTAPI +DummySetCursorInfo(IN OUT PFRONTEND This, + PCONSOLE_SCREEN_BUFFER Buff) +{ + return TRUE; +} + +static BOOL NTAPI +DummySetScreenInfo(IN OUT PFRONTEND This, + PCONSOLE_SCREEN_BUFFER Buff, + SHORT OldCursorX, + SHORT OldCursorY) +{ + return TRUE; +} + +static VOID NTAPI +DummyResizeTerminal(IN OUT PFRONTEND This) +{ +} + +static BOOL NTAPI +DummyProcessKeyCallback(IN OUT PFRONTEND This, + MSG* msg, + BYTE KeyStateMenu, + DWORD ShiftState, + UINT VirtualKeyCode, + BOOL Down) +{ + return FALSE; +} + +static VOID NTAPI +DummyRefreshInternalInfo(IN OUT PFRONTEND This) +{ +} + +static VOID NTAPI +DummyChangeTitle(IN OUT PFRONTEND This) +{ +} + +static BOOL NTAPI +DummyChangeIcon(IN OUT PFRONTEND This, + HICON hWindowIcon) +{ + return TRUE; +} + +static HWND NTAPI +DummyGetConsoleWindowHandle(IN OUT PFRONTEND This) +{ + return NULL; +} + +static VOID NTAPI +DummyGetLargestConsoleWindowSize(IN OUT PFRONTEND This, + PCOORD pSize) +{ +} + +static ULONG NTAPI +DummyGetDisplayMode(IN OUT PFRONTEND This) +{ + return 0; +} + +static BOOL NTAPI +DummySetDisplayMode(IN OUT PFRONTEND This, + ULONG NewMode) +{ + return TRUE; +} + +static INT NTAPI +DummyShowMouseCursor(IN OUT PFRONTEND This, + BOOL Show) +{ + return 0; +} + +static BOOL NTAPI +DummySetMouseCursor(IN OUT PFRONTEND This, + HCURSOR hCursor) +{ + return TRUE; +} + +static HMENU NTAPI +DummyMenuControl(IN OUT PFRONTEND This, + UINT cmdIdLow, + UINT cmdIdHigh) +{ + return NULL; +} + +static BOOL NTAPI +DummySetMenuClose(IN OUT PFRONTEND This, + BOOL Enable) +{ + return TRUE; +} + +static FRONTEND_VTBL DummyVtbl = +{ + DummyInitFrontEnd, + DummyDeinitFrontEnd, + DummyDrawRegion, + DummyWriteStream, + DummySetCursorInfo, + DummySetScreenInfo, + DummyResizeTerminal, + DummyProcessKeyCallback, + DummyRefreshInternalInfo, + DummyChangeTitle, + DummyChangeIcon, + DummyGetConsoleWindowHandle, + DummyGetLargestConsoleWindowSize, + DummyGetDisplayMode, + DummySetDisplayMode, + DummyShowMouseCursor, + DummySetMouseCursor, + DummyMenuControl, + DummySetMenuClose, +}; + +VOID +ResetFrontEnd(IN PCONSOLE Console) +{ + if (!Console) return; + + /* Reinitialize the frontend interface */ + RtlZeroMemory(&Console->TermIFace, sizeof(Console->TermIFace)); + Console->TermIFace.Vtbl = &DummyVtbl; +} + +/* EOF */ Propchange: trunk/reactos/win32ss/user/consrv/condrv/dummyfrontend.c ------------------------------------------------------------------------------ svn:eol-style = native Modified: trunk/reactos/win32ss/user/consrv/console.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/console.c?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/console.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/console.c [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -147,9 +147,8 @@ *Console = NULL; // RtlEnterCriticalSection(&ProcessData->HandleTableLock); - ProcessConsole = ProcessData->Console; - - Status = ConDrvGrabConsole(ProcessConsole, LockConsole); + + Status = ConDrvGetConsole(&ProcessConsole, ProcessData->ConsoleHandle, LockConsole); if (NT_SUCCESS(Status)) *Console = ProcessConsole; // RtlLeaveCriticalSection(&ProcessData->HandleTableLock); @@ -166,11 +165,13 @@ NTSTATUS WINAPI -ConSrvInitConsole(OUT PCONSOLE* NewConsole, +ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, + OUT PCONSOLE* NewConsole, IN OUT PCONSOLE_START_INFO ConsoleStartInfo, IN ULONG ConsoleLeaderProcessId) { NTSTATUS Status; + HANDLE ConsoleHandle; PCONSOLE Console; CONSOLE_INFO ConsoleInfo; SIZE_T Length = 0; @@ -266,7 +267,10 @@ ConsoleInfo.CodePage = GetOEMCP(); /******************************************************************************/ - Status = ConDrvInitConsole(&Console, &ConsoleInfo, ConsoleLeaderProcessId); + Status = ConDrvInitConsole(&ConsoleHandle, + &Console, + &ConsoleInfo, + ConsoleLeaderProcessId); if (!NT_SUCCESS(Status)) { DPRINT1("Creating a new console failed, Status = 0x%08lx\n", Status); @@ -288,7 +292,8 @@ DPRINT("FrontEnd registered\n"); /* Return the newly created console to the caller and a success code too */ - *NewConsole = Console; + *NewConsoleHandle = ConsoleHandle; + *NewConsole = Console; return STATUS_SUCCESS; } @@ -311,7 +316,7 @@ PCSR_PROCESS CsrProcess = CsrGetClientThread()->Process; PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrProcess); - if (ProcessData->Console != NULL) + if (ProcessData->ConsoleHandle != NULL) { DPRINT1("Process already has a console\n"); return STATUS_ACCESS_DENIED; @@ -337,16 +342,12 @@ return Status; } - /* Return it to the caller */ - AllocConsoleRequest->Console = ProcessData->Console; - - /* Input Wait Handle */ + /* Return the console handle and the input wait handle to the caller */ + AllocConsoleRequest->ConsoleHandle = ProcessData->ConsoleHandle; AllocConsoleRequest->InputWaitHandle = ProcessData->ConsoleEvent; - /* Set the Property Dialog Handler */ + /* Set the Property-Dialog and Control-Dispatcher handlers */ ProcessData->PropDispatcher = AllocConsoleRequest->PropDispatcher; - - /* Set the Ctrl Dispatcher */ ProcessData->CtrlDispatcher = AllocConsoleRequest->CtrlDispatcher; return STATUS_SUCCESS; @@ -363,7 +364,7 @@ TargetProcessData = ConsoleGetPerProcessData(TargetProcess); - if (TargetProcessData->Console != NULL) + if (TargetProcessData->ConsoleHandle != NULL) { DPRINT1("Process already has a console\n"); return STATUS_ACCESS_DENIED; @@ -396,7 +397,7 @@ SourceProcessData = ConsoleGetPerProcessData(SourceProcess); - if (SourceProcessData->Console == NULL) + if (SourceProcessData->ConsoleHandle == NULL) { Status = STATUS_INVALID_HANDLE; goto Quit; @@ -407,7 +408,7 @@ * if any, otherwise return an error. */ Status = ConSrvInheritConsole(TargetProcessData, - SourceProcessData->Console, + SourceProcessData->ConsoleHandle, TRUE, &AttachConsoleRequest->InputHandle, &AttachConsoleRequest->OutputHandle, @@ -418,16 +419,12 @@ goto Quit; } - /* Return it to the caller */ - AttachConsoleRequest->Console = TargetProcessData->Console; - - /* Input Wait Handle */ + /* Return the console handle and the input wait handle to the caller */ + AttachConsoleRequest->ConsoleHandle = TargetProcessData->ConsoleHandle; AttachConsoleRequest->InputWaitHandle = TargetProcessData->ConsoleEvent; - /* Set the Property Dialog Handler */ + /* Set the Property-Dialog and Control-Dispatcher handlers */ TargetProcessData->PropDispatcher = AttachConsoleRequest->PropDispatcher; - - /* Set the Ctrl Dispatcher */ TargetProcessData->CtrlDispatcher = AttachConsoleRequest->CtrlDispatcher; Status = STATUS_SUCCESS; Modified: trunk/reactos/win32ss/user/consrv/console.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/console.h?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/console.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/console.h [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -8,11 +8,12 @@ #pragma once -VOID NTAPI -ConDrvInitConsoleSupport(VOID); +// FIXME: Fix compilation +struct _CONSOLE; NTSTATUS WINAPI -ConSrvInitConsole(OUT struct _CONSOLE** /* PCONSOLE* */ NewConsole, +ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, + OUT struct _CONSOLE** /* PCONSOLE* */ NewConsole, IN OUT PCONSOLE_START_INFO ConsoleStartInfo, IN ULONG ConsoleLeaderProcessId); VOID WINAPI ConSrvDeleteConsole(struct _CONSOLE* /* PCONSOLE */ Console); @@ -23,29 +24,4 @@ VOID FASTCALL ConSrvReleaseConsole(struct _CONSOLE* /* PCONSOLE */ Console, BOOL WasConsoleLocked); -/******************************************************************************/ - -NTSTATUS NTAPI -ConDrvGrabConsole(IN struct _CONSOLE* /* PCONSOLE */ Console, - IN BOOLEAN LockConsole); -VOID NTAPI -ConDrvReleaseConsole(IN struct _CONSOLE* /* PCONSOLE */ Console, - IN BOOLEAN WasConsoleLocked); - -typedef struct _FRONTEND FRONTEND, *PFRONTEND; -typedef struct _CONSOLE_INFO CONSOLE_INFO, *PCONSOLE_INFO; - -NTSTATUS NTAPI -ConDrvInitConsole(OUT struct _CONSOLE** /* PCONSOLE* */ NewConsole, - // IN OUT PCONSOLE_START_INFO ConsoleStartInfo, - IN PCONSOLE_INFO ConsoleInfo, - IN ULONG ConsoleLeaderProcessId); -NTSTATUS NTAPI -ConDrvRegisterFrontEnd(IN struct _CONSOLE* /* PCONSOLE */ Console, - IN PFRONTEND FrontEnd); -NTSTATUS NTAPI -ConDrvDeregisterFrontEnd(IN struct _CONSOLE* /* PCONSOLE */ Console); -VOID NTAPI -ConDrvDeleteConsole(IN struct _CONSOLE* /* PCONSOLE */ Console); - /* EOF */ Modified: trunk/reactos/win32ss/user/consrv/consrv.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/consrv.h?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/consrv.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/consrv.h [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -60,8 +60,9 @@ LIST_ENTRY ConsoleLink; PCSR_PROCESS Process; // Process owning this structure. HANDLE ConsoleEvent; - struct _CONSOLE* /* PCONSOLE */ Console; - struct _CONSOLE* /* PCONSOLE */ ParentConsole; + + HANDLE ConsoleHandle; + HANDLE ParentConsoleHandle; BOOL ConsoleApp; // TRUE if it is a CUI app, FALSE otherwise. Modified: trunk/reactos/win32ss/user/consrv/handle.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/handle.c?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/handle.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/handle.c [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -135,6 +135,7 @@ static NTSTATUS ConSrvInitHandlesTable(IN OUT PCONSOLE_PROCESS_DATA ProcessData, + IN PCONSOLE Console, OUT PHANDLE pInputHandle, OUT PHANDLE pOutputHandle, OUT PHANDLE pErrorHandle) @@ -157,7 +158,7 @@ /* Insert the Input handle */ Status = ConSrvInsertObject(ProcessData, &InputHandle, - &ProcessData->Console->InputBuffer.Header, + &Console->InputBuffer.Header, GENERIC_READ | GENERIC_WRITE, TRUE, FILE_SHARE_READ | FILE_SHARE_WRITE); @@ -172,7 +173,7 @@ /* Insert the Output handle */ Status = ConSrvInsertObject(ProcessData, &OutputHandle, - &ProcessData->Console->ActiveBuffer->Header, + &Console->ActiveBuffer->Header, GENERIC_READ | GENERIC_WRITE, TRUE, FILE_SHARE_READ | FILE_SHARE_WRITE); @@ -187,7 +188,7 @@ /* Insert the Error handle */ Status = ConSrvInsertObject(ProcessData, &ErrorHandle, - &ProcessData->Console->ActiveBuffer->Header, + &Console->ActiveBuffer->Header, GENERIC_READ | GENERIC_WRITE, TRUE, FILE_SHARE_READ | FILE_SHARE_WRITE); @@ -270,12 +271,12 @@ ULONG i; /* - * ProcessData->Console is NULL (and the assertion fails) when + * ProcessData->ConsoleHandle is NULL (and the assertion fails) when * ConSrvFreeHandlesTable is called in ConSrvConnect during the * allocation of a new console. */ - // ASSERT(ProcessData->Console); - if (ProcessData->Console != NULL) + // ASSERT(ProcessData->ConsoleHandle); + if (ProcessData->ConsoleHandle != NULL) { /* Close all the console handles */ for (i = 0; i < ProcessData->HandleTableSize; i++) @@ -380,22 +381,22 @@ ConSrvRemoveObject(PCONSOLE_PROCESS_DATA ProcessData, HANDLE Handle) { - ULONG_PTR h = (ULONG_PTR)Handle >> 2; + ULONG Index = HandleToULong(Handle) >> 2; PCONSOLE_IO_OBJECT Object; RtlEnterCriticalSection(&ProcessData->HandleTableLock); ASSERT(ProcessData->HandleTable); - if (h >= ProcessData->HandleTableSize || - (Object = ProcessData->HandleTable[h].Object) == NULL) + if (Index >= ProcessData->HandleTableSize || + (Object = ProcessData->HandleTable[Index].Object) == NULL) { RtlLeaveCriticalSection(&ProcessData->HandleTableLock); return STATUS_INVALID_HANDLE; } - ASSERT(ProcessData->Console); - ConSrvCloseHandleEntry(&ProcessData->HandleTable[h]); + ASSERT(ProcessData->ConsoleHandle); + ConSrvCloseHandleEntry(&ProcessData->HandleTable[Index]); RtlLeaveCriticalSection(&ProcessData->HandleTableLock); return STATUS_SUCCESS; @@ -411,9 +412,11 @@ BOOL LockConsole, CONSOLE_IO_OBJECT_TYPE Type) { - ULONG_PTR h = (ULONG_PTR)Handle >> 2; + // NTSTATUS Status; + ULONG Index = HandleToULong(Handle) >> 2; PCONSOLE_IO_HANDLE HandleEntry = NULL; PCONSOLE_IO_OBJECT ObjectEntry = NULL; + // PCONSOLE ObjectConsole; ASSERT(Object); if (Entry) *Entry = NULL; @@ -423,9 +426,9 @@ RtlEnterCriticalSection(&ProcessData->HandleTableLock); if ( IsConsoleHandle(Handle) && - h < ProcessData->HandleTableSize ) - { - HandleEntry = &ProcessData->HandleTable[h]; + Index < ProcessData->HandleTableSize ) + { + HandleEntry = &ProcessData->HandleTable[Index]; ObjectEntry = HandleEntry->Object; } @@ -444,7 +447,9 @@ RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - if (ConDrvValidateConsole(ObjectEntry->Console, CONSOLE_RUNNING, LockConsole)) + // Status = ConDrvGetConsole(&ObjectConsole, ProcessData->ConsoleHandle, LockConsole); + // if (NT_SUCCESS(Status)) + if (ConDrvValidateConsoleUnsafe(ObjectEntry->Console, CONSOLE_RUNNING, LockConsole)) { _InterlockedIncrement(&ObjectEntry->Console->ReferenceCount); @@ -479,6 +484,8 @@ PCONSOLE_START_INFO ConsoleStartInfo) { NTSTATUS Status = STATUS_SUCCESS; + HANDLE ConsoleHandle; + PCONSOLE Console; /* * We are about to create a new console. However when ConSrvNewProcess @@ -493,7 +500,8 @@ ConSrvFreeHandlesTable(ProcessData); /* Initialize a new Console owned by this process */ - Status = ConSrvInitConsole(&ProcessData->Console, + Status = ConSrvInitConsole(&ConsoleHandle, + &Console, ConsoleStartInfo, HandleToUlong(ProcessData->Process->ClientId.UniqueProcess)); if (!NT_SUCCESS(Status)) @@ -502,22 +510,26 @@ return Status; } + /* Assign the new console handle */ + ProcessData->ConsoleHandle = ConsoleHandle; + /* Initialize the handles table */ Status = ConSrvInitHandlesTable(ProcessData, + Console, pInputHandle, pOutputHandle, pErrorHandle); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to initialize the handles table\n"); - ConSrvDeleteConsole(ProcessData->Console); - ProcessData->Console = NULL; + ConSrvDeleteConsole(Console); + ProcessData->ConsoleHandle = NULL; return Status; } /* Duplicate the Input Event */ Status = NtDuplicateObject(NtCurrentProcess(), - ProcessData->Console->InputBuffer.ActiveEvent, + Console->InputBuffer.ActiveEvent, ProcessData->Process->ProcessHandle, &ProcessData->ConsoleEvent, EVENT_ALL_ACCESS, 0, 0); @@ -525,19 +537,19 @@ { DPRINT1("NtDuplicateObject() failed: %lu\n", Status); ConSrvFreeHandlesTable(ProcessData); - ConSrvDeleteConsole(ProcessData->Console); - ProcessData->Console = NULL; + ConSrvDeleteConsole(Console); + ProcessData->ConsoleHandle = NULL; return Status; } /* Insert the process into the processes list of the console */ - InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ConsoleLink); + InsertHeadList(&Console->ProcessList, &ProcessData->ConsoleLink); /* Add a reference count because the process is tied to the console */ - _InterlockedIncrement(&ProcessData->Console->ReferenceCount); + _InterlockedIncrement(&Console->ReferenceCount); /* Update the internal info of the terminal */ - ConioRefreshInternalInfo(ProcessData->Console); + ConioRefreshInternalInfo(Console); return STATUS_SUCCESS; } @@ -545,23 +557,26 @@ NTSTATUS FASTCALL ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData, - PCONSOLE Console, + HANDLE ConsoleHandle, BOOL CreateNewHandlesTable, PHANDLE pInputHandle, PHANDLE pOutputHandle, PHANDLE pErrorHandle) { NTSTATUS Status = STATUS_SUCCESS; + PCONSOLE Console; /* Validate and lock the console */ - if (!ConDrvValidateConsole(Console, CONSOLE_RUNNING, TRUE)) + if (!ConDrvValidateConsole(&Console, + ConsoleHandle, + CONSOLE_RUNNING, TRUE)) { // FIXME: Find another status code return STATUS_UNSUCCESSFUL; } /* Inherit the console */ - ProcessData->Console = Console; + ProcessData->ConsoleHandle = ConsoleHandle; if (CreateNewHandlesTable) { @@ -579,20 +594,21 @@ /* Initialize the handles table */ Status = ConSrvInitHandlesTable(ProcessData, + Console, pInputHandle, pOutputHandle, pErrorHandle); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to initialize the handles table\n"); - ProcessData->Console = NULL; + ProcessData->ConsoleHandle = NULL; goto Quit; } } /* Duplicate the Input Event */ Status = NtDuplicateObject(NtCurrentProcess(), - ProcessData->Console->InputBuffer.ActiveEvent, + Console->InputBuffer.ActiveEvent, ProcessData->Process->ProcessHandle, &ProcessData->ConsoleEvent, EVENT_ALL_ACCESS, 0, 0); @@ -600,18 +616,18 @@ { DPRINT1("NtDuplicateObject() failed: %lu\n", Status); ConSrvFreeHandlesTable(ProcessData); // NOTE: Always free the handles table. - ProcessData->Console = NULL; + ProcessData->ConsoleHandle = NULL; goto Quit; } /* Insert the process into the processes list of the console */ - InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ConsoleLink); + InsertHeadList(&Console->ProcessList, &ProcessData->ConsoleLink); /* Add a reference count because the process is tied to the console */ - _InterlockedIncrement(&ProcessData->Console->ReferenceCount); + _InterlockedIncrement(&Console->ReferenceCount); /* Update the internal info of the terminal */ - ConioRefreshInternalInfo(ProcessData->Console); + ConioRefreshInternalInfo(Console); Status = STATUS_SUCCESS; @@ -625,14 +641,16 @@ FASTCALL ConSrvRemoveConsole(PCONSOLE_PROCESS_DATA ProcessData) { - PCONSOLE Console = ProcessData->Console; + PCONSOLE Console; DPRINT("ConSrvRemoveConsole\n"); // RtlEnterCriticalSection(&ProcessData->HandleTableLock); /* Validate and lock the console */ - if (ConDrvValidateConsole(Console, CONSOLE_RUNNING, TRUE)) + if (ConDrvValidateConsole(&Console, + ProcessData->ConsoleHandle, + CONSOLE_RUNNING, TRUE)) { DPRINT("ConSrvRemoveConsole - Locking OK\n"); @@ -640,7 +658,7 @@ ConSrvFreeHandlesTable(ProcessData); /* Detach the process from the console */ - ProcessData->Console = NULL; + ProcessData->ConsoleHandle = NULL; /* Remove ourselves from the console's list of processes */ RemoveEntryList(&ProcessData->ConsoleLink); @@ -650,7 +668,7 @@ /* Release the console */ DPRINT("ConSrvRemoveConsole - Decrement Console->ReferenceCount = %lu\n", Console->ReferenceCount); - ConSrvReleaseConsole(Console, TRUE); + ConDrvReleaseConsole(Console, TRUE); //CloseHandle(ProcessData->ConsoleEvent); //ProcessData->ConsoleEvent = NULL; } @@ -752,7 +770,7 @@ PCONSOLE Console; HANDLE ConsoleHandle = VerifyHandleRequest->ConsoleHandle; - ULONG_PTR Index = (ULONG_PTR)ConsoleHandle >> 2; + ULONG Index = HandleToULong(ConsoleHandle) >> 2; Status = ConSrvGetConsole(ProcessData, &Console, TRUE); if (!NT_SUCCESS(Status)) @@ -785,7 +803,7 @@ PCONSOLE Console; HANDLE ConsoleHandle = DuplicateHandleRequest->ConsoleHandle; - ULONG_PTR Index = (ULONG_PTR)ConsoleHandle >> 2; + ULONG Index = HandleToULong(ConsoleHandle) >> 2; PCONSOLE_IO_HANDLE Entry; DWORD DesiredAccess; Modified: trunk/reactos/win32ss/user/consrv/include/conio.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/include/conio.h?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/include/conio.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/include/conio.h [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -270,13 +270,12 @@ CRITICAL_SECTION Lock; CONSOLE_STATE State; /* State of the console */ - LIST_ENTRY Entry; /* Entry in the list of consoles */ LIST_ENTRY ProcessList; /* List of processes owning the console. The first one is the so-called "Console Leader Process" */ FRONTEND TermIFace; /* Frontend-specific interface */ /**************************** Input buffer and data ***************************/ - CONSOLE_INPUT_BUFFER InputBuffer; /* Input buffer of the console */ + CONSOLE_INPUT_BUFFER InputBuffer; /* Input buffer of the console */ /** Put those things in TEXTMODE_SCREEN_BUFFER ?? **/ PWCHAR LineBuffer; /* Current line being input, in line buffered mode */ Modified: trunk/reactos/win32ss/user/consrv/include/console.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/include/console.h?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/include/console.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/include/console.h [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -8,8 +8,23 @@ #pragma once -BOOLEAN NTAPI -ConDrvValidateConsolePointer(IN PCONSOLE Console); +VOID NTAPI +ConDrvInitConsoleSupport(VOID); + +NTSTATUS NTAPI +ConDrvInitConsole(OUT PHANDLE NewConsoleHandle, + OUT PCONSOLE* NewConsole, + IN PCONSOLE_INFO ConsoleInfo, + IN ULONG ConsoleLeaderProcessId); +NTSTATUS NTAPI +ConDrvRegisterFrontEnd(IN PCONSOLE Console, + IN PFRONTEND FrontEnd); +NTSTATUS NTAPI +ConDrvDeregisterFrontEnd(IN PCONSOLE Console); +VOID NTAPI +ConDrvDeleteConsole(IN PCONSOLE Console); + + BOOLEAN NTAPI ConDrvValidateConsoleState(IN PCONSOLE Console, @@ -21,8 +36,19 @@ IN BOOLEAN LockConsole); BOOLEAN NTAPI -ConDrvValidateConsole(IN PCONSOLE Console, +ConDrvValidateConsole(OUT PCONSOLE* Console, + IN HANDLE ConsoleHandle, IN CONSOLE_STATE ExpectedState, IN BOOLEAN LockConsole); + + +NTSTATUS NTAPI +ConDrvGetConsole(OUT PCONSOLE* Console, + IN HANDLE ConsoleHandle, + IN BOOLEAN LockConsole); +VOID NTAPI +ConDrvReleaseConsole(IN PCONSOLE Console, + IN BOOLEAN WasConsoleLocked); + /* EOF */ Modified: trunk/reactos/win32ss/user/consrv/init.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/init.c?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/init.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/init.c [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -326,7 +326,7 @@ **************************************************************************/ NTSTATUS Status = STATUS_SUCCESS; - PCONSOLE_PROCESS_DATA /* SourceProcessData, */ TargetProcessData; + PCONSOLE_PROCESS_DATA TargetProcessData; /* An empty target process is invalid */ if (!TargetProcess) return STATUS_INVALID_PARAMETER; @@ -337,7 +337,7 @@ RtlZeroMemory(TargetProcessData, sizeof(*TargetProcessData)); TargetProcessData->Process = TargetProcess; TargetProcessData->ConsoleEvent = NULL; - TargetProcessData->Console = TargetProcessData->ParentConsole = NULL; + TargetProcessData->ConsoleHandle = TargetProcessData->ParentConsoleHandle = NULL; TargetProcessData->ConsoleApp = ((TargetProcess->Flags & CsrProcessIsConsoleApp) ? TRUE : FALSE); /* @@ -363,20 +363,23 @@ if (TargetProcessData->ConsoleApp /* && SourceProcessData->ConsoleApp */) { PCONSOLE_PROCESS_DATA SourceProcessData = ConsoleGetPerProcessData(SourceProcess); + PCONSOLE SourceConsole; /* Validate and lock the parent's console */ - if (ConDrvValidateConsole(SourceProcessData->Console, CONSOLE_RUNNING, TRUE)) + if (ConDrvValidateConsole(&SourceConsole, + SourceProcessData->ConsoleHandle, + CONSOLE_RUNNING, TRUE)) { /* Inherit the parent's handles table */ Status = ConSrvInheritHandlesTable(SourceProcessData, TargetProcessData); if (NT_SUCCESS(Status)) { /* Temporary save the parent's console too */ - TargetProcessData->ParentConsole = SourceProcessData->Console; + TargetProcessData->ParentConsoleHandle = SourceProcessData->ConsoleHandle; } /* Unlock the parent's console */ - LeaveCriticalSection(&SourceProcessData->Console->Lock); + LeaveCriticalSection(&SourceConsole->Lock); } } @@ -412,8 +415,8 @@ } /* If we don't have a console, then create a new one... */ - if (!ConnectInfo->Console || - ConnectInfo->Console != ProcessData->ParentConsole) + if (!ConnectInfo->ConsoleHandle || + ConnectInfo->ConsoleHandle != ProcessData->ParentConsoleHandle) { DPRINT("ConSrvConnect - Allocate a new console\n"); @@ -446,7 +449,7 @@ /* Reuse our current console */ Status = ConSrvInheritConsole(ProcessData, - ConnectInfo->Console, + ConnectInfo->ConsoleHandle, FALSE, NULL, // &ConnectInfo->InputHandle, NULL, // &ConnectInfo->OutputHandle, @@ -458,16 +461,12 @@ } } - /* Return it to the caller */ - ConnectInfo->Console = ProcessData->Console; - - /* Input Wait Handle */ + /* Return the console handle and the input wait handle to the caller */ + ConnectInfo->ConsoleHandle = ProcessData->ConsoleHandle; ConnectInfo->InputWaitHandle = ProcessData->ConsoleEvent; - /* Set the Property Dialog Handler */ + /* Set the Property-Dialog and Control-Dispatcher handlers */ ProcessData->PropDispatcher = ConnectInfo->PropDispatcher; - - /* Set the Ctrl Dispatcher */ ProcessData->CtrlDispatcher = ConnectInfo->CtrlDispatcher; return STATUS_SUCCESS; @@ -483,8 +482,8 @@ * This function is called whenever a new process (GUI or CUI) is destroyed. **************************************************************************/ - if ( ProcessData->Console != NULL || - ProcessData->HandleTable != NULL ) + if ( ProcessData->ConsoleHandle != NULL || + ProcessData->HandleTable != NULL ) { DPRINT("ConSrvDisconnect - calling ConSrvRemoveConsole\n"); ConSrvRemoveConsole(ProcessData); Modified: trunk/reactos/win32ss/user/consrv/procinit.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/procinit.h?rev=59435&r1=59434&r2=59435&view=diff ============================================================================== --- trunk/reactos/win32ss/user/consrv/procinit.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/consrv/procinit.h [iso-8859-1] Sat Jul 6 19:47:53 2013 @@ -14,7 +14,7 @@ PHANDLE pErrorHandle, PCONSOLE_START_INFO ConsoleStartInfo); NTSTATUS FASTCALL ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData, - struct _CONSOLE* /* PCONSOLE */ Console, + HANDLE ConsoleHandle, BOOL CreateNewHandlesTable, PHANDLE pInputHandle, PHANDLE pOutputHandle,