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;
559 INT OldX = Buff->CursorPosition.X;
562 if (Buff->CursorPosition.X == 0 && Buff->CursorPosition.Y == 0)
565 if (Buff->CursorPosition.X == 0)
568 Buff->CursorPosition.X = Buff->ScreenBufferSize.X - 1;
569 Buff->CursorPosition.Y--;
575 Buff->CursorPosition.X--;
588 if (Buff->CursorPosition.X == 0 && Buff->CursorPosition.Y == 0)
591 if (Buff->CursorPosition.X == 0)
594 Buff->CursorPosition.X = Buff->ScreenBufferSize.X - 1;
595 Buff->CursorPosition.Y--;
601 Buff->CursorPosition.X--;
611 Ptr->Char.UnicodeChar =
L' ';
614 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
616 if (Buff->CursorPosition.X > 0)
617 Buff->CursorPosition.X--;
622 Ptr->Char.UnicodeChar =
L' ';
625 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
644 if (Buff->CursorPosition.X > 0)
645 Buff->CursorPosition.X--;
652 EndX =
min(EndX, (
UINT)Buff->ScreenBufferSize.X);
654 while ((
UINT)Buff->CursorPosition.X < EndX)
656 Ptr->Char.UnicodeChar =
L' ';
659 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
662 Buff->CursorPosition.X++;
664 if (Buff->CursorPosition.X < Buff->ScreenBufferSize.X)
669 Ptr->Char.UnicodeChar =
L' ';
672 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
677 if (Buff->CursorPosition.X >= Buff->ScreenBufferSize.X)
682 Buff->CursorPosition.X = 0;
683 CursorStartX = Buff->CursorPosition.X;
689 Buff->CursorPosition.X = CursorStartX;
697 FrontEnd->
Vtbl->RingBell(FrontEnd);
711 if (Buff->CursorPosition.X >= Buff->ScreenBufferSize.X - 1)
716 Buff->CursorPosition.X = 0;
717 CursorStartX = Buff->CursorPosition.X;
723 Buff->CursorPosition.X = CursorStartX;
732 if (Buff->CursorPosition.X >= Buff->ScreenBufferSize.X - 1)
734 DPRINT1(
"Cannot display full-width character! CursorPosition.X = %d, ScreenBufferSize.X = %d\n",
735 Buff->CursorPosition.X, Buff->ScreenBufferSize.X);
752 if (Buff->CursorPosition.X > 0)
755 Ptr->Char.UnicodeChar =
L' ';
758 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
766 ASSERT(Buff->CursorPosition.X < Buff->ScreenBufferSize.X - 1);
772 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
776 Buff->CursorPosition.X++;
781 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
791 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
795 Buff->CursorPosition.X++;
797 if (Buff->CursorPosition.X < Buff->ScreenBufferSize.X)
802 Ptr->Char.UnicodeChar =
L' ';
805 Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
809 if (Buff->CursorPosition.X >= Buff->ScreenBufferSize.X)
814 Buff->CursorPosition.X = 0;
815 CursorStartX = Buff->CursorPosition.X;
821 Buff->CursorPosition.X = CursorStartX;
830 FrontEnd->
Vtbl->WriteStream(FrontEnd,
869 if (!ActiveBuffer)
return;
901 return FrontEnd->
Vtbl->SetScreenInfo(FrontEnd,
911 FrontEnd->
Vtbl->ResizeTerminal(FrontEnd);
918 FrontEnd->
Vtbl->SetActiveScreenBuffer(FrontEnd);
934 FrontEnd->
Vtbl->GetLargestConsoleWindowSize(FrontEnd, pSize);
951 return FrontEnd->
Vtbl->SetCodePage(FrontEnd, CodePage);
959 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
#define memcpy(s1, s2, n)
_In_ ULONG _In_ ULONG _In_ ULONG Length
NTSTATUS NTAPI NtClearEvent(IN HANDLE EventHandle)
long __cdecl _InterlockedDecrement(_Interlocked_operand_ long volatile *_Addend)
PULONG MinorVersion OPTIONAL
struct _CONSRV_CONSOLE * Console
union _KEY_EVENT_RECORD::@3520 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 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 struct @5505 FrontEndLoadingMethods[]
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