ReactOS 0.4.16-dev-295-g4aee028
console.c File Reference
#include <usetup.h>
#include <blue/ntddblue.h>
#include "keytrans.h"
#include <debug.h>
Include dependency graph for console.c:

Go to the source code of this file.

Classes

struct  _CONSOLE_CABINET_CONTEXT
 

Macros

#define NDEBUG
 

Typedefs

typedef struct _CONSOLE_CABINET_CONTEXT CONSOLE_CABINET_CONTEXT
 
typedef struct _CONSOLE_CABINET_CONTEXTPCONSOLE_CABINET_CONTEXT
 

Functions

static PVOID ConsoleCreateFileHandler (IN PCABINET_CONTEXT CabinetContext, IN ULONG FileSize)
 
BOOL WINAPI AllocConsole (VOID)
 
BOOL WINAPI AttachConsole (IN DWORD dwProcessId)
 
BOOL WINAPI FreeConsole (VOID)
 
BOOL WINAPI WriteConsole (IN HANDLE hConsoleOutput, IN const VOID *lpBuffer, IN DWORD nNumberOfCharsToWrite, OUT LPDWORD lpNumberOfCharsWritten, IN LPVOID lpReserved)
 
HANDLE WINAPI GetStdHandle (IN DWORD nStdHandle)
 
BOOL WINAPI FlushConsoleInputBuffer (IN HANDLE hConsoleInput)
 
BOOL WINAPI PeekConsoleInput (IN HANDLE hConsoleInput, OUT PINPUT_RECORD lpBuffer, IN DWORD nLength, OUT LPDWORD lpNumberOfEventsRead)
 
BOOL WINAPI ReadConsoleInput (IN HANDLE hConsoleInput, OUT PINPUT_RECORD lpBuffer, IN DWORD nLength, OUT LPDWORD lpNumberOfEventsRead)
 
BOOL WINAPI WriteConsoleOutputCharacterA (HANDLE hConsoleOutput, IN LPCSTR lpCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
 
BOOL WINAPI WriteConsoleOutputCharacterW (HANDLE hConsoleOutput, IN LPCWSTR lpCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
 
BOOL WINAPI FillConsoleOutputAttribute (IN HANDLE hConsoleOutput, IN WORD wAttribute, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfAttrsWritten)
 
BOOL WINAPI FillConsoleOutputCharacterA (IN HANDLE hConsoleOutput, IN CHAR cCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
 
BOOL WINAPI GetConsoleScreenBufferInfo (IN HANDLE hConsoleOutput, OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
 
BOOL WINAPI SetConsoleCursorInfo (IN HANDLE hConsoleOutput, IN const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
 
BOOL WINAPI SetConsoleCursorPosition (IN HANDLE hConsoleOutput, IN COORD dwCursorPosition)
 
BOOL WINAPI SetConsoleTextAttribute (IN HANDLE hConsoleOutput, IN WORD wAttributes)
 
BOOL WINAPI SetConsoleOutputCP (IN UINT wCodepage)
 

Variables

static BOOLEAN InputQueueEmpty
 
static BOOLEAN WaitForInput
 
static KEYBOARD_INPUT_DATA InputDataQueue
 
static IO_STATUS_BLOCK InputIosb
 
static UINT LastLoadedCodepage
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 34 of file console.c.

Typedef Documentation

◆ CONSOLE_CABINET_CONTEXT

◆ PCONSOLE_CABINET_CONTEXT

Function Documentation

◆ AllocConsole()

BOOL WINAPI AllocConsole ( VOID  )

Definition at line 74 of file console.c.

75{
77 UNICODE_STRING ScreenName = RTL_CONSTANT_STRING(L"\\??\\BlueScreen");
78 UNICODE_STRING KeyboardName = RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");
82
83 /* Open the screen */
85 &ScreenName,
86 0,
87 NULL,
88 NULL);
95 if (!NT_SUCCESS(Status))
96 return FALSE;
97
98 /* Enable it */
99 Enable = TRUE;
101 NULL,
102 NULL,
103 NULL,
106 &Enable,
107 sizeof(Enable),
108 NULL,
109 0);
110 if (!NT_SUCCESS(Status))
111 {
113 return FALSE;
114 }
115
116 /* Default to en-US output codepage */
118
119 /* Open the keyboard */
121 &KeyboardName,
122 0,
123 NULL,
124 NULL);
129 FILE_OPEN,
130 0);
131 if (!NT_SUCCESS(Status))
132 {
134 return FALSE;
135 }
136
137 /* Reset the queue state */
140
141 return TRUE;
142}
LONG NTSTATUS
Definition: precomp.h:26
BOOL WINAPI SetConsoleOutputCP(IN UINT wCodepage)
Definition: console.c:695
static BOOLEAN InputQueueEmpty
Definition: console.c:39
static BOOLEAN WaitForInput
Definition: console.c:40
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
HANDLE StdOutput
Definition: consup.c:37
HANDLE StdInput
Definition: consup.c:36
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define FILE_OPEN
Definition: from_kernel.h:54
#define FILE_SYNCHRONOUS_IO_ALERT
Definition: from_kernel.h:30
Status
Definition: gdiplustypes.h:25
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
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)
Definition: file.c:3952
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)
Definition: obhandle.c:3402
#define FILE_ALL_ACCESS
Definition: nt_native.h:651
#define IOCTL_CONSOLE_RESET_SCREEN
Definition: ntddblue.h:4
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
#define L(x)
Definition: ntvdm.h:50
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
uint32_t ULONG
Definition: typedefs.h:59

