ReactOS  0.4.15-dev-4614-ga5a6101
console.c
Go to the documentation of this file.
1 /*
2  * ReactOS kernel
3  * Copyright (C) 2002 ReactOS Team
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 /*
20  * COPYRIGHT: See COPYING in the top level directory
21  * PROJECT: ReactOS text-mode setup
22  * FILE: base/setup/usetup/console.c
23  * PURPOSE: Console support functions
24  * PROGRAMMER:
25  */
26 
27 /* INCLUDES ******************************************************************/
28 
29 #include <usetup.h>
30 /* Blue Driver Header */
31 #include <blue/ntddblue.h>
32 #include "keytrans.h"
33 
34 #define NDEBUG
35 #include <debug.h>
36 
37 /* DATA **********************************************************************/
38 
41 static KEYBOARD_INPUT_DATA InputDataQueue; // Only one element!
44 
45 /* FUNCTIONS *****************************************************************/
46 
48 {
53 
54 static PVOID
56  IN PCABINET_CONTEXT CabinetContext,
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 }
71 
72 BOOL
73 WINAPI
75 {
77  UNICODE_STRING ScreenName = RTL_CONSTANT_STRING(L"\\??\\BlueScreen");
78  UNICODE_STRING KeyboardName = RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");
81  ULONG Enable;
82 
83  /* Open the screen */
85  &ScreenName,
86  0,
87  NULL,
88  NULL);
93  FILE_OPEN,
95  if (!NT_SUCCESS(Status))
96  return FALSE;
97 
98  /* Enable it */
99  Enable = TRUE;
101  NULL,
102  NULL,
103  NULL,
104  &IoStatusBlock,
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 */
117  SetConsoleOutputCP(437);
118 
119  /* Open the keyboard */
121  &KeyboardName,
122  0,
123  NULL,
124  NULL);
128  &IoStatusBlock,
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 }
143 
144 
145 BOOL
146 WINAPI
148  IN DWORD dwProcessId)
149 {
150  return FALSE;
151 }
152 
153 
154 BOOL
155 WINAPI
157 {
158  /* Reset the queue state */
161 
163  NtClose(StdInput);
164 
167 
168  return TRUE;
169 }
170 
171 
172 BOOL
173 WINAPI
175  IN HANDLE hConsoleOutput,
176  IN const VOID *lpBuffer,
177  IN DWORD nNumberOfCharsToWrite,
178  OUT LPDWORD lpNumberOfCharsWritten,
179  IN LPVOID lpReserved)
180 {
183 
184  Status = NtWriteFile(hConsoleOutput,
185  NULL,
186  NULL,
187  NULL,
188  &IoStatusBlock,
189  (PVOID)lpBuffer,
190  nNumberOfCharsToWrite,
191  NULL,
192  NULL);
193  if (!NT_SUCCESS(Status))
194  return FALSE;
195 
196  *lpNumberOfCharsWritten = IoStatusBlock.Information;
197  return TRUE;
198 }
199 
200 
201 HANDLE
202 WINAPI
204  IN DWORD nStdHandle)
205 {
206  switch (nStdHandle)
207  {
208  case STD_INPUT_HANDLE:
209  return StdInput;
210  case STD_OUTPUT_HANDLE:
211  return StdOutput;
212  default:
213  return INVALID_HANDLE_VALUE;
214  }
215 }
216 
217 
218 BOOL
219 WINAPI
221  IN HANDLE hConsoleInput)
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,
244  &IoStatusBlock,
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 }
262 
263 
264 BOOL
265 WINAPI
267  IN HANDLE hConsoleInput,
269  IN DWORD nLength,
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 */
297  WaitForInput = TRUE;
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 */
313  WaitForInput = TRUE;
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 }
337 
338 
339 BOOL
340 WINAPI
342  IN HANDLE hConsoleInput,
344  IN DWORD nLength,
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 */
369  WaitForInput = TRUE;
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 }
403 
404 
405 BOOL
406 WINAPI
408  HANDLE hConsoleOutput,
409  IN LPCSTR lpCharacter,
410  IN DWORD nLength,
411  IN COORD dwWriteCoord,
412  OUT LPDWORD lpNumberOfCharsWritten)
413 {
415  PCHAR Buffer;
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,
433  &IoStatusBlock,
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 }
447 
448 
449 BOOL
450 WINAPI
452  HANDLE hConsoleOutput,
453  IN LPCWSTR lpCharacter,
454  IN DWORD nLength,
455  IN COORD dwWriteCoord,
456  OUT LPDWORD lpNumberOfCharsWritten)
457 {
459  PCHAR Buffer;
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 
493  &UnicodeString,
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,
506  &IoStatusBlock,
508  NULL,
509  0,
510  Buffer,
511  nLength + sizeof(COORD));
512 
513 done:
515  if (!NT_SUCCESS(Status))
516  return FALSE;
517 
518  *lpNumberOfCharsWritten = IoStatusBlock.Information;
519  return TRUE;
520 }
521 
522 
523 BOOL
524 WINAPI
526  IN HANDLE hConsoleOutput,
527  IN WORD wAttribute,
528  IN DWORD nLength,
529  IN COORD dwWriteCoord,
530  OUT LPDWORD lpNumberOfAttrsWritten)
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,
544  &IoStatusBlock,
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 }
556 
557 
558 BOOL
559 WINAPI
561  IN HANDLE hConsoleOutput,
562  IN CHAR cCharacter,
563  IN DWORD nLength,
564  IN COORD dwWriteCoord,
565  OUT LPDWORD lpNumberOfCharsWritten)
566 {
570 
571  Buffer.cCharacter = cCharacter;
572  Buffer.nLength = nLength;
573  Buffer.dwCoord = dwWriteCoord;
574 
575  Status = NtDeviceIoControlFile(hConsoleOutput,
576  NULL,
577  NULL,
578  NULL,
579  &IoStatusBlock,
581  &Buffer,
582  sizeof(OUTPUT_CHARACTER),
583  &Buffer,
584  sizeof(OUTPUT_CHARACTER));
585  if (!NT_SUCCESS(Status))
586  return FALSE;
587 
588  *lpNumberOfCharsWritten = Buffer.dwTransfered;
589  return TRUE;
590 }
591 
592 
593 BOOL
594 WINAPI
596  IN HANDLE hConsoleOutput,
597  OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
598 {
601 
602  Status = NtDeviceIoControlFile(hConsoleOutput,
603  NULL,
604  NULL,
605  NULL,
606  &IoStatusBlock,
608  NULL,
609  0,
610  lpConsoleScreenBufferInfo,
612  return NT_SUCCESS(Status);
613 }
614 
615 
616 BOOL
617 WINAPI
619  IN HANDLE hConsoleOutput,
620  IN const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
621 {
624 
625  Status = NtDeviceIoControlFile(hConsoleOutput,
626  NULL,
627  NULL,
628  NULL,
629  &IoStatusBlock,
631  (PCONSOLE_CURSOR_INFO)lpConsoleCursorInfo,
632  sizeof(CONSOLE_CURSOR_INFO),
633  NULL,
634  0);
635  return NT_SUCCESS(Status);
636 }
637 
638 
639 BOOL
640 WINAPI
642  IN HANDLE hConsoleOutput,
643  IN COORD dwCursorPosition)
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,
660  &IoStatusBlock,
662  &ConsoleScreenBufferInfo,
664  NULL,
665  0);
666  return NT_SUCCESS(Status);
667 }
668 
669 
670 BOOL
671 WINAPI
673  IN HANDLE hConsoleOutput,
674  IN WORD wAttributes)
675 {
678 
679  Status = NtDeviceIoControlFile(hConsoleOutput,
680  NULL,
681  NULL,
682  NULL,
683  &IoStatusBlock,
685  &wAttributes,
686  sizeof(USHORT),
687  NULL,
688  0);
689  return NT_SUCCESS(Status);
690 }
691 
692 
693 BOOL
694 WINAPI
696  IN UINT wCodepage)
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,
750  &IoStatusBlock,
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 }
765 
766 
767 /* EOF */
VOID CabinetInitialize(IN OUT PCABINET_CONTEXT CabinetContext)
Definition: cabinet.c:501
struct _CONSOLE_CABINET_CONTEXT CONSOLE_CABINET_CONTEXT
signed char * PCHAR
Definition: retypes.h:7
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
*BytesInOemString PCHAR OemString
Definition: rtlfuncs.h:1560
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define IN
Definition: typedefs.h:39
BOOL WINAPI SetConsoleOutputCP(IN UINT wCodepage)
Definition: console.c:695
static KEYBOARD_INPUT_DATA InputDataQueue
Definition: console.c:41
ULONG CabinetExtractFile(IN PCABINET_CONTEXT CabinetContext, IN PCAB_SEARCH Search)
Definition: cabinet.c:959
BOOL WINAPI AllocConsole(VOID)
Definition: console.c:74
#define IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
Definition: ntddblue.h:7
static IO_STATUS_BLOCK InputIosb
Definition: console.c:42
LPCSTR pText
Definition: txtscale.cpp:79
#define IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
Definition: ntddblue.h:16
BOOL WINAPI FillConsoleOutputAttribute(IN HANDLE hConsoleOutput, IN WORD wAttribute, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfAttrsWritten)
Definition: console.c:525
#define FILE_ALL_ACCESS
Definition: nt_native.h:651
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
_In_ DWORD _Out_ LPDWORD lpNumberOfEventsRead
Definition: wincon.h:473
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
#define TRUE
Definition: types.h:120
uint16_t * PWSTR
Definition: typedefs.h:56
BOOL WINAPI ReadConsoleInput(IN HANDLE hConsoleInput, OUT PINPUT_RECORD lpBuffer, IN DWORD nLength, OUT LPDWORD lpNumberOfEventsRead)
Definition: console.c:341
char CHAR
Definition: xmlstorage.h:175
VOID CabinetClose(IN OUT PCABINET_CONTEXT CabinetContext)
Definition: cabinet.c:801
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:140
HANDLE StdInput
Definition: consup.c:36
struct _CONSOLE_CABINET_CONTEXT * PCONSOLE_CABINET_CONTEXT
_In_ DWORD nLength
Definition: wincon.h:473
#define INVALID_HANDLE_VALUE
Definition: compat.h:590
BOOL WINAPI FlushConsoleInputBuffer(IN HANDLE hConsoleInput)
Definition: console.c:220
static BOOLEAN WaitForInput
Definition: console.c:40
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:203
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)
#define IOCTL_CONSOLE_SET_CURSOR_INFO
Definition: ntddblue.h:9
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_opt_ PCUNICODE_STRING UnicodeString
Definition: wdfstring.h:64
STRING OEM_STRING
Definition: umtypes.h:203
VOID CabinetSetCabinetName(IN PCABINET_CONTEXT CabinetContext, IN PCWSTR FileName)
Definition: cabinet.c:580
BOOL WINAPI FillConsoleOutputCharacterA(IN HANDLE hConsoleOutput, IN CHAR cCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
Definition: console.c:560
#define IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER
Definition: ntddblue.h:18
#define STATUS_TIMEOUT
Definition: ntstatus.h:81
BOOL WINAPI WriteConsoleOutputCharacterW(HANDLE hConsoleOutput, IN LPCWSTR lpCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
Definition: console.c:451
#define FILE_SYNCHRONOUS_IO_ALERT
Definition: from_kernel.h:30
#define L(x)
Definition: ntvdm.h:50
BOOL WINAPI PeekConsoleInput(IN HANDLE hConsoleInput, OUT PINPUT_RECORD lpBuffer, IN DWORD nLength, OUT LPDWORD lpNumberOfEventsRead)
Definition: console.c:266
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
NTSTATUS IntTranslateKey(HANDLE hConsoleInput, PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event)
Definition: keytrans.c:417
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
#define KEY_EVENT
Definition: wincon.h:128
HANDLE StdOutput
Definition: consup.c:37
#define IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE
Definition: ntddblue.h:13
unsigned char BOOLEAN
BOOL WINAPI SetConsoleCursorPosition(IN HANDLE hConsoleOutput, IN COORD dwCursorPosition)
Definition: console.c:641
Definition: bufpool.h:45
const char * LPCSTR
Definition: xmlstorage.h:183
#define STD_INPUT_HANDLE
Definition: winbase.h:264
BOOL WINAPI WriteConsoleOutputCharacterA(HANDLE hConsoleOutput, IN LPCSTR lpCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
Definition: console.c:407
BOOL WINAPI GetConsoleScreenBufferInfo(IN HANDLE hConsoleOutput, OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
Definition: console.c:595
#define PCHAR
Definition: match.c:90
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
ULONG X
Definition: bl.h:1339
Status
Definition: gdiplustypes.h:24
BOOL WINAPI SetConsoleTextAttribute(IN HANDLE hConsoleOutput, IN WORD wAttributes)
Definition: console.c:672
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:3951
BOOL WINAPI FreeConsole(VOID)
Definition: console.c:156
#define ASSERT(a)
Definition: mode.c:44
BOOL WINAPI SetConsoleCursorInfo(IN HANDLE hConsoleOutput, IN const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
Definition: console.c:618
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STATUS_PENDING
Definition: ntstatus.h:82
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
#define WINAPI
Definition: msvc.h:6
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
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:1340
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3401
#define CAB_STATUS_SUCCESS
Definition: cabinet.h:23
static BOOLEAN InputQueueEmpty
Definition: console.c:39
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)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToOemString(POEM_STRING DestinationString, PCUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
_Must_inspect_result_ _Out_ PLARGE_INTEGER FileSize
Definition: fsrtlfuncs.h:108
#define STD_OUTPUT_HANDLE
Definition: winbase.h:265
ULONG CabinetOpen(IN OUT PCABINET_CONTEXT CabinetContext)
Definition: cabinet.c:621
#define IOCTL_CONSOLE_RESET_SCREEN
Definition: ntddblue.h:4
Definition: bl.h:1337
HANDLE ProcessHeap
Definition: servman.c:15
#define FILE_OPEN
Definition: from_kernel.h:54
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
static PVOID ConsoleCreateFileHandler(IN PCABINET_CONTEXT CabinetContext, IN ULONG FileSize)
Definition: console.c:55
static ULONG Timeout
Definition: ping.c:61
unsigned short USHORT
Definition: pedump.c:61
CABINET_CONTEXT CabinetContext
Definition: console.c:49
ULONG CabinetFindFirst(IN PCABINET_CONTEXT CabinetContext, IN PCWSTR FileName, IN OUT PCAB_SEARCH Search)
Definition: cabinet.c:820
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
static UINT LastLoadedCodepage
Definition: console.c:43
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
NTSYSAPI DWORD WINAPI RtlUnicodeStringToOemSize(const UNICODE_STRING *)
#define IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
Definition: ntddblue.h:6
#define IOCTL_CONSOLE_LOADFONT
Definition: ntddblue.h:24
#define OUT
Definition: typedefs.h:40
BOOL WINAPI AttachConsole(IN DWORD dwProcessId)
Definition: console.c:147
uint32_t * LPDWORD
Definition: typedefs.h:59
NTSTATUS NTAPI NtCancelIoFile(IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock)
Definition: file.c:4018
unsigned int ULONG
Definition: retypes.h:1
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
Definition: ntddblue.h:20
BOOL WINAPI WriteConsole(IN HANDLE hConsoleOutput, IN const VOID *lpBuffer, IN DWORD nNumberOfCharsToWrite, OUT LPDWORD lpNumberOfCharsWritten, IN LPVOID lpReserved)
Definition: console.c:174
#define DPRINT
Definition: sndvol32.h:71
ULONG Y
Definition: bl.h:1340
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)
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)