36#define ConsoleInputUnicodeCharToAnsiChar(Console, dChar, sWChar) \
38 ASSERT((ULONG_PTR)(dChar) != (ULONG_PTR)(sWChar)); \
39 WideCharToMultiByte((Console)->InputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL); \
42#define ConsoleInputAnsiCharToUnicodeChar(Console, dWChar, sChar) \
44 ASSERT((ULONG_PTR)(dWChar) != (ULONG_PTR)(sChar)); \
45 MultiByteToWideChar((Console)->InputCodePage, 0, (sChar), 1, (dWChar), 1); \
97 IN HANDLE ConsoleLeaderProcessHandle);
106 IN HANDLE ConsoleLeaderProcessHandle);
115 IN HANDLE ConsoleLeaderProcessHandle);
145#ifdef TUITERM_COMPILE
146 {
"TUI", TuiLoadFrontEnd, TuiUnloadFrontEnd},
157 IN HANDLE ConsoleLeaderProcessHandle)
167 DPRINT(
"CONSRV: Trying to load %s frontend...\n",
172 ConsoleLeaderProcessHandle);
178 DPRINT(
"CONSRV: %s frontend loaded successfully\n",
184 DPRINT1(
"CONSRV: Loading %s frontend failed, Status = 0x%08lx , continuing...\n",
197 return FrontEnd->UnloadFrontEnd(FrontEnd);
207 IN HANDLE ConsoleLeaderProcessHandle)
219 ConsoleLeaderProcessHandle);
222 DPRINT1(
"CONSRV: Failed to initialize a frontend, Status = 0x%08lx\n",
Status);
226 DPRINT(
"CONSRV: Frontend initialized\n");
231 Terminal->Context = FrontEnd;
243 Terminal->Context =
NULL;
244 Terminal->Vtbl =
NULL;
247 if (FrontEnd !=
NULL)
268 FrontEnd->
Console = ConSrvConsole;
271 DPRINT(
"Using FrontEndIFace HACK(1), should be removed after proper implementation!\n");
274 Status = FrontEnd->
Vtbl->InitFrontEnd(FrontEnd, ConSrvConsole);
279 DPRINT(
"Using FrontEndIFace HACK(2), should be removed after proper implementation!\n");
289 FrontEnd->
Vtbl->DeinitFrontEnd(FrontEnd);
331 Console->LineMaxSize =
max(256, NumCharsToRead);
338 ReadControl->nInitialChars =
min(ReadControl->nInitialChars, NumCharsToRead);
343 Console->LinePos =
Console->LineSize = ReadControl->nInitialChars;
346 Console->LineWakeupMask = ReadControl->dwCtrlWakeupMask;
375 Input->InputEvent.Event.KeyEvent.bKeyDown)
378 &
Input->InputEvent.Event.KeyEvent);
379 ReadControl->dwControlKeyState =
Input->InputEvent.Event.KeyEvent.dwControlKeyState;
394 while (i < NumCharsToRead && Console->LinePos < Console->LineSize)
440 Input->InputEvent.Event.KeyEvent.bKeyDown &&
441 Input->InputEvent.Event.KeyEvent.uChar.UnicodeChar !=
L'\0')
443 WCHAR Char =
Input->InputEvent.Event.KeyEvent.uChar.UnicodeChar;
463 if (NumCharsRead) *NumCharsRead =
i;
483 if (++Buff->CursorPosition.Y == Buff->ScreenBufferSize.Y)
485 Buff->CursorPosition.Y--;
486 if (++Buff->
VirtualY == Buff->ScreenBufferSize.Y)
498 UpdateRect->Right = Buff->ScreenBufferSize.X - 1;
514 SHORT CursorStartX, CursorStartY;
523 CursorStartX = Buff->CursorPosition.X;
524 CursorStartY = Buff->CursorPosition.Y;
542 Buff->CursorPosition.X = 0;
543 CursorStartX = Buff->CursorPosition.X;
551 Buff->CursorPosition.X = 0;
552 CursorStartX = Buff->CursorPosition.X;
560 if (Buff->CursorPosition.X == 0 && Buff->CursorPosition.Y == 0)
563 if (Buff->CursorPosition.X == 0)
566 Buff->CursorPosition.X = Buff->ScreenBufferSize.X - 1;
567 Buff->CursorPosition.Y--;
573 Buff->CursorPosition.X--;
586 if (Buff->CursorPosition.X == 0 && Buff->CursorPosition.Y == 0)
589 if (Buff->CursorPosition.X == 0)
592 Buff->CursorPosition.X = Buff->ScreenBufferSize.X - 1;
593 Buff->CursorPosition.Y--;
599 Buff->CursorPosition.X--;
609 Ptr->Char.UnicodeChar =
L' ';
612 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
614 if (Buff->CursorPosition.X > 0)
615 Buff->CursorPosition.X--;
620 Ptr->Char.UnicodeChar =
L' ';
623 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
642 if (Buff->CursorPosition.X > 0)
643 Buff->CursorPosition.X--;
650 EndX =
min(EndX, (
UINT)Buff->ScreenBufferSize.X);
652 while ((
UINT)Buff->CursorPosition.X < EndX)
654 Ptr->Char.UnicodeChar =
L' ';
657 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
660 Buff->CursorPosition.X++;
662 if (Buff->CursorPosition.X < Buff->ScreenBufferSize.X)
667 Ptr->Char.UnicodeChar =
L' ';
670 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
675 if (Buff->CursorPosition.X >= Buff->ScreenBufferSize.X)
680 Buff->CursorPosition.X = 0;
681 CursorStartX = Buff->CursorPosition.X;
687 Buff->CursorPosition.X = CursorStartX;
695 FrontEnd->
Vtbl->RingBell(FrontEnd);
709 if (Buff->CursorPosition.X >= Buff->ScreenBufferSize.X - 1)
714 Buff->CursorPosition.X = 0;
715 CursorStartX = Buff->CursorPosition.X;
721 Buff->CursorPosition.X = CursorStartX;
730 if (Buff->CursorPosition.X >= Buff->ScreenBufferSize.X - 1)
732 DPRINT1(
"Cannot display full-width character! CursorPosition.X = %d, ScreenBufferSize.X = %d\n",
733 Buff->CursorPosition.X, Buff->ScreenBufferSize.X);
750 if (Buff->CursorPosition.X > 0)
753 Ptr->Char.UnicodeChar =
L' ';
756 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
764 ASSERT(Buff->CursorPosition.X < Buff->ScreenBufferSize.X - 1);
770 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
774 Buff->CursorPosition.X++;
779 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
787 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
791 Buff->CursorPosition.X++;
793 if (Buff->CursorPosition.X < Buff->ScreenBufferSize.X)
798 Ptr->Char.UnicodeChar =
L' ';
801 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
805 if (Buff->CursorPosition.X >= Buff->ScreenBufferSize.X)
810 Buff->CursorPosition.X = 0;
811 CursorStartX = Buff->CursorPosition.X;
817 Buff->CursorPosition.X = CursorStartX;
826 FrontEnd->
Vtbl->WriteStream(FrontEnd,
865 if (!ActiveBuffer)
return;
897 return FrontEnd->
Vtbl->SetScreenInfo(FrontEnd,
907 FrontEnd->
Vtbl->ResizeTerminal(FrontEnd);
914 FrontEnd->
Vtbl->SetActiveScreenBuffer(FrontEnd);
930 FrontEnd->
Vtbl->GetLargestConsoleWindowSize(FrontEnd, pSize);
947 return FrontEnd->
Vtbl->SetCodePage(FrontEnd, CodePage);
955 return FrontEnd->
Vtbl->ShowMouseCursor(FrontEnd, Show);
#define IS_FULL_WIDTH(wch)
#define ENABLE_WRAP_AT_EOL_OUTPUT
#define ENABLE_PROCESSED_OUTPUT
struct _CONSRV_CONSOLE * PCONSRV_CONSOLE
#define NT_SUCCESS(StatCode)
#define IsListEmpty(ListHead)
#define RemoveHeadList(ListHead)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
long __cdecl _InterlockedDecrement(_Interlocked_operand_ long volatile *_Addend)
#define memcpy(s1, s2, n)
_In_ ULONG _In_ ULONG _In_ ULONG Length
NTSTATUS NTAPI NtClearEvent(IN HANDLE EventHandle)
PULONG MinorVersion OPTIONAL
struct _CONSRV_CONSOLE * Console
union _KEY_EVENT_RECORD::@3288 uChar
USHORT ScreenDefaultAttrib
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
static HPALETTE PaletteHandle
#define TermDrawRegion(Console, Region)
NTSTATUS(NTAPI * FRONTEND_UNLOAD)(IN OUT PFRONTEND FrontEnd)
static NTSTATUS ConSrvLoadFrontEnd(IN OUT PFRONTEND FrontEnd, IN OUT PCONSOLE_STATE_INFO ConsoleInfo, IN OUT PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle)
#define ConsoleInputUnicodeCharToAnsiChar(Console, dChar, sWChar)
static INT NTAPI ConSrvTermShowMouseCursor(IN OUT PTERMINAL This, BOOL Show)
static TERMINAL_VTBL ConSrvTermVtbl
VOID ConioDrawConsole(PCONSRV_CONSOLE Console)
static BOOL NTAPI ConSrvTermSetScreenInfo(IN OUT PTERMINAL This, PCONSOLE_SCREEN_BUFFER ScreenBuffer, SHORT OldCursorX, SHORT OldCursorY)
static VOID NTAPI ConSrvTermGetLargestConsoleWindowSize(IN OUT PTERMINAL This, PCOORD pSize)
static struct @5139 FrontEndLoadingMethods[]
static NTSTATUS ConSrvUnloadFrontEnd(IN PFRONTEND FrontEnd)
static NTSTATUS NTAPI ConSrvTermWriteStream(IN OUT PTERMINAL This, PTEXTMODE_SCREEN_BUFFER Buff, PWCHAR Buffer, DWORD Length, BOOL Attrib)
static VOID NTAPI ConSrvTermSetActiveScreenBuffer(IN OUT PTERMINAL This)
NTSTATUS NTAPI GuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd, IN OUT PCONSOLE_STATE_INFO ConsoleInfo, IN OUT PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle)
static VOID NTAPI ConSrvTermDeinitTerminal(IN OUT PTERMINAL This)
static NTSTATUS ConioWriteConsole(PFRONTEND FrontEnd, PTEXTMODE_SCREEN_BUFFER Buff, PWCHAR Buffer, DWORD Length, BOOL Attrib)
static BOOL NTAPI ConSrvTermSetPalette(IN OUT PTERMINAL This, HPALETTE PaletteHandle, UINT PaletteUsage)
NTSTATUS(NTAPI * FRONTEND_LOAD)(IN OUT PFRONTEND FrontEnd, IN OUT PCONSOLE_STATE_INFO ConsoleInfo, IN OUT PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle)
#define ConsoleInputAnsiCharToUnicodeChar(Console, dWChar, sChar)
NTSTATUS NTAPI GuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd)
FRONTEND_LOAD FrontEndLoad
static VOID NTAPI ConSrvTermDrawRegion(IN OUT PTERMINAL This, SMALL_RECT *Region)
FRONTEND_UNLOAD FrontEndUnload
static VOID NTAPI ConSrvTermReleaseScreenBuffer(IN OUT PTERMINAL This, IN PCONSOLE_SCREEN_BUFFER ScreenBuffer)
static BOOL NTAPI ConSrvTermSetCursorInfo(IN OUT PTERMINAL This, PCONSOLE_SCREEN_BUFFER ScreenBuffer)
static BOOL NTAPI ConSrvTermSetCodePage(IN OUT PTERMINAL This, UINT CodePage)
static NTSTATUS NTAPI ConSrvTermInitTerminal(IN OUT PTERMINAL This, IN PCONSOLE Console)
NTSTATUS NTAPI ConSrvDeinitTerminal(IN OUT PTERMINAL Terminal)
NTSTATUS NTAPI ConSrvInitTerminal(IN OUT PTERMINAL Terminal, IN OUT PCONSOLE_STATE_INFO ConsoleInfo, IN OUT PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle)
static NTSTATUS NTAPI ConSrvTermReadStream(IN OUT PTERMINAL This, IN BOOLEAN Unicode, OUT PVOID Buffer, IN OUT PCONSOLE_READCONSOLE_CONTROL ReadControl, IN PVOID Parameter OPTIONAL, IN ULONG NumCharsToRead, OUT PULONG NumCharsRead OPTIONAL)
VOID ClearLineBuffer(PTEXTMODE_SCREEN_BUFFER Buff)
static VOID ConioNextLine(PTEXTMODE_SCREEN_BUFFER Buff, PSMALL_RECT UpdateRect, PUINT ScrolledLines)
static VOID NTAPI ConSrvTermResizeTerminal(IN OUT PTERMINAL This)
static int UpdateRect(TreeListData *pData, unsigned uItem, unsigned uSub)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_PARAMETER
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
#define ConsoleAllocHeap(Flags, Size)
#define ConsoleFreeHeap(HeapBase)
#define ConioInitRect(Rect, top, left, bottom, right)
#define ConioIsRectEmpty(Rect)
#define COMMON_LVB_TRAILING_BYTE
#define ENABLE_LINE_INPUT
#define COMMON_LVB_LEADING_BYTE
_Inout_opt_ PVOID Parameter