Referenced by _tWinMain(), cmd_ctty(), CONSOLE_Init(), DoTest(), InitRappsConsole(), main(), START_TEST(), test_Console(), TUIInitialize(), and wWinMain().

◆ AttachConsole()

BOOL WINAPI AttachConsole ( IN DWORD  dwProcessId)

Definition at line 147 of file console.c.

149{
150 return FALSE;
151}

Referenced by InitRappsConsole().

◆ ConsoleCreateFileHandler()

static PVOID ConsoleCreateFileHandler ( IN PCABINET_CONTEXT  CabinetContext,
IN ULONG  FileSize 
)
static

Definition at line 55 of file console.c.

58{
59 PCONSOLE_CABINET_CONTEXT ConsoleCabinetContext;
60
61 ConsoleCabinetContext = (PCONSOLE_CABINET_CONTEXT)CabinetContext;
62 ConsoleCabinetContext->Data = RtlAllocateHeap(ProcessHeap, 0, FileSize);
63 if (!ConsoleCabinetContext->Data)
64 {
65 DPRINT("Failed to allocate %d bytes\n", FileSize);
66 return NULL;
67 }
68 ConsoleCabinetContext->Size = FileSize;
69 return ConsoleCabinetContext->Data;
70}
HANDLE ProcessHeap
Definition: servman.c:15
struct _CONSOLE_CABINET_CONTEXT * PCONSOLE_CABINET_CONTEXT
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:590
_Must_inspect_result_ _Out_ PLARGE_INTEGER FileSize
Definition: fsrtlfuncs.h:108
#define DPRINT
Definition: sndvol32.h:73

Referenced by SetConsoleOutputCP().

◆ FillConsoleOutputAttribute()

BOOL WINAPI FillConsoleOutputAttribute ( IN HANDLE  hConsoleOutput,
IN WORD  wAttribute,
IN DWORD  nLength,
IN COORD  dwWriteCoord,
OUT LPDWORD  lpNumberOfAttrsWritten 
)

Definition at line 525 of file console.c.

531{
535
536 Buffer.wAttribute = wAttribute;
537 Buffer.nLength = nLength;
538 Buffer.dwCoord = dwWriteCoord;
539
540 Status = NtDeviceIoControlFile(hConsoleOutput,
541 NULL,
542 NULL,
543 NULL,
546 &Buffer,
547 sizeof(OUTPUT_ATTRIBUTE),
548 &Buffer,
549 sizeof(OUTPUT_ATTRIBUTE));
550 if (!NT_SUCCESS(Status))
551 return FALSE;
552
553 *lpNumberOfAttrsWritten = Buffer.dwTransfered;
554 return TRUE;
555}
Definition: bufpool.h:45
#define IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE
Definition: ntddblue.h:13
_In_ DWORD nLength
Definition: wincon.h:473

