- Fix console initialization / uninitialization and resources release when initialization fails.
- Remove unneeded DPRINTs.

svn path=/branches/ros-csrss/; revision=58462
This commit is contained in:
Hermès Bélusca-Maïto 2013-03-10 15:37:22 +00:00
parent 4ec191c413
commit 17c9d97fe7
4 changed files with 79 additions and 98 deletions

View file

@ -145,6 +145,7 @@ ConsoleControlDispatcher(IN LPVOID lpThreadParameter)
ASSERT(ConsoleInitialized); ASSERT(ConsoleInitialized);
RtlEnterCriticalSection(&ConsoleLock); RtlEnterCriticalSection(&ConsoleLock);
nExitCode = 0; nExitCode = 0;
if ((nCode != CTRL_C_EVENT) || (NtCurrentPeb()->ProcessParameters->ConsoleFlags != 1)) if ((nCode != CTRL_C_EVENT) || (NtCurrentPeb()->ProcessParameters->ConsoleFlags != 1))
{ {
@ -175,6 +176,7 @@ ConsoleControlDispatcher(IN LPVOID lpThreadParameter)
} }
RtlLeaveCriticalSection(&ConsoleLock); RtlLeaveCriticalSection(&ConsoleLock);
ExitThread(nExitCode); ExitThread(nExitCode);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -54,7 +54,7 @@ ConSrvConsoleCtrlEventTimeout(DWORD Event,
return; return;
} }
DPRINT1("We succeeded at creating ProcessData->CtrlDispatcher remote thread, ProcessId = %x, Process = 0x%p\n", ProcessData->Process->ClientId.UniqueProcess, ProcessData->Process); DPRINT("We succeeded at creating ProcessData->CtrlDispatcher remote thread, ProcessId = %x, Process = 0x%p\n", ProcessData->Process->ClientId.UniqueProcess, ProcessData->Process);
WaitForSingleObject(Thread, Timeout); WaitForSingleObject(Thread, Timeout);
CloseHandle(Thread); CloseHandle(Thread);
} }
@ -513,14 +513,10 @@ CSR_API(SrvOpenConsole)
PCONSOLE_OPENCONSOLE OpenConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.OpenConsoleRequest; PCONSOLE_OPENCONSOLE OpenConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.OpenConsoleRequest;
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process); PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
DPRINT("SrvOpenConsole\n");
OpenConsoleRequest->ConsoleHandle = INVALID_HANDLE_VALUE; OpenConsoleRequest->ConsoleHandle = INVALID_HANDLE_VALUE;
RtlEnterCriticalSection(&ProcessData->HandleTableLock); RtlEnterCriticalSection(&ProcessData->HandleTableLock);
DPRINT1("ProcessData = 0x%p ; ProcessData->Console = 0x%p\n", ProcessData, ProcessData->Console);
if (ProcessData->Console) if (ProcessData->Console)
{ {
DWORD DesiredAccess = OpenConsoleRequest->Access; DWORD DesiredAccess = OpenConsoleRequest->Access;
@ -529,9 +525,7 @@ CSR_API(SrvOpenConsole)
PCONSOLE Console = ProcessData->Console; PCONSOLE Console = ProcessData->Console;
Object_t *Object; Object_t *Object;
DPRINT1("SrvOpenConsole - Checkpoint 1\n");
EnterCriticalSection(&Console->Lock); EnterCriticalSection(&Console->Lock);
DPRINT1("SrvOpenConsole - Checkpoint 2\n");
if (OpenConsoleRequest->HandleType == HANDLE_OUTPUT) if (OpenConsoleRequest->HandleType == HANDLE_OUTPUT)
{ {
@ -575,8 +569,6 @@ CSR_API(SrvAllocConsole)
PCSR_PROCESS CsrProcess = CsrGetClientThread()->Process; PCSR_PROCESS CsrProcess = CsrGetClientThread()->Process;
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrProcess); PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrProcess);
DPRINT("SrvAllocConsole\n");
if (ProcessData->Console != NULL) if (ProcessData->Console != NULL)
{ {
DPRINT1("Process already has a console\n"); DPRINT1("Process already has a console\n");
@ -632,7 +624,6 @@ CSR_API(SrvAllocConsole)
/* Set the Ctrl Dispatcher */ /* Set the Ctrl Dispatcher */
ProcessData->CtrlDispatcher = AllocConsoleRequest->CtrlDispatcher; ProcessData->CtrlDispatcher = AllocConsoleRequest->CtrlDispatcher;
DPRINT("CONSRV: CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -646,8 +637,6 @@ CSR_API(SrvAttachConsole)
HANDLE ProcessId = ULongToHandle(AttachConsoleRequest->ProcessId); HANDLE ProcessId = ULongToHandle(AttachConsoleRequest->ProcessId);
PCONSOLE_PROCESS_DATA SourceProcessData, TargetProcessData; PCONSOLE_PROCESS_DATA SourceProcessData, TargetProcessData;
DPRINT("SrvAttachConsole\n");
TargetProcessData = ConsoleGetPerProcessData(TargetProcess); TargetProcessData = ConsoleGetPerProcessData(TargetProcess);
if (TargetProcessData->Console != NULL) if (TargetProcessData->Console != NULL)
@ -674,19 +663,15 @@ CSR_API(SrvAttachConsole)
return Status; return Status;
} }
DPRINT("We, process (ID) %lu;%lu\n", TargetProcess->ClientId.UniqueProcess, TargetProcess->ClientId.UniqueThread);
ProcessId = ULongToHandle(ProcessInfo.InheritedFromUniqueProcessId); ProcessId = ULongToHandle(ProcessInfo.InheritedFromUniqueProcessId);
DPRINT("Parent process ID = %lu\n", ProcessId);
} }
/* Lock the source process via its PID */ /* Lock the source process via its PID */
Status = CsrLockProcessByClientId(ProcessId, &SourceProcess); Status = CsrLockProcessByClientId(ProcessId, &SourceProcess);
DPRINT1("Lock process Id %lu - Status %lu\n", ProcessId, Status);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
SourceProcessData = ConsoleGetPerProcessData(SourceProcess); SourceProcessData = ConsoleGetPerProcessData(SourceProcess);
DPRINT1("SourceProcessData->Console = 0x%p\n", SourceProcessData->Console);
if (SourceProcessData->Console == NULL) if (SourceProcessData->Console == NULL)
{ {
Status = STATUS_INVALID_HANDLE; Status = STATUS_INVALID_HANDLE;
@ -733,7 +718,6 @@ CSR_API(SrvAttachConsole)
/* Set the Ctrl Dispatcher */ /* Set the Ctrl Dispatcher */
TargetProcessData->CtrlDispatcher = AttachConsoleRequest->CtrlDispatcher; TargetProcessData->CtrlDispatcher = AttachConsoleRequest->CtrlDispatcher;
DPRINT("CONSRV: CtrlDispatcher address: %x\n", TargetProcessData->CtrlDispatcher);
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
@ -762,8 +746,6 @@ CSR_API(SrvSetConsoleMode)
PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest; PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest;
Object_t* Object = NULL; Object_t* Object = NULL;
DPRINT("SrvSetConsoleMode\n");
Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process), Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
ConsoleModeRequest->ConsoleHandle, ConsoleModeRequest->ConsoleHandle,
&Object, NULL, GENERIC_WRITE, TRUE, 0); &Object, NULL, GENERIC_WRITE, TRUE, 0);
@ -797,8 +779,6 @@ CSR_API(SrvGetConsoleMode)
PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest; PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest;
Object_t* Object = NULL; Object_t* Object = NULL;
DPRINT("SrvGetConsoleMode\n");
Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process), Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
ConsoleModeRequest->ConsoleHandle, ConsoleModeRequest->ConsoleHandle,
&Object, NULL, GENERIC_READ, TRUE, 0); &Object, NULL, GENERIC_READ, TRUE, 0);
@ -834,8 +814,6 @@ CSR_API(SrvSetConsoleTitle)
PCONSOLE Console; PCONSOLE Console;
PWCHAR Buffer; PWCHAR Buffer;
DPRINT("SrvSetConsoleTitle\n");
if (!CsrValidateMessageBuffer(ApiMessage, if (!CsrValidateMessageBuffer(ApiMessage,
(PVOID)&TitleRequest->Title, (PVOID)&TitleRequest->Title,
TitleRequest->Length, TitleRequest->Length,
@ -887,8 +865,6 @@ CSR_API(SrvGetConsoleTitle)
PCONSOLE Console; PCONSOLE Console;
DWORD Length; DWORD Length;
DPRINT("SrvGetConsoleTitle\n");
if (!CsrValidateMessageBuffer(ApiMessage, if (!CsrValidateMessageBuffer(ApiMessage,
(PVOID)&TitleRequest->Title, (PVOID)&TitleRequest->Title,
TitleRequest->Length, TitleRequest->Length,
@ -960,8 +936,6 @@ CSR_API(SrvGetConsoleHardwareState)
PCONSOLE_SCREEN_BUFFER Buff; PCONSOLE_SCREEN_BUFFER Buff;
PCONSOLE Console; PCONSOLE Console;
DPRINT("SrvGetConsoleHardwareState\n");
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
HardwareStateRequest->OutputHandle, HardwareStateRequest->OutputHandle,
&Buff, &Buff,
@ -988,8 +962,6 @@ CSR_API(SrvSetConsoleHardwareState)
PCONSOLE_SCREEN_BUFFER Buff; PCONSOLE_SCREEN_BUFFER Buff;
PCONSOLE Console; PCONSOLE Console;
DPRINT("SrvSetConsoleHardwareState\n");
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
HardwareStateRequest->OutputHandle, HardwareStateRequest->OutputHandle,
&Buff, &Buff,
@ -1016,8 +988,6 @@ CSR_API(SrvGetConsoleWindow)
PCONSOLE_GETWINDOW GetWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetWindowRequest; PCONSOLE_GETWINDOW GetWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetWindowRequest;
PCONSOLE Console; PCONSOLE Console;
DPRINT("SrvGetConsoleWindow\n");
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
@ -1033,8 +1003,6 @@ CSR_API(SrvSetConsoleIcon)
PCONSOLE_SETICON SetIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetIconRequest; PCONSOLE_SETICON SetIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetIconRequest;
PCONSOLE Console; PCONSOLE Console;
DPRINT("SrvSetConsoleIcon\n");
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
@ -1103,8 +1071,6 @@ CSR_API(SrvGetConsoleProcessList)
PLIST_ENTRY current_entry; PLIST_ENTRY current_entry;
ULONG nItems = 0; ULONG nItems = 0;
DPRINT("SrvGetConsoleProcessList\n");
if (!CsrValidateMessageBuffer(ApiMessage, if (!CsrValidateMessageBuffer(ApiMessage,
(PVOID)&GetProcessListRequest->pProcessIds, (PVOID)&GetProcessListRequest->pProcessIds,
GetProcessListRequest->nMaxIds, GetProcessListRequest->nMaxIds,

View file

@ -206,7 +206,7 @@ GuiDrawRegion(PCONSOLE Console, SMALL_RECT* Region);
static NTSTATUS WINAPI static NTSTATUS WINAPI
GuiResizeBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer, COORD Size); GuiResizeBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer, COORD Size);
VOID FASTCALL VOID FASTCALL
GuiConsoleInitScrollbar(PGUI_CONSOLE_DATA GuiData); GuiConsoleResizeWindow(PGUI_CONSOLE_DATA GuiData);
static LRESULT static LRESULT
@ -482,10 +482,14 @@ GuiApplyUserSettings(PGUI_CONSOLE_DATA GuiData,
SizeChanged = TRUE; SizeChanged = TRUE;
} }
GuiData->GuiInfo.AutoPosition = pConInfo->ci.u.GuiInfo.AutoPosition;
GuiData->GuiInfo.WindowOrigin = pConInfo->ci.u.GuiInfo.WindowOrigin;
if (SizeChanged) if (SizeChanged)
{ {
/* Resize the window to the user's values */
GuiData->WindowSizeLock = TRUE; GuiData->WindowSizeLock = TRUE;
GuiConsoleInitScrollbar(GuiData); GuiConsoleResizeWindow(GuiData);
GuiData->WindowSizeLock = FALSE; GuiData->WindowSizeLock = FALSE;
} }
@ -514,15 +518,17 @@ GuiGetGuiData(HWND hWnd)
VOID VOID
FASTCALL FASTCALL
GuiConsoleInitScrollbar(PGUI_CONSOLE_DATA GuiData) GuiConsoleResizeWindow(PGUI_CONSOLE_DATA GuiData)
{ {
PCONSOLE Console = GuiData->Console; PCONSOLE Console = GuiData->Console;
SCROLLINFO sInfo; SCROLLINFO sInfo;
DWORD Width = Console->Size.X * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); DWORD Width = Console->Size.X * GuiData->CharWidth +
DWORD Height = Console->Size.Y * GuiData->CharHeight + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION); 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE));
DWORD Height = Console->Size.Y * GuiData->CharHeight +
2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION);
/* set scrollbar sizes */ /* Set scrollbar sizes */
sInfo.cbSize = sizeof(SCROLLINFO); sInfo.cbSize = sizeof(SCROLLINFO);
sInfo.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; sInfo.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
sInfo.nMin = 0; sInfo.nMin = 0;
@ -548,14 +554,19 @@ GuiConsoleInitScrollbar(PGUI_CONSOLE_DATA GuiData)
SetScrollInfo(GuiData->hWindow, SB_HORZ, &sInfo, TRUE); SetScrollInfo(GuiData->hWindow, SB_HORZ, &sInfo, TRUE);
Height += GetSystemMetrics(SM_CYHSCROLL); Height += GetSystemMetrics(SM_CYHSCROLL);
ShowScrollBar(GuiData->hWindow, SB_HORZ, TRUE); ShowScrollBar(GuiData->hWindow, SB_HORZ, TRUE);
} }
else else
{ {
ShowScrollBar(GuiData->hWindow, SB_HORZ, FALSE); ShowScrollBar(GuiData->hWindow, SB_HORZ, FALSE);
} }
SetWindowPos(GuiData->hWindow, NULL, 0, 0, Width, Height, /* Resize and reposition the window */
SetWindowPos(GuiData->hWindow,
NULL,
(GuiData->GuiInfo.AutoPosition ? 0 : GuiData->GuiInfo.WindowOrigin.x),
(GuiData->GuiInfo.AutoPosition ? 0 : GuiData->GuiInfo.WindowOrigin.y),
Width,
Height,
SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
} }
@ -563,21 +574,21 @@ static BOOL
GuiConsoleHandleNcCreate(HWND hWnd, LPCREATESTRUCTW Create) GuiConsoleHandleNcCreate(HWND hWnd, LPCREATESTRUCTW Create)
{ {
PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)Create->lpCreateParams; PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)Create->lpCreateParams;
PCONSOLE Console = GuiData->Console; PCONSOLE Console;
HDC Dc; HDC Dc;
HFONT OldFont; HFONT OldFont;
TEXTMETRICW Metrics; TEXTMETRICW Metrics;
SIZE CharSize; SIZE CharSize;
GuiData->hWindow = hWnd;
if (NULL == GuiData) if (NULL == GuiData)
{ {
DPRINT1("GuiConsoleNcCreate: RtlAllocateHeap failed\n"); DPRINT1("GuiConsoleNcCreate: No GUI data\n");
return FALSE; return FALSE;
} }
InitializeCriticalSection(&GuiData->Lock); Console = GuiData->Console;
GuiData->hWindow = hWnd;
GuiData->Font = CreateFontW(LOWORD(GuiData->GuiInfo.FontSize), GuiData->Font = CreateFontW(LOWORD(GuiData->GuiInfo.FontSize),
0, // HIWORD(GuiData->GuiInfo.FontSize), 0, // HIWORD(GuiData->GuiInfo.FontSize),
@ -593,11 +604,12 @@ GuiConsoleHandleNcCreate(HWND hWnd, LPCREATESTRUCTW Create)
NONANTIALIASED_QUALITY, NONANTIALIASED_QUALITY,
FIXED_PITCH | GuiData->GuiInfo.FontFamily /* FF_DONTCARE */, FIXED_PITCH | GuiData->GuiInfo.FontFamily /* FF_DONTCARE */,
GuiData->GuiInfo.FaceName); GuiData->GuiInfo.FaceName);
if (NULL == GuiData->Font) if (NULL == GuiData->Font)
{ {
DPRINT1("GuiConsoleNcCreate: CreateFont failed\n"); DPRINT1("GuiConsoleNcCreate: CreateFont failed\n");
DeleteCriticalSection(&GuiData->Lock); GuiData->hWindow = NULL;
RtlFreeHeap(ConSrvHeap, 0, GuiData); SetEvent(GuiData->hGuiInitEvent);
return FALSE; return FALSE;
} }
Dc = GetDC(GuiData->hWindow); Dc = GetDC(GuiData->hWindow);
@ -605,8 +617,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, LPCREATESTRUCTW Create)
{ {
DPRINT1("GuiConsoleNcCreate: GetDC failed\n"); DPRINT1("GuiConsoleNcCreate: GetDC failed\n");
DeleteObject(GuiData->Font); DeleteObject(GuiData->Font);
DeleteCriticalSection(&GuiData->Lock); GuiData->hWindow = NULL;
RtlFreeHeap(ConSrvHeap, 0, GuiData); SetEvent(GuiData->hGuiInitEvent);
return FALSE; return FALSE;
} }
OldFont = SelectObject(Dc, GuiData->Font); OldFont = SelectObject(Dc, GuiData->Font);
@ -615,8 +627,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, LPCREATESTRUCTW Create)
DPRINT1("GuiConsoleNcCreate: SelectObject failed\n"); DPRINT1("GuiConsoleNcCreate: SelectObject failed\n");
ReleaseDC(GuiData->hWindow, Dc); ReleaseDC(GuiData->hWindow, Dc);
DeleteObject(GuiData->Font); DeleteObject(GuiData->Font);
DeleteCriticalSection(&GuiData->Lock); GuiData->hWindow = NULL;
RtlFreeHeap(ConSrvHeap, 0, GuiData); SetEvent(GuiData->hGuiInitEvent);
return FALSE; return FALSE;
} }
if (!GetTextMetricsW(Dc, &Metrics)) if (!GetTextMetricsW(Dc, &Metrics))
@ -625,8 +637,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, LPCREATESTRUCTW Create)
SelectObject(Dc, OldFont); SelectObject(Dc, OldFont);
ReleaseDC(GuiData->hWindow, Dc); ReleaseDC(GuiData->hWindow, Dc);
DeleteObject(GuiData->Font); DeleteObject(GuiData->Font);
DeleteCriticalSection(&GuiData->Lock); GuiData->hWindow = NULL;
RtlFreeHeap(ConSrvHeap, 0, GuiData); SetEvent(GuiData->hGuiInitEvent);
return FALSE; return FALSE;
} }
GuiData->CharWidth = Metrics.tmMaxCharWidth; GuiData->CharWidth = Metrics.tmMaxCharWidth;
@ -645,14 +657,14 @@ GuiConsoleHandleNcCreate(HWND hWnd, LPCREATESTRUCTW Create)
Console->ActiveBuffer->ForceCursorOff = FALSE; Console->ActiveBuffer->ForceCursorOff = FALSE;
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
DPRINT("Console %p GuiData %p\n", Console, GuiData);
SetWindowLongPtrW(GuiData->hWindow, GWLP_USERDATA, (DWORD_PTR)GuiData); SetWindowLongPtrW(GuiData->hWindow, GWLP_USERDATA, (DWORD_PTR)GuiData);
SetTimer(GuiData->hWindow, CONGUI_UPDATE_TIMER, CONGUI_UPDATE_TIME, NULL); SetTimer(GuiData->hWindow, CONGUI_UPDATE_TIMER, CONGUI_UPDATE_TIME, NULL);
GuiConsoleCreateSysMenu(GuiData->hWindow); GuiConsoleCreateSysMenu(GuiData->hWindow);
/* Resize the window to the user's values */
GuiData->WindowSizeLock = TRUE; GuiData->WindowSizeLock = TRUE;
GuiConsoleInitScrollbar(GuiData); GuiConsoleResizeWindow(GuiData);
GuiData->WindowSizeLock = FALSE; GuiData->WindowSizeLock = FALSE;
SetEvent(GuiData->hGuiInitEvent); SetEvent(GuiData->hGuiInitEvent);
@ -1041,16 +1053,13 @@ GuiConsoleHandleClose(PGUI_CONSOLE_DATA GuiData)
} }
static VOID static VOID
GuiConsoleHandleNcDestroy(PGUI_CONSOLE_DATA GuiData, HWND hWnd) GuiConsoleHandleNcDestroy(PGUI_CONSOLE_DATA GuiData)
{ {
PCONSOLE Console = GuiData->Console; KillTimer(GuiData->hWindow, CONGUI_UPDATE_TIMER);
GetSystemMenu(GuiData->hWindow, TRUE);
KillTimer(hWnd, 1); SetWindowLongPtrW(GuiData->hWindow, GWLP_USERDATA, (DWORD_PTR)NULL);
Console->TermIFace.Data = NULL; GuiData->hWindow = NULL;
DeleteCriticalSection(&GuiData->Lock);
GetSystemMenu(hWnd, TRUE);
RtlFreeHeap(ConSrvHeap, 0, GuiData);
} }
static COORD static COORD
@ -1269,7 +1278,8 @@ GuiConsoleResize(PGUI_CONSOLE_DATA GuiData, WPARAM wParam, LPARAM lParam)
{ {
PCONSOLE Console = GuiData->Console; PCONSOLE Console = GuiData->Console;
if ((GuiData->WindowSizeLock == FALSE) && (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED)) if ((GuiData->WindowSizeLock == FALSE) &&
(wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED))
{ {
PCONSOLE_SCREEN_BUFFER Buff = Console->ActiveBuffer; PCONSOLE_SCREEN_BUFFER Buff = Console->ActiveBuffer;
DWORD windx, windy, charx, chary; DWORD windx, windy, charx, chary;
@ -1308,7 +1318,7 @@ GuiConsoleResize(PGUI_CONSOLE_DATA GuiData, WPARAM wParam, LPARAM lParam)
Console->Size.Y = (chary <= Buff->ScreenBufferSize.Y) ? chary : Buff->ScreenBufferSize.Y; Console->Size.Y = (chary <= Buff->ScreenBufferSize.Y) ? chary : Buff->ScreenBufferSize.Y;
} }
GuiConsoleInitScrollbar(GuiData); GuiConsoleResizeWindow(GuiData);
// Adjust the start of the visible area if we are attempting to show nonexistent areas // Adjust the start of the visible area if we are attempting to show nonexistent areas
if((Buff->ScreenBufferSize.X - Buff->ShowX) < Console->Size.X) Buff->ShowX = Buff->ScreenBufferSize.X - Console->Size.X; if((Buff->ScreenBufferSize.X - Buff->ShowX) < Console->Size.X) Buff->ShowX = Buff->ScreenBufferSize.X - Console->Size.X;
@ -1489,7 +1499,7 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
break; break;
case WM_NCDESTROY: case WM_NCDESTROY:
GuiConsoleHandleNcDestroy(GuiData, hWnd); GuiConsoleHandleNcDestroy(GuiData);
break; break;
case WM_PAINT: case WM_PAINT:
@ -1642,8 +1652,10 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
TranslateMessage(&Msg); TranslateMessage(&Msg);
DispatchMessageW(&Msg); DispatchMessageW(&Msg);
} }
if (GuiData->hWindow != NULL) /* && DestroyWindow(GuiData->hWindow) */
{
DestroyWindow(GuiData->hWindow); DestroyWindow(GuiData->hWindow);
GuiData->hWindow = NULL;
WindowCount = GetWindowLongW(hWnd, GWL_USERDATA); WindowCount = GetWindowLongW(hWnd, GWL_USERDATA);
WindowCount--; WindowCount--;
@ -1655,6 +1667,7 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
DPRINT1("CONSRV: Going to quit the Gui Thread!!\n"); DPRINT1("CONSRV: Going to quit the Gui Thread!!\n");
PostQuitMessage(0); PostQuitMessage(0);
} }
}
return 0; return 0;
} }
@ -1843,6 +1856,10 @@ GuiCleanupConsole(PCONSOLE Console)
DPRINT1("Destroy hIconSm\n"); DPRINT1("Destroy hIconSm\n");
DestroyIcon(GuiData->hIconSm); DestroyIcon(GuiData->hIconSm);
} }
Console->TermIFace.Data = NULL;
DeleteCriticalSection(&GuiData->Lock);
RtlFreeHeap(ConSrvHeap, 0, GuiData);
} }
static VOID WINAPI static VOID WINAPI
@ -2149,6 +2166,8 @@ GuiInitConsole(PCONSOLE Console,
GuiData->Console = Console; GuiData->Console = Console;
GuiData->hWindow = NULL; GuiData->hWindow = NULL;
InitializeCriticalSection(&GuiData->Lock);
/* Set up the GUI data */ /* Set up the GUI data */
wcsncpy(GuiData->GuiInfo.FaceName, ConsoleInfo->u.GuiInfo.FaceName, LF_FACESIZE); wcsncpy(GuiData->GuiInfo.FaceName, ConsoleInfo->u.GuiInfo.FaceName, LF_FACESIZE);
GuiData->GuiInfo.FontFamily = ConsoleInfo->u.GuiInfo.FontFamily; GuiData->GuiInfo.FontFamily = ConsoleInfo->u.GuiInfo.FontFamily;
@ -2195,15 +2214,23 @@ GuiInitConsole(PCONSOLE Console,
*/ */
GuiData->hGuiInitEvent = CreateEventW(NULL, FALSE, FALSE, NULL); GuiData->hGuiInitEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
/* Create the GUI console */ /* Create the terminal window */
PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, GuiData->GuiInfo.ShowWindow, (LPARAM)GuiData); PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, GuiData->GuiInfo.ShowWindow, (LPARAM)GuiData);
/* Wait until initialization has finished */ /* Wait until initialization has finished */
WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE); WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE);
DPRINT1("Received event Console %p GuiData %p X %d Y %d\n", Console, GuiData, Console->Size.X, Console->Size.Y);
CloseHandle(GuiData->hGuiInitEvent); CloseHandle(GuiData->hGuiInitEvent);
GuiData->hGuiInitEvent = NULL; GuiData->hGuiInitEvent = NULL;
/* Check whether we really succeeded in initializing the terminal window */
if (GuiData->hWindow == NULL)
{
DPRINT1("GuiInitConsole - We failed at creating a new terminal window\n");
// ConioCleanupConsole(Console);
GuiCleanupConsole(Console);
return STATUS_UNSUCCESSFUL;
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -598,14 +598,8 @@ ConSrvNewProcess(PCSR_PROCESS SourceProcess,
PCONSOLE_PROCESS_DATA SourceProcessData, TargetProcessData; PCONSOLE_PROCESS_DATA SourceProcessData, TargetProcessData;
DPRINT1("ConSrvNewProcess\n");
DPRINT1("SourceProcess = 0x%p ; TargetProcess = 0x%p\n", SourceProcess, TargetProcess);
/* An empty target process is invalid */ /* An empty target process is invalid */
if (!TargetProcess) if (!TargetProcess) return STATUS_INVALID_PARAMETER;
return STATUS_INVALID_PARAMETER;
DPRINT1("ConSrvNewProcess - OK\n");
TargetProcessData = ConsoleGetPerProcessData(TargetProcess); TargetProcessData = ConsoleGetPerProcessData(TargetProcess);
@ -624,8 +618,7 @@ ConSrvNewProcess(PCSR_PROCESS SourceProcess,
RtlInitializeCriticalSection(&TargetProcessData->HandleTableLock); RtlInitializeCriticalSection(&TargetProcessData->HandleTableLock);
/* Do nothing if the source process is NULL */ /* Do nothing if the source process is NULL */
if (!SourceProcess) if (!SourceProcess) return STATUS_SUCCESS;
return STATUS_SUCCESS;
SourceProcessData = ConsoleGetPerProcessData(SourceProcess); SourceProcessData = ConsoleGetPerProcessData(SourceProcess);
@ -644,10 +637,6 @@ ConSrvNewProcess(PCSR_PROCESS SourceProcess,
/* Temporary save the parent's console */ /* Temporary save the parent's console */
TargetProcessData->ParentConsole = SourceProcessData->Console; TargetProcessData->ParentConsole = SourceProcessData->Console;
} }
else
{
DPRINT1("ConSrvNewProcess - We don't inherit a handle table : SourceProcessData->Console = 0x%p ; TargetProcess->Flags = %lu\n", SourceProcessData->Console, TargetProcess->Flags);
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -666,8 +655,6 @@ ConSrvConnect(IN PCSR_PROCESS CsrProcess,
PCONSOLE_CONNECTION_INFO ConnectInfo = (PCONSOLE_CONNECTION_INFO)ConnectionInfo; PCONSOLE_CONNECTION_INFO ConnectInfo = (PCONSOLE_CONNECTION_INFO)ConnectionInfo;
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrProcess); PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrProcess);
DPRINT1("ConSrvConnect\n");
if ( ConnectionInfo == NULL || if ( ConnectionInfo == NULL ||
ConnectionInfoLength == NULL || ConnectionInfoLength == NULL ||
*ConnectionInfoLength != sizeof(CONSOLE_CONNECTION_INFO) ) *ConnectionInfoLength != sizeof(CONSOLE_CONNECTION_INFO) )
@ -743,7 +730,6 @@ ConSrvConnect(IN PCSR_PROCESS CsrProcess,
/* Set the Ctrl Dispatcher */ /* Set the Ctrl Dispatcher */
ProcessData->CtrlDispatcher = ConnectInfo->CtrlDispatcher; ProcessData->CtrlDispatcher = ConnectInfo->CtrlDispatcher;
DPRINT("CONSRV: CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }