24 #define CONGUI_UPDATE_TIME 0 25 #define CONGUI_UPDATE_TIMER 1 27 #define PM_CREATE_CONSOLE (WM_APP + 1) 28 #define PM_DESTROY_CONSOLE (WM_APP + 2) 125 DesktopConsoleThreadInfo.
ThreadId = InputThreadId;
127 &DesktopConsoleThreadInfo,
128 sizeof(DesktopConsoleThreadInfo));
133 if (pcsrt ==
NULL)
goto Quit;
154 DPRINT(
"PM_CREATE_CONSOLE -- creating window\n");
168 if (NewWindow ==
NULL)
170 DPRINT1(
"Failed to create a new console window\n");
174 ASSERT(NewWindow == GuiData->hWindow);
185 GuiData->GuiInfo.WindowOrigin.x = rcWnd.left;
186 GuiData->GuiInfo.WindowOrigin.y = rcWnd.top;
188 if (GuiData->IsWindowVisible)
199 if (GuiData->IsWindowVisible)
205 DPRINT(
"PM_CREATE_CONSOLE -- showing window\n");
210 DPRINT(
"PM_CREATE_CONSOLE -- hidden window\n");
243 DPRINT(
"CONSRV: Going to quit the Input Thread 0x%p\n", InputThreadId);
256 DPRINT(
"CONSRV: Quit the Input Thread 0x%p, Status = 0x%08lx\n", InputThreadId,
Status);
260 DesktopConsoleThreadInfo.
ThreadId = 0;
262 &DesktopConsoleThreadInfo,
263 sizeof(DesktopConsoleThreadInfo));
272 DPRINT1(
"WARNING!! hThread (0x%p) != pcsrt->ThreadHandle (0x%p), you may expect crashes soon!!\n",
hThread, pcsrt->
ThreadHandle);
285 IN HANDLE ConsoleLeaderProcessHandle,
319 if (ConsoleInitInfo->DesktopLength)
323 DesktopPath.
Buffer = ConsoleInitInfo->Desktop;
334 DPRINT(
"NtUserResolveDesktop(DesktopPath = '%wZ') returned hDesk = 0x%p; hWinSta = 0x%p\n",
335 &DesktopPath, hDesk, hWinSta);
348 &DesktopConsoleThreadInfo,
349 sizeof(DesktopConsoleThreadInfo));
350 DPRINT(
"NtUserConsoleControl returned ThreadId = 0x%p\n", DesktopConsoleThreadInfo.
ThreadId);
356 GuiInitInfo->WinSta = hWinSta;
357 GuiInitInfo->Desktop = hDesk;
362 if (DesktopConsoleThreadInfo.
ThreadId != 0)
365 DPRINT(
"Using input thread InputThreadId = 0x%p\n", DesktopConsoleThreadInfo.
ThreadId);
366 GuiInitInfo->InputThreadId = DesktopConsoleThreadInfo.
ThreadId;
395 (
PHANDLE)&GuiInitInfo->Desktop,
421 DPRINT(
"Thread creation hInputThread = 0x%p, InputThreadId = 0x%p, Status = 0x%08lx\n",
427 if (hInputThread)
NtClose(hInputThread);
433 NtClose(GuiInitInfo->GuiThreadStartupEvent);
435 DPRINT1(
"CONSRV: Failed to create graphics console thread.\n");
444 NtClose(GuiInitInfo->GuiThreadStartupEvent);
451 GuiInitInfo->WinSta = hWinSta;
452 GuiInitInfo->Desktop = hDesk;
491 GuiInitInfo =
This->Context2;
497 DPRINT1(
"CONSRV: Failed to create GUI_CONSOLE_DATA\n");
556 This->Context = GuiData;
571 DPRINT(
"GUI - Checkpoint\n");
578 DPRINT(
"OK we created the console window\n");
579 NtClose(GuiData->hGuiInitEvent);
580 GuiData->hGuiInitEvent =
NULL;
583 if (GuiData->hWindow ==
NULL)
585 DPRINT(
"GuiInitConsole - We failed at creating a new terminal window\n");
598 DPRINT(
"Send PM_DESTROY_CONSOLE message and wait on hGuiTermEvent...\n");
601 DPRINT(
"hGuiTermEvent set\n");
602 NtClose(GuiData->hGuiTermEvent);
603 GuiData->hGuiTermEvent =
NULL;
608 DPRINT(
"Destroying icons !! - GuiData->hIcon = 0x%p ; ghDefaultIcon = 0x%p ; GuiData->hIconSm = 0x%p ; ghDefaultIconSm = 0x%p\n",
612 DPRINT(
"Destroy hIcon\n");
617 DPRINT(
"Destroy hIconSm\n");
625 DPRINT(
"Quit GuiDeinitFrontEnd\n");
651 SHORT CursorEndX, CursorEndY;
662 if (0 != ScrolledLines)
681 if (CursorStartX < Region->Left ||
Region->Right < CursorStartX
682 || CursorStartY < Region->
Top ||
Region->Bottom < CursorStartY)
689 if ((CursorEndX < Region->Left ||
Region->Right < CursorEndX
690 || CursorEndY < Region->
Top ||
Region->Bottom < CursorEndY)
691 && (CursorEndX != CursorStartX || CursorEndY != CursorStartY))
784 DPRINT(
"GuiSetActiveScreenBuffer using palette 0x%p\n", hPalette);
883 if (IconHandle ==
NULL)
911 DPRINT(
"Set icons in GuiChangeIcon\n");
942 UINT WidthUnit, HeightUnit;
950 MonitorInfo.
cbSize =
sizeof(MonitorInfo);
982 WidthUnit = HeightUnit = 1;
988 if (Width < 0) Width = 0;
989 if (Height < 0) Height = 0;
991 pSize->
X = (
SHORT)(Width / (
int)WidthUnit ) + 2;
992 pSize->
Y = (
SHORT)(Height / (
int)HeightUnit) + 1;
1001 if (pSelectionInfo ==
NULL)
return FALSE;
1003 ZeroMemory(pSelectionInfo,
sizeof(*pSelectionInfo));
1016 HPALETTE OldPalette;
1180 IN HANDLE ConsoleLeaderProcessHandle)
1189 ConsoleStartInfo = ConsoleInitInfo->ConsoleStartInfo;
1199 if (!
GuiInit(ConsoleInitInfo, ConsoleLeaderProcessHandle, GuiInitInfo))
1212 sizeof(UserObjectFlags),
1238 if ((ConsoleStartInfo->dwStartupFlags & STARTF_TITLEISLINKNAME) == 0)
1258 ConsoleInfo->WindowPosition.x = ConsoleStartInfo->dwWindowOrigin.X;
1259 ConsoleInfo->WindowPosition.y = ConsoleStartInfo->dwWindowOrigin.Y;
1287 GuiInitInfo->
hIcon = ConsoleStartInfo->hIcon;
1292 GuiInitInfo->
hIconSm = ConsoleStartInfo->hIconSm;
1300 FrontEnd->Context =
NULL;
1301 FrontEnd->Context2 = GuiInitInfo;
static FRONTEND_VTBL GuiVtbl
static VOID NTAPI GuiReleaseScreenBuffer(IN OUT PFRONTEND This, IN PCONSOLE_SCREEN_BUFFER ScreenBuffer)
VOID GuiConsoleGetDefaultSettings(IN OUT PGUI_CONSOLE_INFO TermInfo)
#define STARTF_RUNFULLSCREEN
STRSAFEAPI StringCchCopyNW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, size_t cchToCopy)
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define CONSOLE_WINDOWED_MODE
BOOL WINAPI GetUserObjectInformationW(_In_ HANDLE hObj, _In_ int nIndex, _Out_writes_bytes_opt_(nLength) PVOID pvInfo, _In_ DWORD nLength, _Out_opt_ LPDWORD lpnLengthNeeded)
VOID CreateSysMenu(HWND hWnd)
BOOL IsCloseButtonEnabled
_In_ ULONG _In_ ULONG _In_ ULONG Length
static VOID NTAPI GuiSetActiveScreenBuffer(IN OUT PFRONTEND This)
BOOLEAN RegisterConWndClass(IN HINSTANCE hInstance)
UINT WINAPI SetSystemPaletteUse(_In_ HDC, _In_ UINT)
static HWND NTAPI GuiGetConsoleWindowHandle(IN OUT PFRONTEND This)
PCONSOLE_SCREEN_BUFFER ConDrvGetActiveScreenBuffer(IN PCONSOLE Console)
NTSYSAPI VOID NTAPI RtlExitUserThread(_In_ NTSTATUS Status)
static VOID NTAPI GuiDeinitFrontEnd(IN OUT PFRONTEND This)
BOOL WINAPI DestroyIcon(_In_ HICON)
#define CONSOLE_FULLSCREEN_HARDWARE
#define STATUS_INVALID_PARAMETER
struct _GUI_CONSOLE_DATA * PGUI_CONSOLE_DATA
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define PM_CREATE_CONSOLE
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
#define ConsoleAllocHeap(Flags, Size)
BOOLEAN NTAPI CsrRevertToSelf(VOID)
static NTSTATUS NTAPI GuiInitFrontEnd(IN OUT PFRONTEND This, IN PCONSRV_CONSOLE Console)
NTSTATUS NTAPI NtCreateEvent(OUT PHANDLE EventHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN EVENT_TYPE EventType, IN BOOLEAN InitialState)
#define CONGUI_UPDATE_TIME
NTSTATUS NTAPI GuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd)
struct _GUI_INIT_INFO * PGUI_INIT_INFO
#define INVALID_HANDLE_VALUE
#define STARTF_USEPOSITION
VOID NTAPI GuiRingBell(IN OUT PFRONTEND This)
GLint GLint GLint GLint GLint x
#define CONSOLE_NO_SELECTION
BOOL IgnoreNextMouseSignal
VOID NTAPI CsrDereferenceThread(IN PCSR_THREAD CsrThread)
CONSOLE_SELECTION_INFO Selection
#define PM_RESIZE_TERMINAL
static HPALETTE PaletteHandle
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
BOOL WINAPI DestroyWindow(_In_ HWND)
VOID InitTTFontCache(VOID)
BOOL WINAPI SetThreadDesktop(_In_ HDESK)
static VOID NTAPI GuiDrawRegion(IN OUT PFRONTEND This, SMALL_RECT *Region)
static BOOL NTAPI GuiSetMenuClose(IN OUT PFRONTEND This, BOOL Enable)
BOOL WINAPI ShowWindowAsync(_In_ HWND, _In_ int)
long __cdecl _InterlockedIncrement(_Interlocked_operand_ long volatile *_Addend)
PCSR_THREAD NTAPI CsrAddStaticServerThread(IN HANDLE hThread, IN PCLIENT_ID ClientId, IN ULONG ThreadFlags)
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define DUPLICATE_SAME_ACCESS
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
static BOOL NTAPI GuiSetScreenInfo(IN OUT PFRONTEND This, PCONSOLE_SCREEN_BUFFER Buff, SHORT OldCursorX, SHORT OldCursorY)
GUI_CONSOLE_INFO TermInfo
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
BOOL HackCORE8394IgnoreNextMove
static VOID NTAPI GuiRefreshInternalInfo(IN OUT PFRONTEND This)
static HMENU NTAPI GuiMenuControl(IN OUT PFRONTEND This, UINT CmdIdLow, UINT CmdIdHigh)
NTSTATUS APIENTRY NtUserConsoleControl(IN CONSOLECONTROL ConsoleCtrl, IN PVOID ConsoleCtrlInfo, IN ULONG ConsoleCtrlInfoLength)
static INT NTAPI GuiShowMouseCursor(IN OUT PFRONTEND This, BOOL Show)
PCONSOLE_SCREEN_BUFFER ActiveBuffer
static VOID NTAPI GuiWriteStream(IN OUT PFRONTEND This, SMALL_RECT *Region, SHORT CursorStartX, SHORT CursorStartY, UINT ScrolledLines, PWCHAR Buffer, UINT Length)
long __cdecl _InterlockedDecrement(_Interlocked_operand_ long volatile *_Addend)
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
HPALETTE WINAPI SelectPalette(_In_ HDC, _In_ HPALETTE, _In_ BOOL)
struct _GUI_INIT_INFO GUI_INIT_INFO
HDESK NTAPI NtUserResolveDesktop(IN HANDLE ProcessHandle, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta)
NTSTATUS NTAPI GuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd, IN OUT PCONSOLE_STATE_INFO ConsoleInfo, IN OUT PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle)
int WINAPI ScrollWindowEx(_In_ HWND, _In_ int, _In_ int, _In_opt_ LPCRECT, _In_opt_ LPCRECT, _In_opt_ HRGN, _Out_opt_ LPRECT, _In_ UINT)
#define STARTF_USESHOWWINDOW
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define PM_DESTROY_CONSOLE
#define NtCurrentProcess()
VOID SwitchFullScreen(PGUI_CONSOLE_DATA GuiData, BOOL FullScreen)
static BOOL NTAPI GuiChangeIcon(IN OUT PFRONTEND This, HICON IconHandle)
#define InterlockedExchangePointer(Target, Value)
NTSTATUS NTAPI NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
_Out_ PCLIENT_ID ClientId
NTSTATUS NTAPI NtSetEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define NT_SUCCESS(StatCode)
BOOL WINAPI GetMonitorInfoW(_In_ HMONITOR, _Inout_ LPMONITORINFO)
static HDESK NTAPI GuiGetThreadConsoleDesktop(IN OUT PFRONTEND This)
static BOOL NTAPI GuiSetMouseCursor(IN OUT PFRONTEND This, HCURSOR CursorHandle)
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
int WINAPI GetSystemMetrics(_In_ int)
static ULONG NTAPI GuiConsoleInputThread(PVOID Param)
BOOLEAN UnRegisterConWndClass(HINSTANCE hInstance)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define STATUS_UNSUCCESSFUL
static VIDEODISPLAYMODE DisplayMode
static VOID NTAPI GuiGetLargestConsoleWindowSize(IN OUT PFRONTEND This, PCOORD pSize)
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
HANDLE GuiThreadStartupEvent
static BOOL GuiInit(IN PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle, IN OUT PGUI_INIT_INFO GuiInitInfo)
NTSYSAPI NTSTATUS NTAPI RtlCreateUserThread(_In_ PVOID ThreadContext, _Out_ HANDLE *OutThreadHandle, _Reserved_ PVOID Reserved1, _Reserved_ PVOID Reserved2, _Reserved_ PVOID Reserved3, _Reserved_ PVOID Reserved4, _Reserved_ PVOID Reserved5, _Reserved_ PVOID Reserved6, _Reserved_ PVOID Reserved7, _Reserved_ PVOID Reserved8)
static BOOL NTAPI GuiSetPalette(IN OUT PFRONTEND This, HPALETTE PaletteHandle, UINT PaletteUsage)
#define CONGUI_UPDATE_TIMER
VOID SetConWndConsoleLeaderCID(IN PGUI_CONSOLE_DATA GuiData)
FORCEINLINE VOID GetScreenBufferSizeUnits(IN PCONSOLE_SCREEN_BUFFER Buffer, IN PGUI_CONSOLE_DATA GuiData, OUT PUINT WidthUnit, OUT PUINT HeightUnit)
HICON WINAPI CopyIcon(_In_ HICON)
VOID InvalidateCell(PGUI_CONSOLE_DATA GuiData, SHORT x, SHORT y)
PCSR_THREAD NTAPI CsrConnectToUser(VOID)
static BOOL NTAPI GuiSetCursorInfo(IN OUT PFRONTEND This, PCONSOLE_SCREEN_BUFFER Buff)
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
static VOID NTAPI GuiChangeTitle(IN OUT PFRONTEND This)
static ULONG NTAPI GuiGetDisplayMode(IN OUT PFRONTEND This)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
WCHAR FaceName[LF_FACESIZE]
#define CONSOLE_FULLSCREEN_MODE
GLint GLint GLint GLint GLint GLint y
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
#define ConsoleFreeHeap(HeapBase)
HINSTANCE ConSrvDllInstance
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
NTSTATUS NTAPI NtDuplicateObject(IN HANDLE SourceProcessHandle, IN HANDLE SourceHandle, IN HANDLE TargetProcessHandle OPTIONAL, OUT PHANDLE TargetHandle OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG HandleAttributes, IN ULONG Options)
BOOL WINAPI CloseDesktop(_In_ HDESK)
static BOOL NTAPI GuiSetDisplayMode(IN OUT PFRONTEND This, ULONG NewMode)
#define WS_OVERLAPPEDWINDOW
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
BOOLEAN NTAPI CsrImpersonateClient(IN PCSR_THREAD CsrThread)
#define RtlZeroMemory(Destination, Length)
#define PM_CONSOLE_SET_TITLE
#define RtlCopyMemory(Destination, Source, Length)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
static VOID NTAPI GuiResizeTerminal(IN OUT PFRONTEND This)
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
static BOOL ConsInitialized
BOOL GuiConsoleReadUserSettings(IN OUT PGUI_CONSOLE_INFO TermInfo)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
BOOL WINAPI PostThreadMessageW(_In_ DWORD, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
UINT WINAPI RealizePalette(_In_ HDC)
#define SendNotifyMessage
HGDIOBJ WINAPI GetCurrentObject(_In_ HDC, _In_ UINT)
BOOL WINAPI CloseWindowStation(_In_ HWINSTA)
static BOOL NTAPI GuiGetSelectionInfo(IN OUT PFRONTEND This, PCONSOLE_SELECTION_INFO pSelectionInfo)
FORCEINLINE VOID SmallRectToRect(PGUI_CONSOLE_DATA GuiData, PRECT Rect, PSMALL_RECT SmallRect)
static VOID DrawRegion(PGUI_CONSOLE_DATA GuiData, SMALL_RECT *Region)
VOID GuiConsoleMoveWindow(PGUI_CONSOLE_DATA GuiData)
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)