#define NDEBUG
#include <debug.h>
+
+/* TUI Console Window Class name */
+#define TUI_CONSOLE_WINDOW_CLASS L"TuiConsoleWindowClass"
+
+
CRITICAL_SECTION ActiveConsoleLock;
static COORD PhysicalConsoleSize;
static HANDLE ConsoleDeviceHandle;
-static PCSRSS_CONSOLE ActiveConsole;
+static PCONSOLE ActiveConsole;
static BOOL ConsInitialized = FALSE;
CONSOLE_SCREEN_BUFFER_INFO ScrInfo;
DWORD BytesReturned;
WNDCLASSEXW wc;
+ ATOM ConsoleClassAtom;
USHORT TextAttribute = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
TuiStartService(L"Blue");
ActiveConsole = NULL;
InitializeCriticalSection(&ActiveConsoleLock);
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO,
- NULL, 0, &ScrInfo, sizeof(ScrInfo), &BytesReturned, NULL))
+ if (!DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO,
+ NULL, 0, &ScrInfo, sizeof(ScrInfo), &BytesReturned, NULL))
{
DPRINT1("Failed to get console info\n");
return FALSE;
RtlZeroMemory(&wc, sizeof(WNDCLASSEXW));
wc.cbSize = sizeof(WNDCLASSEXW);
- wc.lpszClassName = L"TuiConsoleWindowClass";
+ wc.lpszClassName = TUI_CONSOLE_WINDOW_CLASS;
wc.lpfnWndProc = TuiConsoleWndProc;
- wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL);
- if (RegisterClassExW(&wc) == 0)
+ wc.cbWndExtra = GWLP_CONSOLEWND_ALLOC;
+ wc.hInstance = (HINSTANCE)GetModuleHandleW(NULL);
+
+ ConsoleClassAtom = RegisterClassExW(&wc);
+ if (ConsoleClassAtom == 0)
{
- DPRINT1("Failed to register console wndproc\n");
+ DPRINT1("Failed to register TUI console wndproc\n");
return FALSE;
}
+ else
+ {
+ NtUserConsoleControl(TuiConsoleWndClassAtom, &ConsoleClassAtom, sizeof(ATOM));
+ }
return TRUE;
}
static VOID WINAPI
-TuiInitScreenBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buffer)
+TuiInitScreenBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buffer)
{
Buffer->DefaultAttrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
}
static void FASTCALL
-TuiCopyRect(char *Dest, PCSRSS_SCREEN_BUFFER Buff, SMALL_RECT *Region)
+TuiCopyRect(char *Dest, PCONSOLE_SCREEN_BUFFER Buff, SMALL_RECT *Region)
{
UINT SrcDelta, DestDelta;
LONG i;
}
static VOID WINAPI
-TuiDrawRegion(PCSRSS_CONSOLE Console, SMALL_RECT *Region)
+TuiDrawRegion(PCONSOLE Console, SMALL_RECT *Region)
{
DWORD BytesReturned;
- PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer;
+ PCONSOLE_SCREEN_BUFFER Buff = Console->ActiveBuffer;
PCONSOLE_DRAW ConsoleDraw;
UINT ConsoleDrawSize;
TuiCopyRect((char *) (ConsoleDraw + 1), Buff, Region);
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_DRAW,
- NULL, 0, ConsoleDraw, ConsoleDrawSize, &BytesReturned, NULL))
+ if (!DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_DRAW,
+ NULL, 0, ConsoleDraw, ConsoleDrawSize, &BytesReturned, NULL))
{
DPRINT1("Failed to draw console\n");
HeapFree(ConSrvHeap, 0, ConsoleDraw);
}
static VOID WINAPI
-TuiWriteStream(PCSRSS_CONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LONG CursorStartY,
+TuiWriteStream(PCONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LONG CursorStartY,
UINT ScrolledLines, CHAR *Buffer, UINT Length)
{
DWORD BytesWritten;
- PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer;
+ PCONSOLE_SCREEN_BUFFER Buff = Console->ActiveBuffer;
if (ActiveConsole->ActiveBuffer != Buff)
{
}
static BOOL WINAPI
-TuiSetCursorInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff)
+TuiSetCursorInfo(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buff)
{
CONSOLE_CURSOR_INFO Info;
DWORD BytesReturned;
Info.dwSize = ConioEffectiveCursorSize(Console, 100);
Info.bVisible = Buff->CursorInfo.bVisible;
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_CURSOR_INFO,
- &Info, sizeof(Info), NULL, 0, &BytesReturned, NULL))
+ if (!DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_CURSOR_INFO,
+ &Info, sizeof(Info), NULL, 0, &BytesReturned, NULL))
{
DPRINT1( "Failed to set cursor info\n" );
return FALSE;
}
static BOOL WINAPI
-TuiSetScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, UINT OldCursorX, UINT OldCursorY)
+TuiSetScreenInfo(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buff, UINT OldCursorX, UINT OldCursorY)
{
CONSOLE_SCREEN_BUFFER_INFO Info;
DWORD BytesReturned;
Info.dwCursorPosition.Y = Buff->CurrentY;
Info.wAttributes = Buff->DefaultAttrib;
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO,
- &Info, sizeof(CONSOLE_SCREEN_BUFFER_INFO), NULL, 0,
- &BytesReturned, NULL))
+ if (!DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO,
+ &Info, sizeof(CONSOLE_SCREEN_BUFFER_INFO), NULL, 0,
+ &BytesReturned, NULL))
{
DPRINT1( "Failed to set cursor position\n" );
return FALSE;
}
static BOOL WINAPI
-TuiUpdateScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff)
+TuiUpdateScreenInfo(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buff)
{
return TRUE;
}
static BOOL WINAPI
-TuiChangeTitle(PCSRSS_CONSOLE Console)
+TuiChangeTitle(PCONSOLE Console)
{
return TRUE;
}
static VOID WINAPI
-TuiCleanupConsole(PCSRSS_CONSOLE Console)
+TuiCleanupConsole(PCONSOLE Console)
{
DestroyWindow(Console->hWindow);
}
static BOOL WINAPI
-TuiChangeIcon(PCSRSS_CONSOLE Console, HICON hWindowIcon)
+TuiChangeIcon(PCONSOLE Console, HICON hWindowIcon)
{
return TRUE;
}
static NTSTATUS WINAPI
-TuiResizeBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER ScreenBuffer, COORD Size)
+TuiResizeBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer, COORD Size)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
DWORD WINAPI
-TuiConsoleThread (PVOID Data)
+TuiConsoleThread(PVOID Data)
{
- PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Data;
+ PCONSOLE Console = (PCONSOLE) Data;
HWND NewWindow;
MSG msg;
- NewWindow = CreateWindowW(L"TuiConsoleWindowClass",
+ NewWindow = CreateWindowW(TUI_CONSOLE_WINDOW_CLASS,
Console->Title.Buffer,
0,
-32000, -32000, 0, 0,
NULL, NULL,
- (HINSTANCE) GetModuleHandleW(NULL),
- (PVOID) Console);
- Console->hWindow = NewWindow;
+ (HINSTANCE)GetModuleHandleW(NULL),
+ (PVOID)Console);
if (NULL == NewWindow)
{
DPRINT1("CSR: Unable to create console window\n");
return 1;
}
+ Console->hWindow = NewWindow;
+ SetConsoleWndConsoleLeaderCID(Console);
SetForegroundWindow(Console->hWindow);
return 0;
}
-static CSRSS_CONSOLE_VTBL TuiVtbl =
+static CONSOLE_VTBL TuiVtbl =
{
TuiInitScreenBuffer,
TuiWriteStream,
};
NTSTATUS FASTCALL
-TuiInitConsole(PCSRSS_CONSOLE Console)
+TuiInitConsole(PCONSOLE Console)
{
HANDLE ThreadHandle;
- if (! ConsInitialized)
+ if (!ConsInitialized)
{
ConsInitialized = TRUE;
- if (! TuiInit(Console->CodePage))
+ if (!TuiInit(Console->CodePage))
{
ConsInitialized = FALSE;
return STATUS_UNSUCCESSFUL;
Console->ActiveBuffer->MaxX = PhysicalConsoleSize.X;
Console->ActiveBuffer->MaxY = PhysicalConsoleSize.Y;
- ThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) TuiConsoleThread,
- Console, 0, NULL);
+ ThreadHandle = CreateThread(NULL,
+ 0,
+ TuiConsoleThread,
+ (PVOID)Console,
+ 0,
+ NULL);
if (NULL == ThreadHandle)
{
DPRINT1("CSR: Unable to create console thread\n");
return STATUS_SUCCESS;
}
-PCSRSS_CONSOLE FASTCALL
+PCONSOLE FASTCALL
TuiGetFocusConsole(VOID)
{
return ActiveConsole;
BOOL FASTCALL
TuiSwapConsole(int Next)
{
- static PCSRSS_CONSOLE SwapConsole = NULL; /* console we are thinking about swapping with */
+ static PCONSOLE SwapConsole = NULL; /* console we are thinking about swapping with */
DWORD BytesReturned;
ANSI_STRING Title;
void * Buffer;
pos->X = (PhysicalConsoleSize.X - Title.Length) / 2;
/* redraw the console to clear off old title */
ConioDrawConsole(ActiveConsole);
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
- NULL, 0, Buffer, sizeof(COORD) + Title.Length,
- &BytesReturned, NULL))
+ if (!DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
+ NULL, 0, Buffer, sizeof(COORD) + Title.Length,
+ &BytesReturned, NULL))
{
DPRINT1( "Error writing to console\n" );
}