From e0c43e5c835705ece13bd77417d34883819a7aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 18 Dec 2004 19:23:05 +0000 Subject: [PATCH] Handle failures better (i.e. without crashing) svn path=/trunk/; revision=12195 --- reactos/subsys/csrss/api/process.c | 3 ++- reactos/subsys/csrss/win32csr/conio.c | 4 +++- reactos/subsys/csrss/win32csr/guiconsole.c | 11 ++++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/csrss/api/process.c b/reactos/subsys/csrss/api/process.c index 75d6dc14d96..4d13e8d4ee6 100644 --- a/reactos/subsys/csrss/api/process.c +++ b/reactos/subsys/csrss/api/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.36 2004/11/14 18:47:10 hbirr Exp $ +/* $Id: process.c,v 1.37 2004/12/18 19:23:05 gvg Exp $ * * reactos/subsys/csrss/api/process.c * @@ -204,6 +204,7 @@ CSR_API(CsrCreateProcess) Reply->Status = ApiReply.Status; if (! NT_SUCCESS(Reply->Status)) { + CsrFreeProcessData(Request->Data.CreateProcessRequest.NewProcessId); return Reply->Status; } Reply->Data.CreateProcessReply.InputHandle = ApiReply.Data.AllocConsoleReply.InputHandle; diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index 24332dcfd7a..a4b37949438 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.17 2004/11/14 18:47:10 hbirr Exp $ +/* $Id: conio.c,v 1.18 2004/12/18 19:23:05 gvg Exp $ * * reactos/subsys/csrss/win32csr/conio.c * @@ -219,6 +219,7 @@ CsrInitConsole(PCSRSS_CONSOLE Console) NewBuffer = HeapAlloc(Win32CsrApiHeap, 0, sizeof(CSRSS_SCREEN_BUFFER)); if (NULL == NewBuffer) { + ConioCleanupConsole(Console); RtlFreeUnicodeString(&Console->Title); RtlDeleteCriticalSection(&Console->Header.Lock); CloseHandle(Console->ActiveEvent); @@ -227,6 +228,7 @@ CsrInitConsole(PCSRSS_CONSOLE Console) Status = CsrInitConsoleScreenBuffer(Console, NewBuffer); if (! NT_SUCCESS(Status)) { + ConioCleanupConsole(Console); RtlFreeUnicodeString(&Console->Title); RtlDeleteCriticalSection(&Console->Header.Lock); CloseHandle(Console->ActiveEvent); diff --git a/reactos/subsys/csrss/win32csr/guiconsole.c b/reactos/subsys/csrss/win32csr/guiconsole.c index 53940ad85d0..44f82e49e93 100644 --- a/reactos/subsys/csrss/win32csr/guiconsole.c +++ b/reactos/subsys/csrss/win32csr/guiconsole.c @@ -1,4 +1,4 @@ -/* $Id: guiconsole.c,v 1.24 2004/12/05 01:13:29 navaraf Exp $ +/* $Id: guiconsole.c,v 1.25 2004/12/18 19:23:05 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -793,6 +793,7 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND NewWindow; LONG WindowCount; + MSG Msg; PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) lParam; switch(msg) @@ -820,6 +821,14 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) } return (LRESULT) NewWindow; case PM_DESTROY_CONSOLE: + /* Window creation is done using a PostMessage(), so it's possible that the + * window that we want to destroy doesn't exist yet. So first empty the message + * queue */ + while(PeekMessageW(&Msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&Msg); + DispatchMessageW(&Msg); + } DestroyWindow(Console->hWindow); Console->hWindow = NULL; WindowCount = GetWindowLongW(hWnd, GWL_USERDATA);