Referenced by TConsole::ClearBOLine(), TConsole::ClearBOScreen(), TConsole::ClearEOLine(), TConsole::ClearEOScreen(), TConsole::ClearLine(), TConsole::ClearScreen(), ClearScreen(), TConsole::ClearWindow(), ConClearScreen(), ConSetScreenColor(), CONSOLE_ClearScreen(), CONSOLE_InvertTextXY(), CONSOLE_NormalTextXY(), CONSOLE_SetHighlightedTextXY(), CONSOLE_SetInputTextXY(), CONSOLE_SetInvertedTextXY(), CONSOLE_SetStatusTextXV(), ConsolePager(), DisplayScreen(), TMouse::doMouse(), DrawFileSystemList(), DrawListEntries(), DrawProgressBar(), TMouse::move_mouse(), PopupError(), PrintDiskData(), PrintEmptyLine(), PrintInfoLine(), PrintPartitionData(), test_cp932(), test_FillConsoleOutputAttribute(), wmain(), WriteStringAt(), and TConsole::WriteText().

◆ FillConsoleOutputCharacterA()

BOOL WINAPI FillConsoleOutputCharacterA ( IN HANDLE  hConsoleOutput,
IN CHAR  cCharacter,
IN DWORD  nLength,
IN COORD  dwWriteCoord,
OUT LPDWORD  lpNumberOfCharsWritten 
)

◆ FlushConsoleInputBuffer()

BOOL WINAPI FlushConsoleInputBuffer ( IN HANDLE  hConsoleInput)

Definition at line 220 of file console.c.

222{
226 KEYBOARD_INPUT_DATA InputData;
227
228 /* Cancel any pending read */
229 if (WaitForInput)
230 NtCancelIoFile(hConsoleInput, &IoStatusBlock);
231
232 /* Reset the queue state */
235
236 /* Flush the keyboard buffer */
237 do
238 {
239 Offset.QuadPart = 0;
240 Status = NtReadFile(hConsoleInput,
241 NULL,
242 NULL,
243 NULL,
245 &InputData,
246 sizeof(InputData),
247 &Offset,
248 NULL);
249 if (Status == STATUS_PENDING)
250 {
251 Timeout.QuadPart = -100;
252 Status = NtWaitForSingleObject(hConsoleInput, FALSE, &Timeout);
253 if (Status == STATUS_TIMEOUT)
254 {
255 NtCancelIoFile(hConsoleInput, &IoStatusBlock);
256 return TRUE;
257 }
258 }
259 } while (NT_SUCCESS(Status));
260 return FALSE;
261}
#define STATUS_TIMEOUT
Definition: d3dkmdt.h:49
#define STATUS_PENDING
Definition: d3dkmdt.h:43
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
NTSTATUS NTAPI NtCancelIoFile(IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock)
Definition: file.c:4019
static ULONG Timeout
Definition: ping.c:61
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key)

Referenced by ConInFlush(), CONSOLE_Flush(), ConsolePager(), FlushFileBuffers(), CConsole::FlushInputBuffer(), getline(), gl_cleanup(), gl_getpass(), InputChar(), InputWait(), CConsole::ReadLine(), ReadString(), test_WriteConsoleInputA(), test_WriteConsoleInputW(), testWaitForConsoleInput(), and wmain().

◆ FreeConsole()

BOOL WINAPI FreeConsole ( VOID  )

Definition at line 156 of file console.c.

157{
158 /* Reset the queue state */
161
164
167
168 return TRUE;
169}
#define INVALID_HANDLE_VALUE
Definition: compat.h:731

Referenced by cmd_ctty(), CONSOLE_Init(), RunUSetup(), and START_TEST().

◆ GetConsoleScreenBufferInfo()

BOOL WINAPI GetConsoleScreenBufferInfo ( IN HANDLE  hConsoleOutput,
OUT PCONSOLE_SCREEN_BUFFER_INFO  lpConsoleScreenBufferInfo 
)

Definition at line 595 of file console.c.

