From 412fe7d9ac0c0b622ba0d82d94f3a2ac52726816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Tue, 13 May 2025 14:26:37 +0200 Subject: [PATCH] [SDK] Improve wincon.h and add wincon_undoc.h (#8019) - Add missing WINBASEAPI modifiers. - Update/add missing SAL annotations. - Add missing function argument names. - Only keep public definitions there. - Move private/undocumented ones in a new wincon_undoc.h This header is based on the following resources: - https://undoc.airesoft.co.uk/kernel32.dll/ - https://github.com/microsoft/terminal/blob/main/dep/Console/ntcon.h - https://github.com/microsoft/terminal/blob/main/dep/Console/winconp.h (commit f08321a0b2) --- CODEOWNERS | 2 + sdk/include/psdk/wincon.h | 642 ++++++++++++++++++++--------- sdk/include/reactos/wincon_undoc.h | 623 ++++++++++++++++++++++++++++ 3 files changed, 1068 insertions(+), 199 deletions(-) create mode 100644 sdk/include/reactos/wincon_undoc.h diff --git a/CODEOWNERS b/CODEOWNERS index d28ad14505e..fa33e8d9792 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -167,6 +167,8 @@ /drivers/base/condrv/ @HBelusca /drivers/setup/blue/ @HBelusca /modules/rostests/winetests/kernel32/console.c @HBelusca +/sdk/include/psdk/wincon.h @HBelusca +/sdk/include/reactos/wincon_undoc.h @HBelusca /sdk/include/reactos/drivers/condrv/ @HBelusca /sdk/include/reactos/drivers/blue/ @HBelusca /sdk/include/reactos/subsys/win/conmsg.h @HBelusca diff --git a/sdk/include/psdk/wincon.h b/sdk/include/psdk/wincon.h index 1af408d0357..46c3f5c419b 100644 --- a/sdk/include/psdk/wincon.h +++ b/sdk/include/psdk/wincon.h @@ -1,12 +1,34 @@ -#ifndef _WINCON_H -#define _WINCON_H +/* + * wincon.h + * + * Console API definitions + * + * This file is part of the ReactOS PSDK package. + * + * Contributors: + * Hermès Bélusca-Maïto + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef _WINCON_ +#define _WINCON_ #ifdef __cplusplus extern "C" { #endif #if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) && !defined(NOGDI) -# include "wingdi.h" +#include "wingdi.h" #endif #ifdef _MSC_VER @@ -17,19 +39,25 @@ extern "C" { /* * Special PID for parent process for AttachConsole API */ -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) #define ATTACH_PARENT_PROCESS ((DWORD)-1) #endif +/* Special console handle values */ +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) +#define CONSOLE_REAL_OUTPUT_HANDLE (LongToHandle(-2)) +#define CONSOLE_REAL_INPUT_HANDLE (LongToHandle(-3)) +#endif + /* * Console display modes */ -// These codes are answered by GetConsoleDisplayMode +// These flags are returned by GetConsoleDisplayMode #define CONSOLE_WINDOWED 0 -#define CONSOLE_FULLSCREEN 1 -#define CONSOLE_FULLSCREEN_HARDWARE 2 +#define CONSOLE_FULLSCREEN 1 /* Fullscreen console */ +#define CONSOLE_FULLSCREEN_HARDWARE 2 /* Console owns the hardware */ -// These codes should be given to SetConsoleDisplayMode +// These flags are given to SetConsoleDisplayMode #define CONSOLE_FULLSCREEN_MODE 1 #define CONSOLE_WINDOWED_MODE 2 @@ -59,18 +87,19 @@ extern "C" { /* * Screen buffer types */ -#define CONSOLE_TEXTMODE_BUFFER 1 -#define CONSOLE_GRAPHICS_BUFFER 2 /* Undocumented, see http://blog.airesoft.co.uk/2012/10/things-ms-can-do-that-they-dont-tell-you-about-console-graphics/ */ +#define CONSOLE_TEXTMODE_BUFFER 1 +// 2 is reserved! /* * Control handler codes */ -#define CTRL_C_EVENT 0 -#define CTRL_BREAK_EVENT 1 -#define CTRL_CLOSE_EVENT 2 -#define CTRL_LAST_CLOSE_EVENT 3 /* Undocumented */ -#define CTRL_LOGOFF_EVENT 5 -#define CTRL_SHUTDOWN_EVENT 6 +#define CTRL_C_EVENT 0 +#define CTRL_BREAK_EVENT 1 +#define CTRL_CLOSE_EVENT 2 +// 3 is reserved! +// 4 is reserved! +#define CTRL_LOGOFF_EVENT 5 +#define CTRL_SHUTDOWN_EVENT 6 /* * Input mode flags @@ -86,24 +115,29 @@ extern "C" { #if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) #define ENABLE_AUTO_POSITION 0x0100 #endif -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) +#if (NTDDI_VERSION >= NTDDI_WIN10_RS1) // (_WIN32_WINNT >= _WIN32_WINNT_WIN10) #define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 #endif /* * Output mode flags */ -#define ENABLE_PROCESSED_OUTPUT 0x0001 -#define ENABLE_WRAP_AT_EOL_OUTPUT 0x0002 +#define ENABLE_PROCESSED_OUTPUT 0x0001 +#define ENABLE_WRAP_AT_EOL_OUTPUT 0x0002 +#if (NTDDI_VERSION >= NTDDI_WIN10_RS1) // (_WIN32_WINNT >= _WIN32_WINNT_WIN10) +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#define DISABLE_NEWLINE_AUTO_RETURN 0x0008 +#define ENABLE_LVB_GRID_WORLDWIDE 0x0010 +#endif /* * Console selection flags */ #define CONSOLE_NO_SELECTION 0x0000 -#define CONSOLE_SELECTION_IN_PROGRESS 0x0001 -#define CONSOLE_SELECTION_NOT_EMPTY 0x0002 -#define CONSOLE_MOUSE_SELECTION 0x0004 -#define CONSOLE_MOUSE_DOWN 0x0008 +#define CONSOLE_SELECTION_IN_PROGRESS 0x0001 /* Selection has begun */ +#define CONSOLE_SELECTION_NOT_EMPTY 0x0002 /* Non-null select rectangle */ +#define CONSOLE_MOUSE_SELECTION 0x0004 /* Selecting with mouse */ +#define CONSOLE_MOUSE_DOWN 0x0008 /* Mouse is down */ /* * History information and mode flags @@ -116,12 +150,6 @@ extern "C" { #endif -/* - * Read input flags - */ -#define CONSOLE_READ_NOREMOVE 0x0001 -#define CONSOLE_READ_NOWAIT 0x0002 - /* * Event types */ @@ -151,6 +179,8 @@ extern "C" { #define NLS_HIRAGANA 0x00040000 /* Hiragana mode */ #define NLS_ROMAN 0x00400000 /* Roman/Noroman mode */ #define NLS_IME_CONVERSION 0x00800000 /* IME conversion */ +/* Reserved for EXTENDED_BIT, DONTCARE_BIT, FAKE_KEYSTROKE, ALTNUMPAD_BIT (kbd.h) */ +#define ALTNUMPAD_BIT 0x04000000 /* AltNumpad OEM char */ #define NLS_IME_DISABLE 0x20000000 /* IME enable/disable */ /* @@ -223,18 +253,9 @@ typedef struct _CONSOLE_SCREEN_BUFFER_INFO { COORD dwMaximumWindowSize; } CONSOLE_SCREEN_BUFFER_INFO,*PCONSOLE_SCREEN_BUFFER_INFO; -/* Undocumented, see http://blog.airesoft.co.uk/2012/10/things-ms-can-do-that-they-dont-tell-you-about-console-graphics/ */ -#if defined(_WINGDI_) && !defined(NOGDI) -typedef struct _CONSOLE_GRAPHICS_BUFFER_INFO { - DWORD dwBitMapInfoLength; - LPBITMAPINFO lpBitMapInfo; - DWORD dwUsage; // DIB_PAL_COLORS or DIB_RGB_COLORS - HANDLE hMutex; - PVOID lpBitMap; -} CONSOLE_GRAPHICS_BUFFER_INFO, *PCONSOLE_GRAPHICS_BUFFER_INFO; -#endif - -typedef BOOL(CALLBACK *PHANDLER_ROUTINE)(_In_ DWORD); +typedef BOOL +(WINAPI *PHANDLER_ROUTINE)( + _In_ DWORD CtrlType); typedef struct _KEY_EVENT_RECORD { BOOL bKeyDown; @@ -310,148 +331,320 @@ typedef struct _CONSOLE_FONT_INFOEX { WCHAR FaceName[LF_FACESIZE]; } CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX; #endif +#endif // (_WIN32_WINNT >= _WIN32_WINNT_VISTA) + +WINBASEAPI +BOOL +WINAPI +AllocConsole(VOID); + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) +WINBASEAPI +BOOL +WINAPI +AttachConsole( + _In_ DWORD dwProcessId); #endif -BOOL WINAPI AllocConsole(VOID); - #if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) -BOOL WINAPI AttachConsole(_In_ DWORD); -BOOL WINAPI AddConsoleAliasA(_In_ LPCSTR, _In_ LPCSTR, _In_ LPCSTR); -BOOL WINAPI AddConsoleAliasW(_In_ LPCWSTR, _In_ LPCWSTR, _In_ LPCWSTR); +WINBASEAPI +DWORD +WINAPI +GetConsoleProcessList( + _Out_writes_(dwProcessCount) LPDWORD lpdwProcessList, + _In_ DWORD dwProcessCount); +WINBASEAPI +BOOL +WINAPI +AddConsoleAliasA( + _In_ LPCSTR Source, + _In_ LPCSTR Target, + _In_ LPCSTR ExeName); + +WINBASEAPI +BOOL +WINAPI +AddConsoleAliasW( + _In_ LPCWSTR Source, + _In_ LPCWSTR Target, + _In_ LPCWSTR ExeName); + +WINBASEAPI DWORD WINAPI GetConsoleAliasA( - _In_ LPSTR Source, + _In_ LPCSTR Source, _Out_writes_(TargetBufferLength) LPSTR TargetBuffer, _In_ DWORD TargetBufferLength, - _In_ LPSTR ExeName); + _In_ LPCSTR ExeName); +WINBASEAPI DWORD WINAPI GetConsoleAliasW( - _In_ LPWSTR Source, + _In_ LPCWSTR Source, _Out_writes_(TargetBufferLength) LPWSTR TargetBuffer, _In_ DWORD TargetBufferLength, - _In_ LPWSTR ExeName); + _In_ LPCWSTR ExeName); +WINBASEAPI DWORD WINAPI GetConsoleAliasesA( _Out_writes_(AliasBufferLength) LPSTR AliasBuffer, _In_ DWORD AliasBufferLength, - _In_ LPSTR ExeName); + _In_ LPCSTR ExeName); +WINBASEAPI DWORD WINAPI GetConsoleAliasesW( _Out_writes_(AliasBufferLength) LPWSTR AliasBuffer, _In_ DWORD AliasBufferLength, - _In_ LPWSTR ExeName); + _In_ LPCWSTR ExeName); -DWORD WINAPI GetConsoleAliasesLengthA(_In_ LPSTR ExeName); -DWORD WINAPI GetConsoleAliasesLengthW(_In_ LPWSTR ExeName); +WINBASEAPI +DWORD +WINAPI +GetConsoleAliasesLengthA( + _In_ LPCSTR ExeName); +WINBASEAPI +DWORD +WINAPI +GetConsoleAliasesLengthW( + _In_ LPCWSTR ExeName); + +WINBASEAPI DWORD WINAPI GetConsoleAliasExesA( _Out_writes_(ExeNameBufferLength) LPSTR ExeNameBuffer, _In_ DWORD ExeNameBufferLength); +WINBASEAPI DWORD WINAPI GetConsoleAliasExesW( _Out_writes_(ExeNameBufferLength) LPWSTR ExeNameBuffer, _In_ DWORD ExeNameBufferLength); -DWORD WINAPI GetConsoleAliasExesLengthA(VOID); -DWORD WINAPI GetConsoleAliasExesLengthW(VOID); -#endif +WINBASEAPI +DWORD +WINAPI +GetConsoleAliasExesLengthA(VOID); +WINBASEAPI +DWORD +WINAPI +GetConsoleAliasExesLengthW(VOID); + +#endif // (_WIN32_WINNT >= _WIN32_WINNT_WINXP) + +WINBASEAPI HANDLE WINAPI CreateConsoleScreenBuffer( - _In_ DWORD, - _In_ DWORD, - _In_opt_ CONST SECURITY_ATTRIBUTES*, - _In_ DWORD, - _Reserved_ LPVOID); + _In_ DWORD dwDesiredAccess, + _In_ DWORD dwShareMode, + _In_opt_ CONST SECURITY_ATTRIBUTES *lpSecurityAttributes, + _In_ DWORD dwFlags, + _Reserved_ LPVOID lpScreenBufferData); +WINBASEAPI BOOL WINAPI FillConsoleOutputAttribute( - _In_ HANDLE, - _In_ WORD, - _In_ DWORD, - _In_ COORD, - _Out_ PDWORD); + _In_ HANDLE hConsoleOutput, + _In_ WORD wAttribute, + _In_ DWORD nLength, + _In_ COORD dwWriteCoord, + _Out_ LPDWORD lpNumberOfAttrsWritten); +WINBASEAPI BOOL WINAPI FillConsoleOutputCharacterA( - _In_ HANDLE, - _In_ CHAR, - _In_ DWORD, - _In_ COORD, - _Out_ PDWORD); + _In_ HANDLE hConsoleOutput, + _In_ CHAR cCharacter, + _In_ DWORD nLength, + _In_ COORD dwWriteCoord, + _Out_ LPDWORD lpNumberOfCharsWritten); +WINBASEAPI BOOL WINAPI FillConsoleOutputCharacterW( - _In_ HANDLE, - _In_ WCHAR, - _In_ DWORD, - _In_ COORD, - _Out_ PDWORD); + _In_ HANDLE hConsoleOutput, + _In_ WCHAR cCharacter, + _In_ DWORD nLength, + _In_ COORD dwWriteCoord, + _Out_ LPDWORD lpNumberOfCharsWritten); -BOOL WINAPI FlushConsoleInputBuffer(_In_ HANDLE); -BOOL WINAPI FreeConsole(VOID); -BOOL WINAPI GenerateConsoleCtrlEvent(_In_ DWORD, _In_ DWORD); -UINT WINAPI GetConsoleCP(VOID); -BOOL WINAPI GetConsoleCursorInfo(_In_ HANDLE, _Out_ PCONSOLE_CURSOR_INFO); -BOOL WINAPI GetConsoleMode(_In_ HANDLE, _Out_ PDWORD); -UINT WINAPI GetConsoleOutputCP(VOID); +WINBASEAPI +BOOL +WINAPI +FlushConsoleInputBuffer( + _In_ HANDLE hConsoleInput); +WINBASEAPI +BOOL +WINAPI +FreeConsole(VOID); + +WINBASEAPI +BOOL +WINAPI +GenerateConsoleCtrlEvent( + _In_ DWORD dwCtrlEvent, + _In_ DWORD dwProcessGroupId); + +WINBASEAPI +UINT +WINAPI +GetConsoleCP(VOID); + +WINBASEAPI +BOOL +WINAPI +GetConsoleCursorInfo( + _In_ HANDLE hConsoleOutput, + _Out_ PCONSOLE_CURSOR_INFO lpConsoleCursorInfo); + +WINBASEAPI +BOOL +WINAPI +GetConsoleMode( + _In_ HANDLE hConsoleHandle, + _Out_ LPDWORD lpMode); + +WINBASEAPI +UINT +WINAPI +GetConsoleOutputCP(VOID); + +WINBASEAPI BOOL WINAPI GetConsoleScreenBufferInfo( - _In_ HANDLE, - _Out_ PCONSOLE_SCREEN_BUFFER_INFO); + _In_ HANDLE hConsoleOutput, + _Out_ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo); -/* Undocumented, see http://blog.airesoft.co.uk/2012/10/things-ms-can-do-that-they-dont-tell-you-about-console-graphics/ */ -BOOL WINAPI InvalidateConsoleDIBits(_In_ HANDLE, _In_ PSMALL_RECT); +#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) +WINBASEAPI +BOOL +WINAPI +GetConsoleScreenBufferInfoEx( + _In_ HANDLE hConsoleOutput, + _Inout_ PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx); +WINBASEAPI +BOOL +WINAPI +SetConsoleScreenBufferInfoEx( + _In_ HANDLE hConsoleOutput, + _In_ PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx); +#endif // (_WIN32_WINNT >= _WIN32_WINNT_VISTA) + +WINBASEAPI DWORD WINAPI GetConsoleTitleA( _Out_writes_(nSize) LPSTR lpConsoleTitle, _In_ DWORD nSize); +WINBASEAPI DWORD WINAPI GetConsoleTitleW( _Out_writes_(nSize) LPWSTR lpConsoleTitle, _In_ DWORD nSize); +#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) + +WINBASEAPI +DWORD +WINAPI +GetConsoleOriginalTitleA( + _Out_writes_(nSize) LPSTR lpConsoleTitle, + _In_ DWORD nSize); + +WINBASEAPI +DWORD +WINAPI +GetConsoleOriginalTitleW( + _Out_writes_(nSize) LPWSTR lpConsoleTitle, + _In_ DWORD nSize); + +#ifndef NOGDI +WINBASEAPI +BOOL +WINAPI +GetCurrentConsoleFontEx( + _In_ HANDLE hConsoleOutput, + _In_ BOOL bMaximumWindow, + _Out_ PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); + +WINBASEAPI +BOOL +WINAPI +SetCurrentConsoleFontEx( + _In_ HANDLE hConsoleOutput, + _In_ BOOL bMaximumWindow, + _In_ PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); +#endif + +WINBASEAPI +BOOL +WINAPI +GetConsoleHistoryInfo( + _Out_ PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo); + +WINBASEAPI +BOOL +WINAPI +SetConsoleHistoryInfo( + _In_ PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo); + +#endif // (_WIN32_WINNT >= _WIN32_WINNT_VISTA) + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) + +WINBASEAPI +BOOL +WINAPI +GetCurrentConsoleFont( + _In_ HANDLE hConsoleOutput, + _In_ BOOL bMaximumWindow, + _Out_ PCONSOLE_FONT_INFO lpConsoleCurrentFont); + +WINBASEAPI COORD WINAPI GetConsoleFontSize( _In_ HANDLE hConsoleOutput, _In_ DWORD nFont); +WINBASEAPI BOOL WINAPI -GetCurrentConsoleFont( - _In_ HANDLE hConsoleOutput, - _In_ BOOL bMaximumWindow, - _Out_ PCONSOLE_FONT_INFO lpConsoleCurrentFont); +GetConsoleSelectionInfo( + _Out_ PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo); -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) +WINBASEAPI +HWND +WINAPI +GetConsoleWindow(VOID); -HWND WINAPI GetConsoleWindow(VOID); -BOOL WINAPI GetConsoleDisplayMode(_Out_ LPDWORD lpModeFlags); +WINBASEAPI +BOOL +WINAPI +GetConsoleDisplayMode( + _Out_ LPDWORD lpModeFlags); +WINBASEAPI BOOL WINAPI SetConsoleDisplayMode( @@ -459,13 +652,29 @@ SetConsoleDisplayMode( _In_ DWORD dwFlags, _Out_opt_ PCOORD lpNewScreenBufferDimensions); -#endif +#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) -COORD WINAPI GetLargestConsoleWindowSize(_In_ HANDLE); -BOOL WINAPI GetNumberOfConsoleInputEvents(_In_ HANDLE, _Out_ PDWORD); -BOOL WINAPI GetNumberOfConsoleMouseButtons(_Out_ PDWORD); +WINBASEAPI +COORD +WINAPI +GetLargestConsoleWindowSize( + _In_ HANDLE hConsoleOutput); -_Success_(return != 0) +WINBASEAPI +BOOL +WINAPI +GetNumberOfConsoleInputEvents( + _In_ HANDLE hConsoleInput, + _Out_ LPDWORD lpNumberOfEvents); + +WINBASEAPI +BOOL +WINAPI +GetNumberOfConsoleMouseButtons( + _Out_ LPDWORD lpNumberOfMouseButtons); + +WINBASEAPI +_Success_(return != FALSE) BOOL WINAPI PeekConsoleInputA( _In_ HANDLE hConsoleInput, @@ -473,7 +682,8 @@ WINAPI PeekConsoleInputA( _In_ DWORD nLength, _Out_ LPDWORD lpNumberOfEventsRead); -_Success_(return != 0) +WINBASEAPI +_Success_(return != FALSE) BOOL WINAPI PeekConsoleInputW( @@ -482,64 +692,49 @@ PeekConsoleInputW( _In_ DWORD nLength, _Out_ LPDWORD lpNumberOfEventsRead); -_Success_(return != 0) +WINBASEAPI +_Success_(return != FALSE) BOOL WINAPI ReadConsoleA( _In_ HANDLE hConsoleInput, _Out_writes_bytes_to_(nNumberOfCharsToRead * sizeof(CHAR), *lpNumberOfCharsRead * sizeof(CHAR)) LPVOID lpBuffer, _In_ DWORD nNumberOfCharsToRead, - _Out_ _Deref_out_range_(<= , nNumberOfCharsToRead) LPDWORD lpNumberOfCharsRead, + _Out_ _Deref_out_range_(<=, nNumberOfCharsToRead) LPDWORD lpNumberOfCharsRead, _In_opt_ PCONSOLE_READCONSOLE_CONTROL pInputControl); -_Success_(return != 0) +WINBASEAPI +_Success_(return != FALSE) BOOL WINAPI ReadConsoleW( _In_ HANDLE hConsoleInput, _Out_writes_bytes_to_(nNumberOfCharsToRead * sizeof(WCHAR), *lpNumberOfCharsRead * sizeof(WCHAR)) LPVOID lpBuffer, _In_ DWORD nNumberOfCharsToRead, - _Out_ _Deref_out_range_(<= , nNumberOfCharsToRead) LPDWORD lpNumberOfCharsRead, + _Out_ _Deref_out_range_(<=, nNumberOfCharsToRead) LPDWORD lpNumberOfCharsRead, _In_opt_ PCONSOLE_READCONSOLE_CONTROL pInputControl); -_Success_(return != 0) +WINBASEAPI +_Success_(return != FALSE) BOOL WINAPI ReadConsoleInputA( _In_ HANDLE hConsoleInput, _Out_writes_to_(nLength, *lpNumberOfEventsRead) PINPUT_RECORD lpBuffer, _In_ DWORD nLength, - _Out_ _Deref_out_range_(<= , nLength) LPDWORD lpNumberOfEventsRead); + _Out_ _Deref_out_range_(<=, nLength) LPDWORD lpNumberOfEventsRead); -_Success_(return != 0) +WINBASEAPI +_Success_(return != FALSE) BOOL WINAPI ReadConsoleInputW( _In_ HANDLE hConsoleInput, _Out_writes_to_(nLength, *lpNumberOfEventsRead) PINPUT_RECORD lpBuffer, _In_ DWORD nLength, - _Out_ _Deref_out_range_(<= , nLength) LPDWORD lpNumberOfEventsRead); - -_Success_(return != 0) -BOOL -WINAPI -ReadConsoleInputExA( - _In_ HANDLE hConsoleInput, - _Out_writes_to_(nLength, *lpNumberOfEventsRead) PINPUT_RECORD lpBuffer, - _In_ DWORD nLength, - _Out_ _Deref_out_range_(<= , nLength) LPDWORD lpNumberOfEventsRead, - _In_ WORD wFlags); - -_Success_(return != 0) -BOOL -WINAPI -ReadConsoleInputExW( - _In_ HANDLE hConsoleInput, - _Out_writes_to_(nLength, *lpNumberOfEventsRead) PINPUT_RECORD lpBuffer, - _In_ DWORD nLength, - _Out_ _Deref_out_range_(<= , nLength) LPDWORD lpNumberOfEventsRead, - _In_ WORD wFlags); + _Out_ _Deref_out_range_(<=, nLength) LPDWORD lpNumberOfEventsRead); +WINBASEAPI BOOL WINAPI ReadConsoleOutputAttribute( @@ -549,6 +744,7 @@ ReadConsoleOutputAttribute( _In_ COORD dwReadCoord, _Out_ LPDWORD lpNumberOfAttrsRead); +WINBASEAPI BOOL WINAPI ReadConsoleOutputCharacterA( @@ -558,6 +754,7 @@ ReadConsoleOutputCharacterA( _In_ COORD dwReadCoord, _Out_ LPDWORD lpNumberOfCharsRead); +WINBASEAPI BOOL WINAPI ReadConsoleOutputCharacterW( @@ -567,6 +764,7 @@ ReadConsoleOutputCharacterW( _In_ COORD dwReadCoord, _Out_ LPDWORD lpNumberOfCharsRead); +WINBASEAPI BOOL WINAPI ReadConsoleOutputA( @@ -576,6 +774,7 @@ ReadConsoleOutputA( _In_ COORD dwBufferCoord, _Inout_ PSMALL_RECT lpReadRegion); +WINBASEAPI BOOL WINAPI ReadConsoleOutputW( @@ -585,68 +784,107 @@ ReadConsoleOutputW( _In_ COORD dwBufferCoord, _Inout_ PSMALL_RECT lpReadRegion); +WINBASEAPI BOOL WINAPI ScrollConsoleScreenBufferA( - _In_ HANDLE, - _In_ const SMALL_RECT*, - _In_opt_ const SMALL_RECT*, - _In_ COORD, - _In_ const CHAR_INFO*); + _In_ HANDLE hConsoleOutput, + _In_ CONST SMALL_RECT *lpScrollRectangle, + _In_opt_ CONST SMALL_RECT *lpClipRectangle, + _In_ COORD dwDestinationOrigin, + _In_ CONST CHAR_INFO *lpFill); +WINBASEAPI BOOL WINAPI ScrollConsoleScreenBufferW( - _In_ HANDLE, - _In_ const SMALL_RECT*, - _In_opt_ const SMALL_RECT*, - _In_ COORD, - _In_ const CHAR_INFO*); + _In_ HANDLE hConsoleOutput, + _In_ CONST SMALL_RECT *lpScrollRectangle, + _In_opt_ CONST SMALL_RECT *lpClipRectangle, + _In_ COORD dwDestinationOrigin, + _In_ CONST CHAR_INFO *lpFill); -BOOL WINAPI SetConsoleActiveScreenBuffer(_In_ HANDLE); -BOOL WINAPI SetConsoleCP(_In_ UINT); -BOOL WINAPI SetConsoleCtrlHandler(_In_opt_ PHANDLER_ROUTINE, _In_ BOOL); -BOOL WINAPI SetConsoleCursorInfo(_In_ HANDLE, _In_ const CONSOLE_CURSOR_INFO*); -BOOL WINAPI SetConsoleCursorPosition(_In_ HANDLE, _In_ COORD); -BOOL WINAPI SetConsoleMode(_In_ HANDLE, _In_ DWORD); -BOOL WINAPI SetConsoleOutputCP(_In_ UINT); -BOOL WINAPI SetConsoleScreenBufferSize(_In_ HANDLE, _In_ COORD); -BOOL WINAPI SetConsoleTextAttribute(_In_ HANDLE, _In_ WORD); -BOOL WINAPI SetConsoleTitleA(_In_ LPCSTR); -BOOL WINAPI SetConsoleTitleW(_In_ LPCWSTR); +WINBASEAPI +BOOL +WINAPI +SetConsoleActiveScreenBuffer( + _In_ HANDLE hConsoleOutput); +WINBASEAPI +BOOL +WINAPI +SetConsoleCP( + _In_ UINT wCodePageID); + +WINBASEAPI +BOOL +WINAPI +SetConsoleCtrlHandler( + _In_opt_ PHANDLER_ROUTINE HandlerRoutine, + _In_ BOOL Add); + +WINBASEAPI +BOOL +WINAPI +SetConsoleCursorInfo( + _In_ HANDLE hConsoleOutput, + _In_ CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo); + +WINBASEAPI +BOOL +WINAPI +SetConsoleCursorPosition( + _In_ HANDLE hConsoleOutput, + _In_ COORD dwCursorPosition); + +WINBASEAPI +BOOL +WINAPI +SetConsoleMode( + _In_ HANDLE hConsoleHandle, + _In_ DWORD dwMode); + +WINBASEAPI +BOOL +WINAPI +SetConsoleOutputCP( + _In_ UINT wCodePageID); + +WINBASEAPI +BOOL +WINAPI +SetConsoleScreenBufferSize( + _In_ HANDLE hConsoleOutput, + _In_ COORD dwSize); + +WINBASEAPI +BOOL +WINAPI +SetConsoleTextAttribute( + _In_ HANDLE hConsoleOutput, + _In_ WORD wAttributes); + +WINBASEAPI +BOOL +WINAPI +SetConsoleTitleA( + _In_ LPCSTR lpConsoleTitle); + +WINBASEAPI +BOOL +WINAPI +SetConsoleTitleW( + _In_ LPCWSTR lpConsoleTitle); + +WINBASEAPI BOOL WINAPI SetConsoleWindowInfo( - _In_ HANDLE, - _In_ BOOL, - _In_ const SMALL_RECT*); - -/* Undocumented, see http://undoc.airesoft.co.uk/kernel32.dll/ConsoleMenuControl.php */ -HMENU WINAPI ConsoleMenuControl(_In_ HANDLE, _In_ DWORD, _In_ DWORD); -/* Undocumented */ -BOOL WINAPI SetConsoleMenuClose(_In_ BOOL); -/* Undocumented, see http://undoc.airesoft.co.uk/kernel32.dll/SetConsoleCursor.php */ -BOOL WINAPI SetConsoleCursor(_In_ HANDLE, _In_ HCURSOR); -/* Undocumented, see http://undoc.airesoft.co.uk/kernel32.dll/ShowConsoleCursor.php */ -INT WINAPI ShowConsoleCursor(_In_ HANDLE, _In_ BOOL); -/* Undocumented */ -BOOL WINAPI SetConsoleIcon(_In_ HICON); -/* Undocumented, see http://comments.gmane.org/gmane.comp.lang.harbour.devel/27844 */ -BOOL WINAPI SetConsolePalette(_In_ HANDLE, _In_ HPALETTE, _In_ UINT); -/* Undocumented */ -BOOL WINAPI CloseConsoleHandle(_In_ HANDLE); -/* Undocumented */ -HANDLE WINAPI GetConsoleInputWaitHandle(VOID); -/* Undocumented */ -BOOL WINAPI VerifyConsoleIoHandle(_In_ HANDLE); -/* Undocumented */ -BOOL -WINAPI -RegisterConsoleVDM(_In_ DWORD, _In_ HANDLE, _In_ HANDLE, _In_ HANDLE, _In_ DWORD, - _Out_ LPDWORD, _Out_ PVOID*, _In_ PVOID, _In_ DWORD, _In_ COORD, - _Out_ PVOID*); + _In_ HANDLE hConsoleOutput, + _In_ BOOL bAbsolute, + _In_ CONST SMALL_RECT *lpConsoleWindow); +WINBASEAPI BOOL WINAPI WriteConsoleA( @@ -656,6 +894,7 @@ WriteConsoleA( _Out_opt_ LPDWORD lpNumberOfCharsWritten, _Reserved_ LPVOID lpReserved); +WINBASEAPI BOOL WINAPI WriteConsoleW( @@ -665,6 +904,7 @@ WriteConsoleW( _Out_opt_ LPDWORD lpNumberOfCharsWritten, _Reserved_ LPVOID lpReserved); +WINBASEAPI BOOL WINAPI WriteConsoleInputA( @@ -673,6 +913,7 @@ WriteConsoleInputA( _In_ DWORD nLength, _Out_ LPDWORD lpNumberOfEventsWritten); +WINBASEAPI BOOL WINAPI WriteConsoleInputW( @@ -681,22 +922,7 @@ WriteConsoleInputW( _In_ DWORD nLength, _Out_ LPDWORD lpNumberOfEventsWritten); -BOOL -WINAPI -WriteConsoleInputVDMA( - _In_ HANDLE hConsoleInput, - _In_reads_(nLength) CONST INPUT_RECORD *lpBuffer, - _In_ DWORD nLength, - _Out_ LPDWORD lpNumberOfEventsWritten); - -BOOL -WINAPI -WriteConsoleInputVDMW( - _In_ HANDLE hConsoleInput, - _In_reads_(nLength) CONST INPUT_RECORD *lpBuffer, - _In_ DWORD nLength, - _Out_ LPDWORD lpNumberOfEventsWritten); - +WINBASEAPI BOOL WINAPI WriteConsoleOutputA( @@ -706,6 +932,7 @@ WriteConsoleOutputA( _In_ COORD dwBufferCoord, _Inout_ PSMALL_RECT lpWriteRegion); +WINBASEAPI BOOL WINAPI WriteConsoleOutputW( @@ -715,6 +942,7 @@ WriteConsoleOutputW( _In_ COORD dwBufferCoord, _Inout_ PSMALL_RECT lpWriteRegion); +WINBASEAPI BOOL WINAPI WriteConsoleOutputAttribute( @@ -724,6 +952,7 @@ WriteConsoleOutputAttribute( _In_ COORD dwWriteCoord, _Out_ LPDWORD lpNumberOfAttrsWritten); +WINBASEAPI BOOL WINAPI WriteConsoleOutputCharacterA( @@ -733,6 +962,7 @@ WriteConsoleOutputCharacterA( _In_ COORD dwWriteCoord, _Out_ LPDWORD lpNumberOfCharsWritten); +WINBASEAPI BOOL WINAPI WriteConsoleOutputCharacterW( @@ -743,6 +973,22 @@ WriteConsoleOutputCharacterW( _Out_ LPDWORD lpNumberOfCharsWritten); +#if (NTDDI_VERSION >= NTDDI_WIN10_RS5) +// typedef VOID *HPCON; +// CreatePseudoConsole() +// ResizePseudoConsole() +// ClosePseudoConsole() +#endif // (NTDDI_VERSION >= NTDDI_WIN10_RS5) + +#if (NTDDI_VERSION >= NTDDI_WIN11_GE) +/* See https://github.com/microsoft/terminal/blob/main/doc/specs/%237335%20-%20Console%20Allocation%20Policy.md + * and https://github.com/MicrosoftDocs/Console-Docs/pull/323 */ +// ALLOC_CONSOLE_MODE, ALLOC_CONSOLE_OPTIONS, ALLOC_CONSOLE_RESULT +// AllocConsoleWithOptions() +// ReleasePseudoConsole() +#endif // (NTDDI_VERSION >= NTDDI_WIN11_GE) + + #ifdef UNICODE #define AddConsoleAlias AddConsoleAliasW #define GetConsoleAlias GetConsoleAliasW @@ -751,17 +997,16 @@ WriteConsoleOutputCharacterW( #define GetConsoleAliasExes GetConsoleAliasExesW #define GetConsoleAliasExesLength GetConsoleAliasExesLengthW #define GetConsoleTitle GetConsoleTitleW +#define GetConsoleOriginalTitle GetConsoleOriginalTitleW #define PeekConsoleInput PeekConsoleInputW #define ReadConsole ReadConsoleW #define ReadConsoleInput ReadConsoleInputW -#define ReadConsoleInputEx ReadConsoleInputExW #define ReadConsoleOutput ReadConsoleOutputW #define ReadConsoleOutputCharacter ReadConsoleOutputCharacterW #define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferW #define SetConsoleTitle SetConsoleTitleW #define WriteConsole WriteConsoleW #define WriteConsoleInput WriteConsoleInputW -#define WriteConsoleInputVDM WriteConsoleInputVDMW #define WriteConsoleOutput WriteConsoleOutputW #define FillConsoleOutputCharacter FillConsoleOutputCharacterW #define WriteConsoleOutputCharacter WriteConsoleOutputCharacterW @@ -773,17 +1018,16 @@ WriteConsoleOutputCharacterW( #define GetConsoleAliasExes GetConsoleAliasExesA #define GetConsoleAliasExesLength GetConsoleAliasExesLengthA #define GetConsoleTitle GetConsoleTitleA +#define GetConsoleOriginalTitle GetConsoleOriginalTitleA #define PeekConsoleInput PeekConsoleInputA #define ReadConsole ReadConsoleA #define ReadConsoleInput ReadConsoleInputA -#define ReadConsoleInputEx ReadConsoleInputExA #define ReadConsoleOutput ReadConsoleOutputA #define ReadConsoleOutputCharacter ReadConsoleOutputCharacterA #define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferA #define SetConsoleTitle SetConsoleTitleA #define WriteConsole WriteConsoleA #define WriteConsoleInput WriteConsoleInputA -#define WriteConsoleInputVDM WriteConsoleInputVDMA #define WriteConsoleOutput WriteConsoleOutputA #define FillConsoleOutputCharacter FillConsoleOutputCharacterA #define WriteConsoleOutputCharacter WriteConsoleOutputCharacterA @@ -797,4 +1041,4 @@ WriteConsoleOutputCharacterW( } #endif -#endif /* _WINCON_H */ +#endif /* _WINCON_ */ diff --git a/sdk/include/reactos/wincon_undoc.h b/sdk/include/reactos/wincon_undoc.h new file mode 100644 index 00000000000..4b9068de88e --- /dev/null +++ b/sdk/include/reactos/wincon_undoc.h @@ -0,0 +1,623 @@ +/* + * PROJECT: ReactOS SDK + * LICENSE: Dual-licensed: + * LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Undocumented Console API definitions, absent from wincon.h + * COPYRIGHT: Copyright 2013-2025 Hermès Bélusca-Maïto + * + * REMARK: This header is based on the following resources: + * - https://undoc.airesoft.co.uk/kernel32.dll/ + * - https://github.com/microsoft/terminal/blob/main/dep/Console/ntcon.h + * - https://github.com/microsoft/terminal/blob/main/dep/Console/winconp.h + * (commit f08321a0b2) + */ + +#ifndef _WINCON_UNDOC_H +#define _WINCON_UNDOC_H + +#ifndef _WINCONP_ // As seen in dep/Console/winconp.h +#define _WINCONP_ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) && !defined(NOGDI) +#include "wingdi.h" +#endif + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4820) +#endif + +/* + * Console display modes + */ +// These flags are returned by GetConsoleDisplayMode +#define CONSOLE_WINDOWED 0 /* Windowed console */ + +#if 0 // Defined in wincon.h; kept here for reference. +#define CONSOLE_FULLSCREEN 1 /* Fullscreen console */ +#define CONSOLE_FULLSCREEN_HARDWARE 2 /* Console owns the hardware */ + +// These flags are given to SetConsoleDisplayMode +#define CONSOLE_FULLSCREEN_MODE 1 +#define CONSOLE_WINDOWED_MODE 2 +#endif + +/* + * Color attributes for text and screen background + */ +// #define COMMON_LVB_GRID_RVERTICAL 0x1000 +// NOTE: 0x2000 is unused +// #define COMMON_LVB_REVERSE_VIDEO 0x4000 +#ifndef COMMON_LVB_SBCSDBCS +#define COMMON_LVB_SBCSDBCS \ + (COMMON_LVB_LEADING_BYTE | COMMON_LVB_TRAILING_BYTE) /* == 0x0300 */ +#endif + +/* + * Screen buffer types for CreateConsoleScreenBuffer(). + * See https://blog.airesoft.co.uk/2012/10/things-ms-can-do-that-they-dont-tell-you-about-console-graphics/ + */ +// #define CONSOLE_TEXTMODE_BUFFER 1 +#define CONSOLE_GRAPHICS_BUFFER 2 + +/* + * Undocumented Control handler codes, + * additional to CTRL_C_EVENT, CTRL_BREAK_EVENT, CTRL_CLOSE_EVENT, + * CTRL_LOGOFF_EVENT, CTRL_SHUTDOWN_EVENT. + */ +#define CTRL_LAST_CLOSE_EVENT 3 // SYSTEM_ROOT_CONSOLE_EVENT +// 4 is reserved! // SYSTEM_CLOSE_EVENT + +/* + * Input mode flags, available since NT 3.51 + * but documented only in Vista+ PSDK. + */ +#ifndef ENABLE_INSERT_MODE +#define ENABLE_INSERT_MODE 0x0020 +#define ENABLE_QUICK_EDIT_MODE 0x0040 +#define ENABLE_EXTENDED_FLAGS 0x0080 +#endif + +/* + * Console selection flags + */ +#define CONSOLE_SELECTION_INVERTED 0x0010 /* Selection is inverted (turned off) */ +#define CONSOLE_SELECTION_VALID (CONSOLE_SELECTION_IN_PROGRESS | \ + CONSOLE_SELECTION_NOT_EMPTY | \ + CONSOLE_MOUSE_SELECTION | \ + CONSOLE_MOUSE_DOWN) + +/* + * History information and mode flags + */ +#ifndef HISTORY_NO_DUP_FLAG // (_WIN32_WINNT >= _WIN32_WINNT_VISTA) +// For Get/SetConsoleHistoryInfo +#define HISTORY_NO_DUP_FLAG 0x0001 +#endif +#ifndef CONSOLE_OVERSTRIKE // (_WIN32_WINNT >= _WIN32_WINNT_VISTA) +// For SetConsoleCommandHistoryMode +#define CONSOLE_OVERSTRIKE 0x0001 +#endif + +/* Always existed, but was added in official PSDK in Windows Vista/7. + * Kept here for reference. */ +#if 0 +typedef struct _CONSOLE_READCONSOLE_CONTROL { + ULONG nLength; + ULONG nInitialChars; + ULONG dwCtrlWakeupMask; + ULONG dwControlKeyState; +} CONSOLE_READCONSOLE_CONTROL, *PCONSOLE_READCONSOLE_CONTROL; +#endif + +/* + * This is the graphics counterpart to text-mode CONSOLE_SCREEN_BUFFER_INFO. + * See https://blog.airesoft.co.uk/2012/10/things-ms-can-do-that-they-dont-tell-you-about-console-graphics/ + */ +#if defined(_WINGDI_) && !defined(NOGDI) +typedef struct _CONSOLE_GRAPHICS_BUFFER_INFO { + DWORD dwBitMapInfoLength; + LPBITMAPINFO lpBitMapInfo; + DWORD dwUsage; // DIB_PAL_COLORS or DIB_RGB_COLORS + HANDLE hMutex; + PVOID lpBitMap; +} CONSOLE_GRAPHICS_BUFFER_INFO, *PCONSOLE_GRAPHICS_BUFFER_INFO; +#endif + +// typedef struct _KEY_EVENT_RECORD { ... } KEY_EVENT_RECORD, *PKEY_EVENT_RECORD; +C_ASSERT(FIELD_OFFSET(KEY_EVENT_RECORD, uChar) == 0xA); + + +#define EXENAME_LENGTH (255 + 1) + +WINBASEAPI +DWORD +WINAPI +GetConsoleInputExeNameA( + _In_ DWORD nBufferLength, + _Out_writes_(nBufferLength) LPSTR lpExeName); + +WINBASEAPI +DWORD +WINAPI +GetConsoleInputExeNameW( + _In_ DWORD nBufferLength, + _Out_writes_(nBufferLength) LPWSTR lpExeName); + +WINBASEAPI +BOOL +WINAPI +SetConsoleInputExeNameA( + _In_ LPCSTR lpExeName); + +WINBASEAPI +BOOL +WINAPI +SetConsoleInputExeNameW( + _In_ LPCWSTR lpExeName); + +WINBASEAPI +VOID +WINAPI +ExpungeConsoleCommandHistoryA( + _In_ LPCSTR lpExeName); + +WINBASEAPI +VOID +WINAPI +ExpungeConsoleCommandHistoryW( + _In_ LPCWSTR lpExeName); + +WINBASEAPI +DWORD +WINAPI +GetConsoleCommandHistoryA( + _Out_writes_bytes_(cbHistory) LPSTR lpHistory, + _In_ DWORD cbHistory, + _In_ LPCSTR lpExeName); + +WINBASEAPI +DWORD +WINAPI +GetConsoleCommandHistoryW( + _Out_writes_bytes_(cbHistory) LPWSTR lpHistory, + _In_ DWORD cbHistory, + _In_ LPCWSTR lpExeName); + +WINBASEAPI +DWORD +WINAPI +GetConsoleCommandHistoryLengthA( + _In_ LPCSTR lpExeName); + +WINBASEAPI +DWORD +WINAPI +GetConsoleCommandHistoryLengthW( + _In_ LPCWSTR lpExeName); + +WINBASEAPI +BOOL +WINAPI +SetConsoleNumberOfCommandsA( + _In_ DWORD dwNumCommands, + _In_ LPCSTR lpExeName); + +WINBASEAPI +BOOL +WINAPI +SetConsoleNumberOfCommandsW( + _In_ DWORD dwNumCommands, + _In_ LPCWSTR lpExeName); + +/* + * See https://undoc.airesoft.co.uk/kernel32.dll/InvalidateConsoleDIBits.php + * and https://blog.airesoft.co.uk/2012/10/things-ms-can-do-that-they-dont-tell-you-about-console-graphics/ + */ +WINBASEAPI +BOOL +WINAPI +InvalidateConsoleDIBits( + _In_ HANDLE hConsoleOutput, + _In_ PSMALL_RECT lpRect); + +WINBASEAPI +BOOL +WINAPI +GetConsoleHardwareState( + _In_ HANDLE hConsoleOutput, + _Out_ PDWORD Flags, + _Out_ PDWORD State); +#if 0 // FIXME: How https://github.com/microsoft/terminal/blob/main/dep/Console/winconp.h sees it: +WINBASEAPI +BOOL +WINAPI +GetConsoleHardwareState( + _In_ HANDLE hConsoleOutput, + _Out_ PCOORD lpResolution, + _Out_ PCOORD lpFontSize); +#endif + +WINBASEAPI +BOOL +WINAPI +SetConsoleHardwareState( + _In_ HANDLE hConsoleOutput, + _In_ DWORD Flags, + _In_ DWORD State); +#if 0 // FIXME: How https://github.com/microsoft/terminal/blob/main/dep/Console/winconp.h sees it: +WINBASEAPI +BOOL +WINAPI +SetConsoleHardwareState( + _In_ HANDLE hConsoleOutput, + _In_ COORD dwResolution, + _In_ COORD dwFontSize); +#endif + + +#define CONSOLE_NOSHORTCUTKEY 0x00000000 /* No shortcut key */ +#define CONSOLE_ALTTAB 0x00000001 /* Alt + Tab */ +#define CONSOLE_ALTESC 0x00000002 /* Alt + Escape */ +#define CONSOLE_ALTSPACE 0x00000004 /* Alt + Space */ +#define CONSOLE_ALTENTER 0x00000008 /* Alt + Enter */ +#define CONSOLE_ALTPRTSC 0x00000010 /* Alt Print screen */ +#define CONSOLE_PRTSC 0x00000020 /* Print screen */ +#define CONSOLE_CTRLESC 0x00000040 /* Ctrl + Escape */ + +typedef struct _APPKEY { + WORD Modifier; + WORD ScanCode; +} APPKEY, *LPAPPKEY; + +#define CONSOLE_MODIFIER_SHIFT 0x0003 // Left shift key +#define CONSOLE_MODIFIER_CONTROL 0x0004 // Either Control shift key +#define CONSOLE_MODIFIER_ALT 0x0008 // Either Alt shift key + +WINBASEAPI +BOOL +WINAPI +SetConsoleKeyShortcuts( + _In_ BOOL bSet, + _In_ BYTE bReserveKeys, + _In_reads_(dwNumAppKeys) LPAPPKEY lpAppKeys, + _In_ DWORD dwNumAppKeys); + + +#ifndef KL_NAMELENGTH // Defined in winuser.h +#define KL_NAMELENGTH 9 +#endif + +WINBASEAPI +BOOL +WINAPI +GetConsoleKeyboardLayoutNameA( + _Out_writes_(KL_NAMELENGTH) LPSTR pszLayout); + +WINBASEAPI +BOOL +WINAPI +GetConsoleKeyboardLayoutNameW( + _Out_writes_(KL_NAMELENGTH) LPWSTR pszLayout); + + +WINBASEAPI +DWORD +WINAPI +SetLastConsoleEventActive(VOID); + +/* + * ReadConsoleInputExA/W, now documented at: + * https://learn.microsoft.com/en-us/windows/console/readconsoleinputex + */ + +/* + * Read input flags for ReadConsoleInputExA/W + */ +#define CONSOLE_READ_NOREMOVE 0x0001 +#define CONSOLE_READ_NOWAIT 0x0002 +#define CONSOLE_READ_VALID (CONSOLE_READ_NOREMOVE | CONSOLE_READ_NOWAIT) + +WINBASEAPI +_Success_(return != FALSE) +BOOL +WINAPI +ReadConsoleInputExA( + _In_ HANDLE hConsoleInput, + _Out_writes_to_(nLength, *lpNumberOfEventsRead) PINPUT_RECORD lpBuffer, + _In_ DWORD nLength, + _Out_ _Deref_out_range_(<=, nLength) LPDWORD lpNumberOfEventsRead, + _In_ WORD wFlags); + +WINBASEAPI +_Success_(return != FALSE) +BOOL +WINAPI +ReadConsoleInputExW( + _In_ HANDLE hConsoleInput, + _Out_writes_to_(nLength, *lpNumberOfEventsRead) PINPUT_RECORD lpBuffer, + _In_ DWORD nLength, + _Out_ _Deref_out_range_(<=, nLength) LPDWORD lpNumberOfEventsRead, + _In_ WORD wFlags); + +/* See https://undoc.airesoft.co.uk/kernel32.dll/ConsoleMenuControl.php */ +WINBASEAPI +HMENU +WINAPI +ConsoleMenuControl( + _In_ HANDLE hConsoleOutput, + _In_ DWORD dwCmdIdLow, + _In_ DWORD dwCmdIdHigh); + +WINBASEAPI +BOOL +WINAPI +SetConsoleMenuClose( + _In_ BOOL bEnable); + +/* See https://undoc.airesoft.co.uk/kernel32.dll/SetConsoleCursor.php */ +WINBASEAPI +BOOL +WINAPI +SetConsoleCursor( + _In_ HANDLE hConsoleOutput, + _In_ HCURSOR hCursor); + +/* See https://undoc.airesoft.co.uk/kernel32.dll/ShowConsoleCursor.php */ +WINBASEAPI +INT +WINAPI +ShowConsoleCursor( + _In_ HANDLE hConsoleOutput, + _In_ BOOL bShow); + +WINBASEAPI +BOOL +WINAPI +SetConsoleFont( + _In_ HANDLE hConsoleOutput, + _In_ DWORD nFont); + +WINBASEAPI +DWORD +WINAPI +GetConsoleFontInfo( + _In_ HANDLE hConsoleOutput, + _In_ BOOL bMaximumWindow, + _In_ DWORD nFontCount, + _Out_ PCONSOLE_FONT_INFO lpConsoleFontInfo); + +WINBASEAPI +DWORD +WINAPI +GetNumberOfConsoleFonts(VOID); + +WINBASEAPI +BOOL +WINAPI +SetConsoleIcon( + _In_ HICON hIcon); + +/* See http://comments.gmane.org/gmane.comp.lang.harbour.devel/27844 */ +WINBASEAPI +BOOL +WINAPI +SetConsolePalette( + _In_ HANDLE hConsoleOutput, + _In_ HPALETTE hPalette, + _In_ UINT dwUsage); + +WINBASEAPI +HANDLE +WINAPI +OpenConsoleW( + _In_ LPCWSTR wsName, + _In_ DWORD dwDesiredAccess, + _In_ BOOL bInheritHandle, + _In_ DWORD dwShareMode); + +WINBASEAPI +BOOL +WINAPI +CloseConsoleHandle( + _In_ HANDLE hHandle); + +WINBASEAPI +HANDLE +WINAPI +DuplicateConsoleHandle( + _In_ HANDLE hSourceHandle, + _In_ DWORD dwDesiredAccess, + _In_ BOOL bInheritHandle, + _In_ DWORD dwOptions); + +WINBASEAPI +HANDLE +WINAPI +GetConsoleInputWaitHandle(VOID); + +WINBASEAPI +BOOL +WINAPI +VerifyConsoleIoHandle( + _In_ HANDLE hIoHandle); + + +/* + * dwRegisterFlags for RegisterConsoleVDM + */ +#define CONSOLE_UNREGISTER_VDM 0 +#define CONSOLE_REGISTER_VDM 1 +#define CONSOLE_REGISTER_WOW 2 + +WINBASEAPI +BOOL +WINAPI +RegisterConsoleVDM( + _In_ DWORD dwRegisterFlags, + _In_ HANDLE hStartHardwareEvent, + _In_ HANDLE hEndHardwareEvent, + _In_ HANDLE hErrorHardwareEvent, + _Reserved_ DWORD Reserved, + _Out_ LPDWORD lpVideoStateLength, + _Outptr_ PVOID* lpVideoState, // PVIDEO_HARDWARE_STATE_HEADER* + _In_ PVOID lpUnusedBuffer, + _In_ DWORD dwUnusedBufferLength, + _In_ COORD dwVDMBufferSize, + _Outptr_ PVOID* lpVDMBuffer); + +/* + * iFunction for VDMConsoleOperation + */ +#define VDM_HIDE_WINDOW 1 +#define VDM_IS_ICONIC 2 +#define VDM_CLIENT_RECT 3 +#define VDM_CLIENT_TO_SCREEN 4 +#define VDM_SCREEN_TO_CLIENT 5 +#define VDM_IS_HIDDEN 6 +#define VDM_FULLSCREEN_NOPAINT 7 +#define VDM_SET_VIDEO_MODE 8 + +WINBASEAPI +BOOL +WINAPI +VDMConsoleOperation( + _In_ DWORD iFunction, + _Inout_opt_ LPVOID lpData); + +WINBASEAPI +BOOL +WINAPI +WriteConsoleInputVDMA( + _In_ HANDLE hConsoleInput, + _In_reads_(nLength) CONST INPUT_RECORD *lpBuffer, + _In_ DWORD nLength, + _Out_ LPDWORD lpNumberOfEventsWritten); + +WINBASEAPI +BOOL +WINAPI +WriteConsoleInputVDMW( + _In_ HANDLE hConsoleInput, + _In_reads_(nLength) CONST INPUT_RECORD *lpBuffer, + _In_ DWORD nLength, + _Out_ LPDWORD lpNumberOfEventsWritten); + + +WINBASEAPI +BOOL +WINAPI +GetConsoleNlsMode( + _In_ HANDLE hConsole, + _Out_ PDWORD lpdwNlsMode); + +WINBASEAPI +BOOL +WINAPI +SetConsoleNlsMode( + _In_ HANDLE hConsole, + _In_ DWORD fdwNlsMode); + +WINBASEAPI +BOOL +WINAPI +GetConsoleCharType( + _In_ HANDLE hConsole, + _In_ COORD coordCheck, + _Out_ PDWORD pdwType); + +/* Character type returned by GetConsoleCharType */ +#define CHAR_TYPE_SBCS 0 // Displayed SBCS character +#define CHAR_TYPE_LEADING 2 // Displayed leading byte of DBCS +#define CHAR_TYPE_TRAILING 3 // Displayed trailing byte of DBCS + +WINBASEAPI +BOOL +WINAPI +SetConsoleLocalEUDC( + _In_ HANDLE hConsoleHandle, + _In_ WORD wCodePoint, + _In_ COORD cFontSize, + _In_ PCHAR lpSB); + +WINBASEAPI +BOOL +WINAPI +SetConsoleCursorMode( + _In_ HANDLE hConsoleHandle, + _In_ BOOL Blink, + _In_ BOOL DBEnable); + +WINBASEAPI +BOOL +WINAPI +GetConsoleCursorMode( + _In_ HANDLE hConsoleHandle, + _Out_ PBOOL pbBlink, + _Out_ PBOOL pbDBEnable); + +WINBASEAPI +BOOL +WINAPI +RegisterConsoleOS2( + _In_ BOOL fOs2Register); + +WINBASEAPI +BOOL +WINAPI +SetConsoleOS2OemFormat( + _In_ BOOL fOs2OemFormat); + +#if defined(FE_IME) || defined(__REACTOS__) +WINBASEAPI +BOOL +WINAPI +RegisterConsoleIME( + _In_ HWND hWndConsoleIME, + _Out_opt_ DWORD *lpdwConsoleThreadId); + +WINBASEAPI +BOOL +WINAPI +UnregisterConsoleIME(VOID); +#endif // FE_IME + +#ifdef UNICODE +#define GetConsoleInputExeName GetConsoleInputExeNameW +#define SetConsoleInputExeName SetConsoleInputExeNameW +#define ExpungeConsoleCommandHistory ExpungeConsoleCommandHistoryW +#define GetConsoleCommandHistory GetConsoleCommandHistoryW +#define GetConsoleCommandHistoryLength GetConsoleCommandHistoryLengthW +#define SetConsoleNumberOfCommands SetConsoleNumberOfCommandsW +#define GetConsoleKeyboardLayoutName GetConsoleKeyboardLayoutNameW +#define ReadConsoleInputEx ReadConsoleInputExW +#define WriteConsoleInputVDM WriteConsoleInputVDMW +#else +#define GetConsoleInputExeName GetConsoleInputExeNameA +#define SetConsoleInputExeName SetConsoleInputExeNameA +#define ExpungeConsoleCommandHistory ExpungeConsoleCommandHistoryA +#define GetConsoleCommandHistory GetConsoleCommandHistoryA +#define GetConsoleCommandHistoryLength GetConsoleCommandHistoryLengthA +#define SetConsoleNumberOfCommands SetConsoleNumberOfCommandsA +#define GetConsoleKeyboardLayoutName GetConsoleKeyboardLayoutNameA +#define ReadConsoleInputEx ReadConsoleInputExA +#define WriteConsoleInputVDM WriteConsoleInputVDMA +#endif + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _WINCONP_ */ +#endif /* _WINCON_UNDOC_H */