17#include "include/console.h"
18#include "include/settings.h"
59#define CAB_SIGNATURE 0x4643534D
60#define CAB_VERSION 0x0103
65#define ConsoleOutputUnicodeToAnsiChar(Console, dChar, sWChar) \
67 ASSERT((ULONG_PTR)(dChar) != (ULONG_PTR)(sWChar)); \
68 WideCharToMultiByte((Console)->OutputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL); \
72#define TUI_CONSOLE_WINDOW_CLASS L"TuiConsoleWindowClass"
74typedef struct _TUI_CONSOLE_DATA
86} TUI_CONSOLE_DATA, *PTUI_CONSOLE_DATA;
88#define GetNextConsole(Console) \
89 CONTAINING_RECORD(Console->Entry.Flink, TUI_CONSOLE_DATA, Entry)
91#define GetPrevConsole(Console) \
92 CONTAINING_RECORD(Console->Entry.Blink, TUI_CONSOLE_DATA, Entry)
97static PTUI_CONSOLE_DATA ActiveConsole;
100static COORD PhysicalConsoleSize;
101static HANDLE ConsoleDeviceHandle;
121 if (pszDriverPath ==
NULL)
125 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
132 DPRINT(
" Path: %wZ\n", &DriverPath);
138 &WasPrivilegeEnabled);
142 DPRINT1(
"CONSRV: Cannot acquire driver-loading privilege, Status = 0x%08lx\n",
Status);
152 &WasPrivilegeEnabled);
159#ifdef BLUESCREEN_DRIVER_UNLOADING
172 if (pszDriverPath ==
NULL)
176 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
183 DPRINT(
" Path: %wZ\n", &DriverPath);
189 &WasPrivilegeEnabled);
193 DPRINT1(
"CONSRV: Cannot acquire driver-unloading privilege, Status = 0x%08lx\n",
Status);
203 &WasPrivilegeEnabled);
217 static PTUI_CONSOLE_DATA SwapConsole =
NULL;
230 if (!SwapConsole) SwapConsole = ActiveConsole;
232 SwapConsole = (0 <
Next ? GetNextConsole(SwapConsole) : GetPrevConsole(SwapConsole));
240 pos->X = (PhysicalConsoleSize.
X -
Title.Length) / 2;
241 pos->Y = PhysicalConsoleSize.
Y / 2;
248 DPRINT1(
"Error writing to console\n" );
255 else if (
NULL != SwapConsole)
258 if (SwapConsole != ActiveConsole)
261 SwapConsole->Entry.Blink->Flink = SwapConsole->Entry.Flink;
262 SwapConsole->Entry.Flink->Blink = SwapConsole->Entry.Blink;
264 SwapConsole->Entry.Flink = &ActiveConsole->Entry;
265 SwapConsole->Entry.Blink = ActiveConsole->Entry.Blink;
266 ActiveConsole->Entry.Blink->Flink = &SwapConsole->Entry;
267 ActiveConsole->Entry.Blink = &SwapConsole->Entry;
269 ActiveConsole = SwapConsole;
285 UINT SrcDelta, DestDelta;
290 SrcDelta = Buff->ScreenBufferSize.X *
sizeof(
CHAR_INFO);
291 SrcEnd = Buff->
Buffer + Buff->ScreenBufferSize.Y * Buff->ScreenBufferSize.X *
sizeof(
CHAR_INFO);
301 Src -= Buff->ScreenBufferSize.Y * Buff->ScreenBufferSize.X *
sizeof(
CHAR_INFO);
378TuiConsoleThread(
PVOID Param)
380 PTUI_CONSOLE_DATA TuiData = (PTUI_CONSOLE_DATA)Param;
388 -32000, -32000, 0, 0,
392 if (
NULL == NewWindow)
394 DPRINT1(
"CONSRV: Unable to create console window\n");
397 TuiData->hWindow = NewWindow;
412TuiSetConsoleOutputCP(
461 DPRINT1(
"Error: Cannot open '%wZ' (0x%lx)\n", &FontFile,
Status);
497 DPRINT(
"Cabinet file '%wZ' opened and mapped to 0x%p\n",
498 &FontFile, FileBuffer);
510 DPRINT1(
"Cabinet file '%wZ' has an invalid header\n", &FontFile);
519 "%u-8x8.bin", CodePage);
536 FoundFile =
Data.CabFile;
546 DPRINT(
"File '%S' not found in cabinet '%wZ'\n",
547 FontName, &FontFile);
558 DPRINT1(
"File of size %lu is not of the expected size %lu\n",
584 DPRINT1(
"TuiSetConsoleOutputCP - Caught an exception, Status = 0x%08lx\n",
Status);
614 if (FileSectionHandle)
632 ATOM ConsoleClassAtom;
654 DPRINT1(
"Failed to open BlueScreen.\n");
663 DPRINT1(
"Failed to enable the screen.\n");
668 if (!TuiSetConsoleOutputCP(ConsoleDeviceHandle, OemCP))
670 DPRINT1(
"Failed to load the font for codepage %d\n", OemCP);
675 &TextAttribute,
sizeof(TextAttribute),
NULL, 0,
678 DPRINT1(
"Failed to set text attribute.\n");
681 ActiveConsole =
NULL;
688 DPRINT1(
"Failed to get console info.\n");
692 PhysicalConsoleSize = ScrInfo.
dwSize;
703 if (ConsoleClassAtom == 0)
705 DPRINT1(
"Failed to register TUI console wndproc.\n");
738 PTUI_CONSOLE_DATA TuiData;
750 DPRINT1(
"CONSRV: Failed to create TUI_CONSOLE_DATA\n");
755 TuiData->ActiveBuffer =
Console->ActiveBuffer;
756 TuiData->hWindow =
NULL;
783 if (
NULL == ThreadHandle)
785 DPRINT1(
"CONSRV: Unable to create console thread\n");
787 TuiDeinitFrontEnd(
This);
798 ActiveConsole = TuiData;
802 This->Context = TuiData;
812 PTUI_CONSOLE_DATA TuiData =
This->Context;
822 ActiveConsole = GetNextConsole(TuiData);
852 PTUI_CONSOLE_DATA TuiData =
This->Context;
856 UINT ConsoleDrawSize;
858 if (TuiData != ActiveConsole)
return;
864 if (
NULL == ConsoleDraw)
866 DPRINT1(
"ConsoleAllocHeap failed\n");
881 DPRINT1(
"Failed to draw console\n");
898 PTUI_CONSOLE_DATA TuiData =
This->Context;
904 if (TuiData != ActiveConsole)
return;
911 if (!NewBuffer)
return;
919 DPRINT1(
"Error writing to BlueScreen\n");
935 PTUI_CONSOLE_DATA TuiData =
This->Context;
939 if (TuiData != ActiveConsole)
return TRUE;
940 if (TuiData->Console->ActiveBuffer != Buff)
return TRUE;
949 DPRINT1(
"Failed to set cursor info\n" );
962 PTUI_CONSOLE_DATA TuiData =
This->Context;
966 if (TuiData != ActiveConsole)
return TRUE;
967 if (TuiData->Console->ActiveBuffer != Buff)
return TRUE;
977 DPRINT1(
"Failed to set cursor position\n" );
1103 PTUI_CONSOLE_DATA TuiData =
This->Context;
1104 return TuiData->hWindow;
1112 *pSize = PhysicalConsoleSize;
1139 if (!TuiSetConsoleOutputCP(ConsoleDeviceHandle, CodePage))
1141 DPRINT1(
"Failed to load the font for codepage %d\n", CodePage);
1203 TuiSetActiveScreenBuffer,
1204 TuiReleaseScreenBuffer,
1205 TuiRefreshInternalInfo,
1208 TuiGetThreadConsoleDesktop,
1209 TuiGetConsoleWindowHandle,
1210 TuiGetLargestConsoleWindowSize,
1211 TuiGetSelectionInfo,
1232 IN HANDLE ConsoleLeaderProcessHandle)
1245 FrontEnd->Context =
NULL;
1246 FrontEnd->Context2 =
NULL;
1255 if (FrontEnd->Context) TuiDeinitFrontEnd(FrontEnd);
NTSTATUS NTAPI NtUnmapViewOfSection(IN HANDLE ProcessHandle, IN PVOID BaseAddress)
NTSTATUS NTAPI NtCreateSection(OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN PLARGE_INTEGER MaximumSize OPTIONAL, IN ULONG SectionPageProtection OPTIONAL, IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL)
NTSTATUS NTAPI NtMapViewOfSection(IN HANDLE SectionHandle, IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN ULONG_PTR ZeroBits, IN SIZE_T CommitSize, IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, IN OUT PSIZE_T ViewSize, IN SECTION_INHERIT InheritDisposition, IN ULONG AllocationType, IN ULONG Protect)
NTSTATUS NtUnloadDriver(IN PUNICODE_STRING DriverServiceName)
static USHORT USHORT * NewLength
char * strchr(const char *String, int ch)
static UINT LastLoadedCodepage
static LPHIST_ENTRY Bottom
static DWORD ScmUnloadDriver(PSERVICE lpService)
static DWORD ScmLoadDriver(PSERVICE lpService)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
struct _CFHEADER * PCFHEADER
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
HINSTANCE ConSrvDllInstance
#define ERROR_NOT_ENOUGH_MEMORY
BOOL WINAPI Beep(IN DWORD dwFreq, IN DWORD dwDuration)
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
#define NT_SUCCESS(StatCode)
static const WCHAR Title[]
#define INVALID_HANDLE_VALUE
#define WideCharToMultiByte
#define ConioRectWidth(Rect)
#define ConioRectHeight(Rect)
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
static const WCHAR Message[]
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InitializeListHead(ListHead)
struct _FileName FileName
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
#define FILE_SYNCHRONOUS_IO_NONALERT
_Must_inspect_result_ _Out_ PLARGE_INTEGER FileSize
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 BOOL ConsInitialized
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
@ ConsoleAcquireDisplayOwnership
DWORD_PTR NTAPI NtUserCallNoParam(DWORD Routine)
#define NOPARAM_ROUTINE_ISCONSOLEMODE
NTSTATUS APIENTRY NtUserConsoleControl(IN CONSOLECONTROL ConsoleCtrl, IN PVOID ConsoleCtrlInfo, IN ULONG ConsoleCtrlInfoLength)
#define OBJ_CASE_INSENSITIVE
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
#define EXCEPTION_EXECUTE_HANDLER
#define SE_LOAD_DRIVER_PRIVILEGE
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define InitializeObjectAttributes(p, n, a, r, s)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
NTSYSAPI NTSTATUS NTAPI RtlAdjustPrivilege(_In_ ULONG Privilege, _In_ BOOLEAN NewValue, _In_ BOOLEAN ForThread, _Out_ PBOOLEAN OldValue)
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
#define SECTION_ALL_ACCESS
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define NtCurrentProcess()
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define IOCTL_CONSOLE_DRAW
struct tagCONSOLE_DRAW CONSOLE_DRAW
#define IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
#define IOCTL_CONSOLE_LOADFONT
#define IOCTL_CONSOLE_RESET_SCREEN
#define IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
#define IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
#define IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
#define IOCTL_CONSOLE_SET_CURSOR_INFO
_In_ ULONG _In_ ULONG _In_ ULONG Length
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
NTSTATUS NTAPI NtLoadDriver(IN PUNICODE_STRING DriverServiceName)
#define STATUS_INVALID_BUFFER_SIZE
NTSTRSAFEVAPI RtlStringCbPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
STDMETHOD() Next(THIS_ ULONG celt, IAssociationElement *pElement, ULONG *pceltFetched) PURE
base of all file and directory entries
union _CHAR_INFO::@3387 Char
CONSOLE_CURSOR_INFO CursorInfo
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
static HPALETTE PaletteHandle
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
VOID ConioDrawConsole(PCONSRV_CONSOLE Console)
#define RTL_CONSTANT_STRING(s)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_OBJECT_NAME_NOT_FOUND
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_ ULONG _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesReturned
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesWritten
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
BOOLEAN NTAPI ConDrvValidateConsoleUnsafe(IN PCONSOLE Console, IN CONSOLE_STATE ExpectedState, IN BOOLEAN LockConsole)
#define ConsoleOutputUnicodeToAnsiChar(Console, dChar, sWChar)
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
#define ConsoleAllocHeap(Flags, Size)
#define ConsoleFreeHeap(HeapBase)
struct _TEXTMODE_SCREEN_BUFFER * PTEXTMODE_SCREEN_BUFFER
static BOOLEAN IsConsoleMode(VOID)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
struct _CHAR_INFO CHAR_INFO
#define CONSOLE_FULLSCREEN_HARDWARE
BOOL WINAPI TranslateMessage(_In_ const MSG *)
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL WINAPI SetForegroundWindow(_In_ HWND)
HWND WINAPI SetFocus(_In_opt_ HWND)
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
struct _WNDCLASSEXW WNDCLASSEXW
BOOL WINAPI DestroyWindow(_In_ HWND)
#define RtlUnicodeStringToAnsiSize(String)