[KERNEL32], [WIN32CSR] Implement the CREATE_NO_WINDOW flag which creates a console with an invisible window.

svn path=/trunk/; revision=47326
This commit is contained in:
Jeffrey Morlan 2010-05-23 15:56:37 +00:00
parent 38734242d5
commit 44ce7e4f55
6 changed files with 16 additions and 9 deletions

View file

@ -1692,6 +1692,7 @@ AllocConsole(VOID)
Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher; Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher;
Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE; Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
Request.Data.AllocConsoleRequest.Visible = TRUE;
CsrRequest = MAKE_CSR_API(ALLOC_CONSOLE, CSR_CONSOLE); CsrRequest = MAKE_CSR_API(ALLOC_CONSOLE, CSR_CONSOLE);

View file

@ -150,6 +150,7 @@ BasepInitConsole(VOID)
{ {
/* Assume one is needed */ /* Assume one is needed */
Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE; Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
Request.Data.AllocConsoleRequest.Visible = TRUE;
/* Handle the special flags given to us by BasepInitializeEnvironment */ /* Handle the special flags given to us by BasepInitializeEnvironment */
if (Parameters->ConsoleHandle == HANDLE_DETACHED_PROCESS) if (Parameters->ConsoleHandle == HANDLE_DETACHED_PROCESS)
@ -168,8 +169,9 @@ BasepInitConsole(VOID)
else if (Parameters->ConsoleHandle == HANDLE_CREATE_NO_WINDOW) else if (Parameters->ConsoleHandle == HANDLE_CREATE_NO_WINDOW)
{ {
/* We'll get the real one soon */ /* We'll get the real one soon */
DPRINT1("NOT SUPPORTED: HANDLE_CREATE_NO_WINDOW\n"); DPRINT("Creating new invisible console\n");
Parameters->ConsoleHandle = NULL; Parameters->ConsoleHandle = NULL;
Request.Data.AllocConsoleRequest.Visible = FALSE;
} }
else else
{ {

View file

@ -80,7 +80,8 @@ typedef struct
typedef struct typedef struct
{ {
PCONTROLDISPATCHER CtrlDispatcher; PCONTROLDISPATCHER CtrlDispatcher;
BOOL ConsoleNeeded; BOOLEAN ConsoleNeeded;
BOOLEAN Visible;
HANDLE Console; HANDLE Console;
HANDLE InputHandle; HANDLE InputHandle;
HANDLE OutputHandle; HANDLE OutputHandle;

View file

@ -142,7 +142,7 @@ CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console,
} }
static NTSTATUS WINAPI static NTSTATUS WINAPI
CsrInitConsole(PCSRSS_CONSOLE Console) CsrInitConsole(PCSRSS_CONSOLE Console, BOOL Visible)
{ {
NTSTATUS Status; NTSTATUS Status;
SECURITY_ATTRIBUTES SecurityAttributes; SECURITY_ATTRIBUTES SecurityAttributes;
@ -210,7 +210,7 @@ CsrInitConsole(PCSRSS_CONSOLE Console)
} }
if (GuiMode) if (GuiMode)
{ {
Status = GuiInitConsole(Console); Status = GuiInitConsole(Console, Visible);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
HeapFree(Win32CsrApiHeap,0, NewBuffer); HeapFree(Win32CsrApiHeap,0, NewBuffer);
@ -286,7 +286,7 @@ CSR_API(CsrAllocConsole)
/* insert process data required for GUI initialization */ /* insert process data required for GUI initialization */
InsertHeadList(&Console->ProcessList, &ProcessData->ProcessEntry); InsertHeadList(&Console->ProcessList, &ProcessData->ProcessEntry);
/* Initialize the Console */ /* Initialize the Console */
Status = CsrInitConsole(Console); Status = CsrInitConsole(Console, Request->Data.AllocConsoleRequest.Visible);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Console init failed\n"); DPRINT1("Console init failed\n");

View file

@ -2070,7 +2070,10 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
if (NULL != NewWindow) if (NULL != NewWindow)
{ {
SetWindowLongW(hWnd, GWL_USERDATA, GetWindowLongW(hWnd, GWL_USERDATA) + 1); SetWindowLongW(hWnd, GWL_USERDATA, GetWindowLongW(hWnd, GWL_USERDATA) + 1);
ShowWindow(NewWindow, SW_SHOW); if (wParam)
{
ShowWindow(NewWindow, SW_SHOW);
}
} }
return (LRESULT) NewWindow; return (LRESULT) NewWindow;
case PM_DESTROY_CONSOLE: case PM_DESTROY_CONSOLE:
@ -2250,7 +2253,7 @@ static CSRSS_CONSOLE_VTBL GuiVtbl =
}; };
NTSTATUS FASTCALL NTSTATUS FASTCALL
GuiInitConsole(PCSRSS_CONSOLE Console) GuiInitConsole(PCSRSS_CONSOLE Console, BOOL Visible)
{ {
HANDLE GraphicsStartupEvent; HANDLE GraphicsStartupEvent;
HANDLE ThreadHandle; HANDLE ThreadHandle;
@ -2317,7 +2320,7 @@ GuiInitConsole(PCSRSS_CONSOLE Console)
*/ */
GuiData->hGuiInitEvent = CreateEventW(NULL, FALSE, FALSE, NULL); GuiData->hGuiInitEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
/* create console */ /* create console */
PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, 0, (LPARAM) Console); PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, Visible, (LPARAM) Console);
/* wait untill initialization has finished */ /* wait untill initialization has finished */
WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE); WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE);

View file

@ -13,6 +13,6 @@
#define CONGUI_UPDATE_TIME 0 #define CONGUI_UPDATE_TIME 0
#define CONGUI_UPDATE_TIMER 1 #define CONGUI_UPDATE_TIMER 1
NTSTATUS FASTCALL GuiInitConsole(PCSRSS_CONSOLE Console); NTSTATUS FASTCALL GuiInitConsole(PCSRSS_CONSOLE Console, BOOL Visible);
/*EOF*/ /*EOF*/