#include "guiconsole.h"
#include <psapi.h>
-/* Public Win32K Headers */
-#include <ntuser.h>
-
#define NDEBUG
#include <debug.h>
+
+/* GUI Console Window Class name */
+#define GUI_CONSOLE_WINDOW_CLASS L"ConsoleWindowClass"
+
+
/* Not defined in any header file */
// extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check);
// From win32ss/user/win32csr/dllmain.c
}
static VOID
-GuiConsoleCreateSysMenu(PCSRSS_CONSOLE Console)
+GuiConsoleCreateSysMenu(PCONSOLE Console)
{
HMENU hMenu;
hMenu = GetSystemMenu(Console->hWindow,
}
static VOID
-GuiConsoleGetDataPointers(HWND hWnd, PCSRSS_CONSOLE *Console, PGUI_CONSOLE_DATA *GuiData)
+GuiConsoleGetDataPointers(HWND hWnd, PCONSOLE *Console, PGUI_CONSOLE_DATA *GuiData)
{
- *Console = (PCSRSS_CONSOLE) GetWindowLongPtrW(hWnd, GWL_USERDATA);
+ *Console = (PCONSOLE)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
*GuiData = (NULL == *Console ? NULL : (*Console)->PrivateData);
}
}
static VOID
-GuiConsoleWriteUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData)
+GuiConsoleWriteUserSettings(PCONSOLE Console, PGUI_CONSOLE_DATA GuiData)
{
HKEY hKey;
PCONSOLE_PROCESS_DATA ProcessData;
}
static void
-GuiConsoleReadUserSettings(HKEY hKey, PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCSRSS_SCREEN_BUFFER Buffer)
+GuiConsoleReadUserSettings(HKEY hKey, PCONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCONSOLE_SCREEN_BUFFER Buffer)
{
DWORD dwNumSubKeys = 0;
DWORD dwIndex;
}
}
static VOID
-GuiConsoleUseDefaults(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCSRSS_SCREEN_BUFFER Buffer)
+GuiConsoleUseDefaults(PCONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCONSOLE_SCREEN_BUFFER Buffer)
{
/*
* init guidata with default properties
VOID
FASTCALL
-GuiConsoleInitScrollbar(PCSRSS_CONSOLE Console, HWND hwnd)
+GuiConsoleInitScrollbar(PCONSOLE Console, HWND hwnd)
{
SCROLLINFO sInfo;
PGUI_CONSOLE_DATA GuiData = Console->PrivateData;
}
static BOOL
-GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
+GuiConsoleHandleNcCreate(HWND hWnd, LPCREATESTRUCTW Create)
{
- PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Create->lpCreateParams;
+ PCONSOLE Console = (PCONSOLE)Create->lpCreateParams;
PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)Console->PrivateData;
HDC Dc;
HFONT OldFont;
DPRINT("Console %p GuiData %p\n", Console, GuiData);
Console->PrivateData = GuiData;
- SetWindowLongPtrW(hWnd, GWL_USERDATA, (DWORD_PTR) Console);
+ SetWindowLongPtrW(hWnd, GWLP_USERDATA, (DWORD_PTR)Console);
SetTimer(hWnd, CONGUI_UPDATE_TIMER, CONGUI_UPDATE_TIME, NULL);
GuiConsoleCreateSysMenu(Console);
}
static VOID
-SmallRectToRect(PCSRSS_CONSOLE Console, PRECT Rect, PSMALL_RECT SmallRect)
+SmallRectToRect(PCONSOLE Console, PRECT Rect, PSMALL_RECT SmallRect)
{
- PCSRSS_SCREEN_BUFFER Buffer = Console->ActiveBuffer;
+ PCONSOLE_SCREEN_BUFFER Buffer = Console->ActiveBuffer;
PGUI_CONSOLE_DATA GuiData = Console->PrivateData;
Rect->left = (SmallRect->Left - Buffer->ShowX) * GuiData->CharWidth;
Rect->top = (SmallRect->Top - Buffer->ShowY) * GuiData->CharHeight;
}
static VOID
-GuiConsoleUpdateSelection(PCSRSS_CONSOLE Console, PCOORD coord)
+GuiConsoleUpdateSelection(PCONSOLE Console, PCOORD coord)
{
RECT oldRect, newRect;
HWND hWnd = Console->hWindow;
static VOID
-GuiConsolePaint(PCSRSS_CONSOLE Console,
+GuiConsolePaint(PCONSOLE Console,
PGUI_CONSOLE_DATA GuiData,
HDC hDC,
PRECT rc)
{
- PCSRSS_SCREEN_BUFFER Buff;
+ PCONSOLE_SCREEN_BUFFER Buff;
ULONG TopLine, BottomLine, LeftChar, RightChar;
ULONG Line, Char, Start;
PBYTE From;
{
HDC hDC;
PAINTSTRUCT ps;
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
hDC = BeginPaint(hWnd, &ps);
static VOID
GuiConsoleHandleKey(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
MSG Message;
}
static VOID WINAPI
-GuiDrawRegion(PCSRSS_CONSOLE Console, SMALL_RECT *Region)
+GuiDrawRegion(PCONSOLE Console, SMALL_RECT *Region)
{
RECT RegionRect;
SmallRectToRect(Console, &RegionRect, Region);
}
static VOID
-GuiInvalidateCell(PCSRSS_CONSOLE Console, UINT x, UINT y)
+GuiInvalidateCell(PCONSOLE Console, UINT x, UINT y)
{
SMALL_RECT CellRect = { x, y, x, y };
GuiDrawRegion(Console, &CellRect);
}
static VOID WINAPI
-GuiWriteStream(PCSRSS_CONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LONG CursorStartY,
+GuiWriteStream(PCONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LONG CursorStartY,
UINT ScrolledLines, CHAR *Buffer, UINT Length)
{
PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA) Console->PrivateData;
- PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer;
+ PCONSOLE_SCREEN_BUFFER Buff = Console->ActiveBuffer;
LONG CursorEndX, CursorEndY;
RECT ScrollRect;
}
static BOOL WINAPI
-GuiSetCursorInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff)
+GuiSetCursorInfo(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buff)
{
if (Console->ActiveBuffer == Buff)
{
}
static BOOL WINAPI
-GuiSetScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, UINT OldCursorX, UINT OldCursorY)
+GuiSetScreenInfo(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buff, UINT OldCursorX, UINT OldCursorY)
{
if (Console->ActiveBuffer == Buff)
{
}
static BOOL WINAPI
-GuiUpdateScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff)
+GuiUpdateScreenInfo(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buff)
{
PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA) Console->PrivateData;
static VOID
GuiConsoleHandleTimer(HWND hWnd)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
- PCSRSS_SCREEN_BUFFER Buff;
+ PCONSOLE_SCREEN_BUFFER Buff;
SetTimer(hWnd, CONGUI_UPDATE_TIMER, CURSOR_BLINK_TIME, NULL);
static VOID
GuiConsoleHandleClose(HWND hWnd)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
PLIST_ENTRY current_entry;
PCONSOLE_PROCESS_DATA current;
static VOID
GuiConsoleHandleNcDestroy(HWND hWnd)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
}
static COORD
-PointToCoord(PCSRSS_CONSOLE Console, LPARAM lParam)
+PointToCoord(PCONSOLE Console, LPARAM lParam)
{
- PCSRSS_SCREEN_BUFFER Buffer = Console->ActiveBuffer;
+ PCONSOLE_SCREEN_BUFFER Buffer = Console->ActiveBuffer;
PGUI_CONSOLE_DATA GuiData = Console->PrivateData;
COORD Coord;
Coord.X = Buffer->ShowX + ((short)LOWORD(lParam) / (int)GuiData->CharWidth);
static VOID
GuiConsoleLeftMouseDown(HWND hWnd, LPARAM lParam)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
GuiConsoleGetDataPointers(hWnd, &Console, &GuiData);
static VOID
GuiConsoleLeftMouseUp(HWND hWnd, LPARAM lParam)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
COORD c;
static VOID
GuiConsoleMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
COORD c;
}
static VOID
-GuiConsoleCopy(HWND hWnd, PCSRSS_CONSOLE Console)
+GuiConsoleCopy(HWND hWnd, PCONSOLE Console)
{
if (OpenClipboard(hWnd) == TRUE)
{
}
static VOID
-GuiConsolePaste(HWND hWnd, PCSRSS_CONSOLE Console)
+GuiConsolePaste(HWND hWnd, PCONSOLE Console)
{
if (OpenClipboard(hWnd) == TRUE)
{
static VOID
GuiConsoleRightMouseDown(HWND hWnd)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
GuiConsoleGetDataPointers(hWnd, &Console, &GuiData);
}
-
static VOID
GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults, PGUI_CONSOLE_DATA GuiData)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
APPLET_PROC CPLFunc;
TCHAR szBuffer[MAX_PATH];
ConsoleInfo SharedInfo;
GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
LRESULT Ret = TRUE;
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
COORD bottomRight = { 0, 0 };
static VOID
GuiConsoleGetMinMaxInfo(HWND hWnd, PMINMAXINFO minMaxInfo)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
DWORD windx, windy;
static VOID
GuiConsoleResize(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
- PCSRSS_CONSOLE Console;
+ PCONSOLE Console;
PGUI_CONSOLE_DATA GuiData;
GuiConsoleGetDataPointers(hWnd, &Console, &GuiData);
if((Console == NULL) || (GuiData == NULL)) return;
if ((GuiData->WindowSizeLock == FALSE) && (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED))
{
- PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer;
+ PCONSOLE_SCREEN_BUFFER Buff = Console->ActiveBuffer;
DWORD windx, windy, charx, chary;
GuiData->WindowSizeLock = TRUE;
}
static NTSTATUS WINAPI
-GuiResizeBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER ScreenBuffer, COORD Size)
+GuiResizeBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer, COORD Size)
{
BYTE * Buffer;
DWORD Offset = 0;
}
static VOID
-GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsoleInfo pConInfo)
+GuiApplyUserSettings(PCONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsoleInfo pConInfo)
{
DWORD windx, windy;
- PCSRSS_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer;
+ PCONSOLE_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer;
COORD BufSize;
BOOL SizeChanged = FALSE;
LRESULT
GuiConsoleHandleScroll(HWND hwnd, UINT uMsg, WPARAM wParam)
{
- PCSRSS_CONSOLE Console;
- PCSRSS_SCREEN_BUFFER Buff;
+ PCONSOLE Console;
+ PCONSOLE_SCREEN_BUFFER Buff;
PGUI_CONSOLE_DATA GuiData;
SCROLLINFO sInfo;
int fnBar;
{
LRESULT Result = 0;
PGUI_CONSOLE_DATA GuiData = NULL;
- PCSRSS_CONSOLE Console = NULL;
+ PCONSOLE Console = NULL;
GuiConsoleGetDataPointers(hWnd, &Console, &GuiData);
switch(msg)
{
case WM_NCCREATE:
- Result = (LRESULT) GuiConsoleHandleNcCreate(hWnd, (CREATESTRUCTW *) lParam);
+ Result = (LRESULT) GuiConsoleHandleNcCreate(hWnd, (LPCREATESTRUCTW)lParam);
break;
case WM_PAINT:
GuiConsoleHandlePaint(hWnd, (HDC)wParam);
LONG WindowCount;
MSG Msg;
PWCHAR Buffer, Title;
- PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) lParam;
-
-
+ PCONSOLE Console = (PCONSOLE) lParam;
switch(msg)
{
Title = L"";
}
NewWindow = CreateWindowExW(WS_EX_CLIENTEDGE,
- L"ConsoleWindowClass",
+ GUI_CONSOLE_WINDOW_CLASS,
Title,
WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
- (HINSTANCE) GetModuleHandleW(NULL),
- (PVOID) Console);
+ (HINSTANCE)GetModuleHandleW(NULL),
+ (PVOID)Console);
if (NULL != Buffer)
{
HeapFree(ConSrvHeap, 0, Buffer);
}
if (NULL != NewWindow)
{
+ SetConsoleWndConsoleLeaderCID(Console);
SetWindowLongW(hWnd, GWL_USERDATA, GetWindowLongW(hWnd, GWL_USERDATA) + 1);
ShowWindow(NewWindow, (int)wParam);
}
- return (LRESULT) NewWindow;
+ 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
GuiInit(VOID)
{
WNDCLASSEXW wc;
+ ATOM ConsoleClassAtom;
if (NULL == NotifyWnd)
{
wc.hIconSm = NULL;
if (RegisterClassExW(&wc) == 0)
{
- DPRINT1("Failed to register notify wndproc\n");
+ DPRINT1("Failed to register GUI notify wndproc\n");
return FALSE;
}
wc.cbSize = sizeof(WNDCLASSEXW);
- wc.lpszClassName = L"ConsoleWindowClass";
+ wc.lpszClassName = GUI_CONSOLE_WINDOW_CLASS;
wc.lpfnWndProc = GuiConsoleWndProc;
wc.style = 0;
wc.hInstance = (HINSTANCE)GetModuleHandleW(NULL);
wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
+ wc.cbWndExtra = GWLP_CONSOLEWND_ALLOC;
wc.hIconSm = LoadImageW(ConSrvDllInstance, MAKEINTRESOURCEW(1), IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
LR_SHARED);
- if (RegisterClassExW(&wc) == 0)
+
+ ConsoleClassAtom = RegisterClassExW(&wc);
+ if (ConsoleClassAtom == 0)
{
- DPRINT1("Failed to register console wndproc\n");
+ DPRINT1("Failed to register GUI console wndproc\n");
return FALSE;
}
+ else
+ {
+ NtUserConsoleControl(GuiConsoleWndClassAtom, &ConsoleClassAtom, sizeof(ATOM));
+ }
return TRUE;
}
static VOID WINAPI
-GuiInitScreenBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buffer)
+GuiInitScreenBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buffer)
{
Buffer->DefaultAttrib = DEFAULT_ATTRIB;
}
static BOOL WINAPI
-GuiChangeTitle(PCSRSS_CONSOLE Console)
+GuiChangeTitle(PCONSOLE Console)
{
PWCHAR Buffer, Title;
}
static BOOL WINAPI
-GuiChangeIcon(PCSRSS_CONSOLE Console, HICON hWindowIcon)
+GuiChangeIcon(PCONSOLE Console, HICON hWindowIcon)
{
SendMessageW(Console->hWindow, WM_SETICON, ICON_BIG, (LPARAM)hWindowIcon);
SendMessageW(Console->hWindow, WM_SETICON, ICON_SMALL, (LPARAM)hWindowIcon);
}
static VOID WINAPI
-GuiCleanupConsole(PCSRSS_CONSOLE Console)
+GuiCleanupConsole(PCONSOLE Console)
{
SendMessageW(NotifyWnd, PM_DESTROY_CONSOLE, 0, (LPARAM)Console);
}
-static CSRSS_CONSOLE_VTBL GuiVtbl =
+static CONSOLE_VTBL GuiVtbl =
{
GuiInitScreenBuffer,
GuiWriteStream,
};
NTSTATUS FASTCALL
-GuiInitConsole(PCSRSS_CONSOLE Console, int ShowCmd)
+GuiInitConsole(PCONSOLE Console, int ShowCmd)
{
HANDLE GraphicsStartupEvent;
HANDLE ThreadHandle;
PGUI_CONSOLE_DATA GuiData;
- if (! ConsInitialized)
+ if (!ConsInitialized)
{
ConsInitialized = TRUE;
- if (! GuiInit())
+ if (!GuiInit())
{
ConsInitialized = FALSE;
return STATUS_UNSUCCESSFUL;
}
Console->Vtbl = &GuiVtbl;
+ Console->hWindow = NULL;
if (NULL == NotifyWnd)
{
GraphicsStartupEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
ThreadHandle = CreateThread(NULL,
0,
GuiConsoleGuiThread,
- (PVOID) &GraphicsStartupEvent,
+ (PVOID)&GraphicsStartupEvent,
0,
NULL);
if (NULL == ThreadHandle)
return STATUS_UNSUCCESSFUL;
}
- Console->PrivateData = (PVOID) GuiData;
+ Console->PrivateData = (PVOID)GuiData;
/*
- * we need to wait untill the GUI has been fully initialized
+ * we need to wait until the GUI has been fully initialized
* to retrieve custom settings i.e. WindowSize etc..
* Ideally we could use SendNotifyMessage for this but its not
* yet implemented.
/* create console */
PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, ShowCmd, (LPARAM)Console);
- /* wait untill initialization has finished */
+ /* wait until initialization has finished */
WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE);
DPRINT("received event Console %p GuiData %p X %d Y %d\n", Console, Console->PrivateData, Console->Size.X, Console->Size.Y);
CloseHandle(GuiData->hGuiInitEvent);