15 #ifdef TUITERM_COMPILE 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); \ 92 #ifdef TUITERM_COMPILE 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' ';
614 if (Buff->CursorPosition.X > 0)
615 Buff->CursorPosition.X--;
620 Ptr->Char.UnicodeChar =
L' ';
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' ';
660 Buff->CursorPosition.X++;
662 if (Buff->CursorPosition.X < Buff->ScreenBufferSize.X)
667 Ptr->Char.UnicodeChar =
L' ';
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' ';
764 ASSERT(Buff->CursorPosition.X < Buff->ScreenBufferSize.X - 1);
774 Buff->CursorPosition.X++;
791 Buff->CursorPosition.X++;
793 if (Buff->CursorPosition.X < Buff->ScreenBufferSize.X)
798 Ptr->Char.UnicodeChar =
L' ';
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);
static BOOL NTAPI ConSrvTermSetCodePage(IN OUT PTERMINAL This, UINT CodePage)
VOID ClearLineBuffer(PTEXTMODE_SCREEN_BUFFER Buff)
_In_ ULONG _In_ ULONG _In_ ULONG Length
union _KEY_EVENT_RECORD::@3214 uChar
static struct @4902 FrontEndLoadingMethods[]
#define STATUS_INVALID_PARAMETER
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
VOID ConioDrawConsole(PCONSRV_CONSOLE Console)
#define COMMON_LVB_SBCSDBCS
#define ConsoleAllocHeap(Flags, Size)
#define TermDrawRegion(Console, Region)
static NTSTATUS NTAPI ConSrvTermWriteStream(IN OUT PTERMINAL This, PTEXTMODE_SCREEN_BUFFER Buff, PWCHAR Buffer, DWORD Length, BOOL Attrib)
static HPALETTE PaletteHandle
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)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
NTSTATUS NTAPI ConSrvInitTerminal(IN OUT PTERMINAL Terminal, IN OUT PCONSOLE_STATE_INFO ConsoleInfo, IN OUT PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle)
struct _CONSRV_CONSOLE * Console
static VOID NTAPI ConSrvTermResizeTerminal(IN OUT PTERMINAL This)
NTSTATUS NTAPI GuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd)
static NTSTATUS ConioWriteConsole(PFRONTEND FrontEnd, PTEXTMODE_SCREEN_BUFFER Buff, PWCHAR Buffer, DWORD Length, BOOL Attrib)
NTSTATUS NTAPI GuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd, IN OUT PCONSOLE_STATE_INFO ConsoleInfo, IN OUT PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle)
NTSTATUS(NTAPI * FRONTEND_LOAD)(IN OUT PFRONTEND FrontEnd, IN OUT PCONSOLE_STATE_INFO ConsoleInfo, IN OUT PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle)
static BOOL NTAPI ConSrvTermSetPalette(IN OUT PTERMINAL This, HPALETTE PaletteHandle, UINT PaletteUsage)
#define ENABLE_WRAP_AT_EOL_OUTPUT
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
static NTSTATUS ConSrvUnloadFrontEnd(IN PFRONTEND FrontEnd)
static VOID NTAPI ConSrvTermGetLargestConsoleWindowSize(IN OUT PTERMINAL This, PCOORD pSize)
long __cdecl _InterlockedDecrement(_Interlocked_operand_ long volatile *_Addend)
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
static BOOL NTAPI ConSrvTermSetCursorInfo(IN OUT PTERMINAL This, PCONSOLE_SCREEN_BUFFER ScreenBuffer)
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
NTSTATUS(NTAPI * FRONTEND_UNLOAD)(IN OUT PFRONTEND FrontEnd)
#define NT_SUCCESS(StatCode)
NTSTATUS NTAPI ConSrvDeinitTerminal(IN OUT PTERMINAL Terminal)
static BOOL NTAPI ConSrvTermSetScreenInfo(IN OUT PTERMINAL This, PCONSOLE_SCREEN_BUFFER ScreenBuffer, SHORT OldCursorX, SHORT OldCursorY)
#define ENABLE_LINE_INPUT
#define ConsoleInputUnicodeCharToAnsiChar(Console, dChar, sWChar)
static TERMINAL_VTBL ConSrvTermVtbl
FRONTEND_UNLOAD FrontEndUnload
static VOID NTAPI ConSrvTermDeinitTerminal(IN OUT PTERMINAL This)
static NTSTATUS ConSrvLoadFrontEnd(IN OUT PFRONTEND FrontEnd, IN OUT PCONSOLE_STATE_INFO ConsoleInfo, IN OUT PCONSOLE_INIT_INFO ConsoleInitInfo, IN HANDLE ConsoleLeaderProcessHandle)
USHORT ScreenDefaultAttrib
#define memcpy(s1, s2, n)
struct _CONSRV_CONSOLE * PCONSRV_CONSOLE
#define ConioInitRect(Rect, top, left, bottom, right)
#define ENABLE_PROCESSED_OUTPUT
static VOID ConioNextLine(PTEXTMODE_SCREEN_BUFFER Buff, PSMALL_RECT UpdateRect, PUINT ScrolledLines)
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
static VOID NTAPI ConSrvTermDrawRegion(IN OUT PTERMINAL This, SMALL_RECT *Region)
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
static VOID NTAPI ConSrvTermReleaseScreenBuffer(IN OUT PTERMINAL This, IN PCONSOLE_SCREEN_BUFFER ScreenBuffer)
static VOID NTAPI ConSrvTermSetActiveScreenBuffer(IN OUT PTERMINAL This)
#define ConsoleFreeHeap(HeapBase)
#define COMMON_LVB_LEADING_BYTE
static INT NTAPI ConSrvTermShowMouseCursor(IN OUT PTERMINAL This, BOOL Show)
NTSTATUS NTAPI NtClearEvent(IN HANDLE EventHandle)
#define RtlZeroMemory(Destination, Length)
static int UpdateRect(TreeListData *pData, unsigned uItem, unsigned uSub)
#define COMMON_LVB_TRAILING_BYTE
FRONTEND_LOAD FrontEndLoad
#define ConioIsRectEmpty(Rect)
#define ConsoleInputAnsiCharToUnicodeChar(Console, dWChar, sChar)
#define IS_FULL_WIDTH(wch)
static NTSTATUS NTAPI ConSrvTermInitTerminal(IN OUT PTERMINAL This, IN PCONSOLE Console)
PULONG MinorVersion OPTIONAL