BOOL InsertNewConsole( HWND hWnd, HANDLE hConsole, HWND hWndConsole ) { // conime receive ime message from console before 1st console registered. // this will happen after restart conime when conime dead by bogus ime's AV or // other problem // so this fail safe code is necessary to protect consrv. if (SearchConsole(hConsole) != NULL) { return TRUE; } LockConsoleTable(); if (!InsertConsole(hWnd, hConsole, hWndConsole)) { UnlockConsoleTable(); return FALSE; } #ifdef DEBUG_MODE DisplayInformation(hWnd, hConsole); #endif ImeUISetOpenStatus( hWndConsole ); UnlockConsoleTable(); return TRUE; }
NTSTATUS NTAPI ConDrvInitConsole(OUT PCONSOLE* NewConsole, IN PCONSOLE_INFO ConsoleInfo) { NTSTATUS Status; // CONSOLE_INFO CapturedConsoleInfo; TEXTMODE_BUFFER_INFO ScreenBufferInfo; PCONSOLE Console; PCONSOLE_SCREEN_BUFFER NewBuffer; if (NewConsole == NULL || ConsoleInfo == NULL) return STATUS_INVALID_PARAMETER; *NewConsole = NULL; /* * Allocate a new console */ Console = ConsoleAllocHeap(HEAP_ZERO_MEMORY, sizeof(*Console)); if (NULL == Console) { DPRINT1("Not enough memory for console creation.\n"); return STATUS_NO_MEMORY; } /* * Fix the screen buffer size if needed. The rule is: * ScreenBufferSize >= ConsoleSize */ if (ConsoleInfo->ScreenBufferSize.X < ConsoleInfo->ConsoleSize.X) ConsoleInfo->ScreenBufferSize.X = ConsoleInfo->ConsoleSize.X; if (ConsoleInfo->ScreenBufferSize.Y < ConsoleInfo->ConsoleSize.Y) ConsoleInfo->ScreenBufferSize.Y = ConsoleInfo->ConsoleSize.Y; /* * Initialize the console */ Console->State = CONSOLE_INITIALIZING; Console->ReferenceCount = 0; InitializeCriticalSection(&Console->Lock); /* Initialize the terminal interface */ ResetTerminal(Console); Console->ConsoleSize = ConsoleInfo->ConsoleSize; Console->FixedSize = FALSE; // Value by default; is reseted by the terminals if needed. /* Initialize the input buffer */ Status = ConDrvInitInputBuffer(Console, 0 /* ConsoleInfo->InputBufferSize */); if (!NT_SUCCESS(Status)) { DPRINT1("ConDrvInitInputBuffer: failed, Status = 0x%08lx\n", Status); DeleteCriticalSection(&Console->Lock); ConsoleFreeHeap(Console); return Status; } /* Set-up the code page */ Console->InputCodePage = Console->OutputCodePage = ConsoleInfo->CodePage; /* Initialize a new text-mode screen buffer with default settings */ ScreenBufferInfo.ScreenBufferSize = ConsoleInfo->ScreenBufferSize; ScreenBufferInfo.ScreenAttrib = ConsoleInfo->ScreenAttrib; ScreenBufferInfo.PopupAttrib = ConsoleInfo->PopupAttrib; ScreenBufferInfo.IsCursorVisible = TRUE; ScreenBufferInfo.CursorSize = ConsoleInfo->CursorSize; InitializeListHead(&Console->BufferList); Status = ConDrvCreateScreenBuffer(&NewBuffer, Console, NULL, CONSOLE_TEXTMODE_BUFFER, &ScreenBufferInfo); if (!NT_SUCCESS(Status)) { DPRINT1("ConDrvCreateScreenBuffer: failed, Status = 0x%08lx\n", Status); ConDrvDeinitInputBuffer(Console); DeleteCriticalSection(&Console->Lock); ConsoleFreeHeap(Console); return Status; } /* Make the new screen buffer active */ Console->ActiveBuffer = NewBuffer; Console->UnpauseEvent = NULL; DPRINT("Console initialized\n"); /* All went right, so add the console to the list */ Status = InsertConsole(Console); if (!NT_SUCCESS(Status)) { /* Fail */ ConDrvDeleteConsole(Console); return Status; } /* The initialization is finished */ DPRINT("Change state\n"); Console->State = CONSOLE_RUNNING; /* Return the newly created console to the caller and a success code too */ *NewConsole = Console; return STATUS_SUCCESS; }