598{
601
602 Status = NtDeviceIoControlFile(hConsoleOutput,
603 NULL,
604 NULL,
605 NULL,
608 NULL,
609 0,
610 lpConsoleScreenBufferInfo,
612 return NT_SUCCESS(Status);
613}
#define IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
Definition: ntddblue.h:6

Referenced by AttachToConsoleInternal(), TConsole::ClearBOLine(), TConsole::ClearEOLine(), TConsole::ClearLine(), ConClearLine(), ConClearScreen(), ConGetDefaultAttributes(), ConGetScreenInfo(), ConSetScreenColor(), CONSOLE_GetCursorX(), CONSOLE_GetCursorXY(), CONSOLE_GetCursorY(), CONSOLE_Init(), ConsolePager(), DisplayScreen(), doChild(), TMouse::doMouse_init(), GetCursorX(), GetCursorXY(), GetCursorY(), GetScreenColumns(), GetScreenSize(), CConsole::Init(), main(), newBuffer(), PrintInfoLine(), ReadCommand(), RecoveryConsole(), ResizeTextConsole(), restoreScreen(), saveScreen(), TScroller::ScrollBack(), SetConsoleCursorPosition(), SetConsoleState(), SetConsoleStateOld(), ShowConsoleStatus(), START_TEST(), TConsole::sync(), TConsole::TConsole(), test_Console(), test_cp855(), test_cp932(), test_GetConsoleFontInfo(), test_GetConsoleFontSize(), test_GetCurrentConsoleFont(), test_GetLargestConsoleWindowSize(), VgaConsoleInitialize(), wmain(), and write_status().

◆ GetStdHandle()

HANDLE WINAPI GetStdHandle ( IN DWORD  nStdHandle)

Definition at line 203 of file console.c.

205{
206 switch (nStdHandle)
207 {
208 case STD_INPUT_HANDLE:
209 return StdInput;
211 return StdOutput;
212 default:
214 }
215}
#define STD_OUTPUT_HANDLE
Definition: winbase.h:294
#define STD_INPUT_HANDLE
Definition: winbase.h:293

Referenced by __report_error(), _cputs(), _CrtDbgReportToFile(), _kbhit(), _putch(), _tmain(), _tpopen(), _tWinMain(), ask_confirm(), ask_overwrite_value(), ata_open_file(), cfgets(), cgetchar(), cmd_type(), ConErrPrintf(), Confirm(), ConInDisable(), ConInEnable(), ConInFlush(), ConInKey(), ConInString(), ConOutPuts(), CONSOLE_Init(), ConsolePager(), CreateClientProcess(), DisplayError(), DisplayResourceText(), doChild(), DosCopyHandleTable(), DoTestEntry(), EnumThreadProc(), ExecutePipeline(), ExtCabCallback(), GetCharacterTimeout(), GetCursorX(), GetCursorXY(), GetCursorY(), GetInputOutputHandles(), getline(), getpass(), GetScreenColumns(), GetScreenSize(), gl_cleanup(), gl_getpass(), CConsole::Init(), CPipedProcess::InitStartupInfo(), InputChar(), main(), msvcrt_init_io(), myprintf(), newBuffer(), output_error(), output_header(), output_line(), output_writeconsole(), OutputResult(), TANSIParser::ParseBuffer(), print_string(), PrintInfoLine(), printit(), ReadAndHandleOutput(), ReadCommand(), ReadFromConsole(), ReadString(), RecoveryConsole(), RestoreConsole(), restoreScreen(), saveScreen(), TScroller::ScrollBack(), scrollkeys(), SetConsoleOutputCP(), SetConsoleState(), SetConsoleStateOld(), SetCursorType(), SetCursorXY(), SetInsert(), ShowAppList(), ShowConsoleStatus(), start_server(), taskkill_vprintfW(), telProcessConsole(), test_DetachConsoleHandles(), test_DetachStdHandles(), test_file_inherit(), test_GetConsoleFontInfo(), test_GetConsoleFontSize(), test_GetConsoleScreenBufferInfoEx(), test_GetCurrentConsoleFont(), test_GetFileType(), test_GetLargestConsoleWindowSize(), test_GetSetStdHandle(), test_Handles(), test_invalid_stdin(), test_ReadConsole(), test_SetConsoleFont(), test_stdin(), test_stdio(), test_stdout_handle(), TMouse::TMouse(), TUIDisplayStatusMessage(), waitforkey(), wmain(), write_status(), XCOPY_DoCopy(), XCOPY_ProcessDestParm(), and XCOPY_wprintf().

◆ PeekConsoleInput()

BOOL WINAPI PeekConsoleInput ( IN HANDLE  hConsoleInput,
OUT PINPUT_RECORD  lpBuffer,
IN DWORD  nLength,
OUT LPDWORD  lpNumberOfEventsRead 
)

Definition at line 266 of file console.c.

271{
274 KEYBOARD_INPUT_DATA InputData;
275
276 if (InputQueueEmpty)
277 {
278 /* Read the keyboard for an event, without waiting */
279 if (!WaitForInput)
280 {
281 Offset.QuadPart = 0;
282 Status = NtReadFile(hConsoleInput,
283 NULL,
284 NULL,
285 NULL,
286 &InputIosb,
288 sizeof(InputDataQueue),
289 &Offset,
290 NULL);
291 if (!NT_SUCCESS(Status))
292 return FALSE;
293 if (Status == STATUS_PENDING)
294 {
295 /* No input yet, we will have to wait next time */
298 return TRUE;
299 }
300 }
301 else
302 {
303 /*
304 * We already tried to read from the keyboard and are
305 * waiting for data, check whether something showed up.
306 */
307 Timeout.QuadPart = -100; // Wait just a little bit.
308 Status = NtWaitForSingleObject(hConsoleInput, FALSE, &Timeout);
309 if (Status == STATUS_TIMEOUT)
310 {
311 /* Nothing yet, continue waiting next time */
314 return TRUE;
315 }
317 if (!NT_SUCCESS(Status))
318 return FALSE;
319 }
320
321 /* We got something in the queue */
324 }
325
326 /* Fetch from the queue but keep it inside */
327 InputData = InputDataQueue;
328
329 lpBuffer->EventType = KEY_EVENT;
330 Status = IntTranslateKey(hConsoleInput, &InputData, &lpBuffer->Event.KeyEvent);
331 if (!NT_SUCCESS(Status))
332 return FALSE;
333
335 return TRUE;
336}
static KEYBOARD_INPUT_DATA InputDataQueue
Definition: console.c:41
static IO_STATUS_BLOCK InputIosb
Definition: console.c:42
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
NTSTATUS IntTranslateKey(HANDLE hConsoleInput, PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event)
Definition: keytrans.c:417
_In_ DWORD _Out_ LPDWORD lpNumberOfEventsRead
Definition: wincon.h:474
#define KEY_EVENT
Definition: wincon.h:128

◆ ReadConsoleInput()

BOOL WINAPI ReadConsoleInput ( IN HANDLE  hConsoleInput,
OUT PINPUT_RECORD  lpBuffer,
IN DWORD  nLength,
OUT LPDWORD  lpNumberOfEventsRead 
)

Definition at line 341 of file console.c.

346{
349 KEYBOARD_INPUT_DATA InputData;
350
351 if (InputQueueEmpty)
352 {
353 /* Read the keyboard and wait for an event, skipping the queue */
354 if (!WaitForInput)
355 {
356 Offset.QuadPart = 0;
357 Status = NtReadFile(hConsoleInput,
358 NULL,
359 NULL,
360 NULL,
361 &InputIosb,
363 sizeof(InputDataQueue),
364 &Offset,
365 NULL);
366 if (Status == STATUS_PENDING)
367 {
368 /* Block and wait for input */
370 Status = NtWaitForSingleObject(hConsoleInput, FALSE, NULL);
373 }
374 if (!NT_SUCCESS(Status))
375 return FALSE;
376 }
377 else
378 {
379 /*
380 * We already tried to read from the keyboard and are
381 * waiting for data, block and wait for input.
382 */
383 Status = NtWaitForSingleObject(hConsoleInput, FALSE, NULL);
386 if (!NT_SUCCESS(Status))
387 return FALSE;
388 }
389 }
390
391 /* Fetch from the queue and empty it */
392 InputData = InputDataQueue;
394
395 lpBuffer->EventType = KEY_EVENT;
396 Status = IntTranslateKey(hConsoleInput, &InputData, &lpBuffer->Event.KeyEvent);
397 if (!NT_SUCCESS(Status))
398 return FALSE;
399
401 return TRUE;
402}

◆ SetConsoleCursorInfo()

BOOL WINAPI SetConsoleCursorInfo ( IN HANDLE  hConsoleOutput,
IN const CONSOLE_CURSOR_INFO lpConsoleCursorInfo 
)

◆ SetConsoleCursorPosition()

BOOL WINAPI SetConsoleCursorPosition ( IN HANDLE  hConsoleOutput,
IN COORD  dwCursorPosition 
)

Definition at line 641 of file console.c.

644{
645 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
648
649 Status = GetConsoleScreenBufferInfo(hConsoleOutput, &ConsoleScreenBufferInfo);
650 if (!NT_SUCCESS(Status))
651 return FALSE;
652
653 ConsoleScreenBufferInfo.dwCursorPosition.X = dwCursorPosition.X;
654 ConsoleScreenBufferInfo.dwCursorPosition.Y = dwCursorPosition.Y;
655
656 Status = NtDeviceIoControlFile(hConsoleOutput,
657 NULL,
658 NULL,
659 NULL,
662 &ConsoleScreenBufferInfo,
664 NULL,
665 0);
666 return NT_SUCCESS(Status);
667}
BOOL WINAPI GetConsoleScreenBufferInfo(IN HANDLE hConsoleOutput, OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
Definition: console.c:595
#define IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
Definition: ntddblue.h:7
SHORT Y
Definition: blue.h:27
SHORT X
Definition: blue.h:26

Referenced by ClearScreen(), ConClearLine(), ConClearScreen(), CONSOLE_SetCursorXY(), ConsolePager(), doChild(), PagePrompt(), CConsole::ReadLine(), TConsole::SetCursorPosition(), SetCursorXY(), TConsole::SetRawCursorPosition(), test_cp855(), test_cp932(), testCursor(), testEmptyWrite(), testScreenBuffer(), testWriteNotWrappedNotProcessed(), testWriteNotWrappedProcessed(), testWriteSimple(), testWriteWrappedNotProcessed(), testWriteWrappedProcessed(), VgaConsoleUpdateTextCursor(), CConsole::Write(), and TConsole::WriteString().

◆ SetConsoleOutputCP()

BOOL WINAPI SetConsoleOutputCP ( IN UINT  wCodepage)

Definition at line 695 of file console.c.

697{
698 static PCWSTR FontFile = L"\\SystemRoot\\vgafonts.cab";
699 WCHAR FontName[20];
700 CONSOLE_CABINET_CONTEXT ConsoleCabinetContext;
701 PCABINET_CONTEXT CabinetContext = &ConsoleCabinetContext.CabinetContext;
702 CAB_SEARCH Search;
703 ULONG CabStatus;
704 HANDLE hConsoleOutput;
707
708 if (wCodepage == LastLoadedCodepage)
709 return TRUE;
710
711 hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
712
713 CabinetInitialize(CabinetContext);
714 CabinetSetEventHandlers(CabinetContext,
716 CabinetSetCabinetName(CabinetContext, FontFile);
717
718 CabStatus = CabinetOpen(CabinetContext);
719 if (CabStatus != CAB_STATUS_SUCCESS)
720 {
721 DPRINT("CabinetOpen('%S') returned 0x%08x\n", FontFile, CabStatus);
722 return FALSE;
723 }
724
725 RtlStringCbPrintfW(FontName, sizeof(FontName),
726 L"%u-8x8.bin", wCodepage);
727 CabStatus = CabinetFindFirst(CabinetContext, FontName, &Search);
728 if (CabStatus != CAB_STATUS_SUCCESS)
729 {
730 DPRINT("CabinetFindFirst('%S', '%S') returned 0x%08x\n", FontFile, FontName, CabStatus);
731 CabinetClose(CabinetContext);
732 return FALSE;
733 }
734
735 CabStatus = CabinetExtractFile(CabinetContext, &Search);
736 CabinetClose(CabinetContext);
737 if (CabStatus != CAB_STATUS_SUCCESS)
738 {
739 DPRINT("CabinetExtractFile('%S', '%S') returned 0x%08x\n", FontFile, FontName, CabStatus);
740 if (ConsoleCabinetContext.Data)
741 RtlFreeHeap(ProcessHeap, 0, ConsoleCabinetContext.Data);
742 return FALSE;
743 }
744 ASSERT(ConsoleCabinetContext.Data);
745
746 Status = NtDeviceIoControlFile(hConsoleOutput,
747 NULL,
748 NULL,
749 NULL,
752 ConsoleCabinetContext.Data,
753 ConsoleCabinetContext.Size,
754 NULL,
755 0);
756
757 RtlFreeHeap(ProcessHeap, 0, ConsoleCabinetContext.Data);
758
759 if (!NT_SUCCESS(Status))
760 return FALSE;
761
762 LastLoadedCodepage = wCodepage;
763 return TRUE;
764}
static PVOID ConsoleCreateFileHandler(IN PCABINET_CONTEXT CabinetContext, IN ULONG FileSize)
Definition: console.c:55
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:203
static UINT LastLoadedCodepage
Definition: console.c:43
#define CAB_STATUS_SUCCESS
Definition: cabinet.h:23
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:608
ULONG CabinetOpen(IN OUT PCABINET_CONTEXT CabinetContext)
Definition: cabinet.c:627
ULONG CabinetFindFirst(IN PCABINET_CONTEXT CabinetContext, IN PCWSTR FileName, IN OUT PCAB_SEARCH Search)
Definition: cabinet.c:826
VOID CabinetClose(IN OUT PCABINET_CONTEXT CabinetContext)
Definition: cabinet.c:807
ULONG CabinetExtractFile(IN PCABINET_CONTEXT CabinetContext, IN PCAB_SEARCH Search)
Definition: cabinet.c:965
VOID CabinetSetEventHandlers(IN PCABINET_CONTEXT CabinetContext, IN PCABINET_OVERWRITE Overwrite, IN PCABINET_EXTRACT Extract, IN PCABINET_DISK_CHANGE DiskChange, IN PCABINET_CREATE_FILE CreateFile)
Definition: cabinet.c:1355
VOID CabinetInitialize(IN OUT PCABINET_CONTEXT CabinetContext)
Definition: cabinet.c:507
VOID CabinetSetCabinetName(IN PCABINET_CONTEXT CabinetContext, IN PCWSTR FileName)
Definition: cabinet.c:586
#define ASSERT(a)
Definition: mode.c:44
#define IOCTL_CONSOLE_LOADFONT
Definition: ntddblue.h:24
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
CABINET_CONTEXT CabinetContext
Definition: console.c:49
const uint16_t * PCWSTR
Definition: typedefs.h:57
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by AllocConsole(), ChangeOutputCP_(), doChild(), SetConsoleCodePage(), SetConsoleCPState(), START_TEST(), test_Console(), test_cp855(), test_cp932(), test_CP_ThreadLang(), testScreenBuffer(), and wmain().

◆ SetConsoleTextAttribute()

BOOL WINAPI SetConsoleTextAttribute ( IN HANDLE  hConsoleOutput,
IN WORD  wAttributes 
)

Definition at line 672 of file console.c.

675{
678
679 Status = NtDeviceIoControlFile(hConsoleOutput,
680 NULL,
681 NULL,
682 NULL,
685 &wAttributes,
686 sizeof(USHORT),
687 NULL,
688 0);
689 return NT_SUCCESS(Status);
690}
#define IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
Definition: ntddblue.h:16
unsigned short USHORT
Definition: pedump.c:61

Referenced by ConSetScreenColor(), main(), ShowAppList(), TConsole::TConsole(), testWrite(), TConsole::WriteString(), TConsole::WriteStringFast(), and TConsole::~TConsole().

◆ WriteConsole()

BOOL WINAPI WriteConsole ( IN HANDLE  hConsoleOutput,
IN const VOID lpBuffer,
IN DWORD  nNumberOfCharsToWrite,
OUT LPDWORD  lpNumberOfCharsWritten,
IN LPVOID  lpReserved 
)

Definition at line 174 of file console.c.

180{
183
184 Status = NtWriteFile(hConsoleOutput,
185 NULL,
186 NULL,
187 NULL,
190 nNumberOfCharsToWrite,
191 NULL,
192 NULL);
193 if (!NT_SUCCESS(Status))
194 return FALSE;
195
196 *lpNumberOfCharsWritten = IoStatusBlock.Information;
197 return TRUE;
198}
NTSYSAPI NTSTATUS NTAPI NtWriteFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID WriteBuffer, IN ULONG WriteBufferLength, IN PLARGE_INTEGER FileOffset OPTIONAL, IN PULONG LockOperationKey OPTIONAL)

◆ WriteConsoleOutputCharacterA()

BOOL WINAPI WriteConsoleOutputCharacterA ( HANDLE  hConsoleOutput,
IN LPCSTR  lpCharacter,
IN DWORD  nLength,
IN COORD  dwWriteCoord,
OUT LPDWORD  lpNumberOfCharsWritten 
)

Definition at line 407 of file console.c.

413{
416 COORD *pCoord;
417 PCHAR pText;
419
421 0,
422 nLength + sizeof(COORD));
423 pCoord = (COORD *)Buffer;
424 pText = (PCHAR)(pCoord + 1);
425
426 *pCoord = dwWriteCoord;
427 memcpy(pText, lpCharacter, nLength);
428
429 Status = NtDeviceIoControlFile(hConsoleOutput,
430 NULL,
431 NULL,
432 NULL,
435 NULL,
436 0,
437 Buffer,
438 nLength + sizeof(COORD));
439
441 if (!NT_SUCCESS(Status))
442 return FALSE;
443
444 *lpNumberOfCharsWritten = IoStatusBlock.Information;
445 return TRUE;
446}
#define PCHAR
Definition: match.c:90
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
Definition: ntddblue.h:20
Definition: bl.h:1338
LPCSTR pText
Definition: txtscale.cpp:79
char * PCHAR
Definition: typedefs.h:51
char CHAR
Definition: xmlstorage.h:175

Referenced by CONSOLE_PrintTextXY(), CONSOLE_PrintTextXYN(), CONSOLE_SetHighlightedTextXY(), CONSOLE_SetInvertedTextXY(), CONSOLE_SetStatusTextXV(), CONSOLE_SetTextXY(), CONSOLE_SetUnderlinedTextXY(), DrawListEntries(), DrawPartitionList(), DrawProgressBar(), PopupError(), PrintDiskData(), PrintPartitionData(), ProgressSetStep(), resetContent(), ShowPartitionSizeInputBox(), and test_WriteConsoleOutputCharacterA().

◆ WriteConsoleOutputCharacterW()

BOOL WINAPI WriteConsoleOutputCharacterW ( HANDLE  hConsoleOutput,
IN LPCWSTR  lpCharacter,
IN DWORD  nLength,
IN COORD  dwWriteCoord,
OUT LPDWORD  lpNumberOfCharsWritten 
)

Definition at line 451 of file console.c.

457{
460 COORD *pCoord;
461 PCHAR pText;
463// ULONG i;
464
468
469 UnicodeString.Length = nLength * sizeof(WCHAR);
470 UnicodeString.MaximumLength = nLength * sizeof(WCHAR);
471 UnicodeString.Buffer = (PWSTR)lpCharacter;
472
474
475
477 0,
478 OemLength + sizeof(COORD));
479// nLength + sizeof(COORD));
480 if (Buffer== NULL)
481 return FALSE;
482
483 pCoord = (COORD *)Buffer;
484 pText = (PCHAR)(pCoord + 1);
485
486 *pCoord = dwWriteCoord;
487
488 OemString.Length = 0;
489 OemString.MaximumLength = OemLength;
490 OemString.Buffer = pText;
491
494 FALSE);
495 if (!NT_SUCCESS(Status))
496 goto done;
497
498 /* FIXME: use real unicode->oem conversion */
499// for (i = 0; i < nLength; i++)
500// pText[i] = (CHAR)lpCharacter[i];
501
502 Status = NtDeviceIoControlFile(hConsoleOutput,
503 NULL,
504 NULL,
505 NULL,
508 NULL,
509 0,
510 Buffer,
511 nLength + sizeof(COORD));
512
513done:
515 if (!NT_SUCCESS(Status))
516 return FALSE;
517
518 *lpNumberOfCharsWritten = IoStatusBlock.Information;
519 return TRUE;
520}
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToOemString(POEM_STRING DestinationString, PCUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
uint16_t * PWSTR
Definition: typedefs.h:56
STRING OEM_STRING
Definition: umtypes.h:203
#define RtlUnicodeStringToOemSize(STRING)
*BytesInOemString PCHAR OemString
Definition: rtlfuncs.h:1577

Referenced by CONSOLE_SetInputTextXY(), test_cp932(), test_WriteConsoleOutputCharacterW(), and WriteStringAt().

Variable Documentation

◆ InputDataQueue

KEYBOARD_INPUT_DATA InputDataQueue
static

Definition at line 41 of file console.c.

Referenced by PeekConsoleInput(), and ReadConsoleInput().

◆ InputIosb

IO_STATUS_BLOCK InputIosb
static

Definition at line 42 of file console.c.

Referenced by PeekConsoleInput(), and ReadConsoleInput().

◆ InputQueueEmpty

BOOLEAN InputQueueEmpty
static

◆ LastLoadedCodepage

UINT LastLoadedCodepage
static

Definition at line 43 of file console.c.

Referenced by SetConsoleOutputCP().

◆ WaitForInput

BOOLEAN WaitForInput
static