4e2933c620 2015-04-21 kinaba: /***********************************************************************\ 4e2933c620 2015-04-21 kinaba: * wincon.d * 4e2933c620 2015-04-21 kinaba: * * 4e2933c620 2015-04-21 kinaba: * Windows API header module * 4e2933c620 2015-04-21 kinaba: * * 4e2933c620 2015-04-21 kinaba: * Translated from MinGW Windows headers * 4e2933c620 2015-04-21 kinaba: * * 4e2933c620 2015-04-21 kinaba: * Placed into public domain * 4e2933c620 2015-04-21 kinaba: \***********************************************************************/ c2b7a98c21 2011-02-23 kinaba: module win32.wincon; 4e2933c620 2015-04-21 kinaba: pragma(lib, "kernel32.lib"); 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: private import win32.w32api, win32.windef; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: // FIXME: clean up Windows version support 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: FOREGROUND_BLUE = 1, 4e2933c620 2015-04-21 kinaba: FOREGROUND_GREEN = 2, 4e2933c620 2015-04-21 kinaba: FOREGROUND_RED = 4, 4e2933c620 2015-04-21 kinaba: FOREGROUND_INTENSITY = 8, 4e2933c620 2015-04-21 kinaba: BACKGROUND_BLUE = 16, 4e2933c620 2015-04-21 kinaba: BACKGROUND_GREEN = 32, 4e2933c620 2015-04-21 kinaba: BACKGROUND_RED = 64, 4e2933c620 2015-04-21 kinaba: BACKGROUND_INTENSITY = 128 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: static if (_WIN32_WINNT >= 0x0501) { 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: CONSOLE_FULLSCREEN_MODE = 1, 4e2933c620 2015-04-21 kinaba: CONSOLE_WINDOWED_MODE = 0 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: CTRL_C_EVENT = 0, 4e2933c620 2015-04-21 kinaba: CTRL_BREAK_EVENT = 1, 4e2933c620 2015-04-21 kinaba: CTRL_CLOSE_EVENT = 2, 4e2933c620 2015-04-21 kinaba: CTRL_LOGOFF_EVENT = 5, 4e2933c620 2015-04-21 kinaba: CTRL_SHUTDOWN_EVENT = 6 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: ENABLE_PROCESSED_INPUT = 1, 4e2933c620 2015-04-21 kinaba: ENABLE_LINE_INPUT = 2, 4e2933c620 2015-04-21 kinaba: ENABLE_ECHO_INPUT = 4, 4e2933c620 2015-04-21 kinaba: ENABLE_WINDOW_INPUT = 8, 4e2933c620 2015-04-21 kinaba: ENABLE_MOUSE_INPUT = 16 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: ENABLE_PROCESSED_OUTPUT = 1, 4e2933c620 2015-04-21 kinaba: ENABLE_WRAP_AT_EOL_OUTPUT = 2 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: KEY_EVENT = 1, 4e2933c620 2015-04-21 kinaba: MOUSE_EVENT = 2, 4e2933c620 2015-04-21 kinaba: WINDOW_BUFFER_SIZE_EVENT = 4, 4e2933c620 2015-04-21 kinaba: MENU_EVENT = 8, 4e2933c620 2015-04-21 kinaba: FOCUS_EVENT = 16 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: RIGHT_ALT_PRESSED = 1, 4e2933c620 2015-04-21 kinaba: LEFT_ALT_PRESSED = 2, 4e2933c620 2015-04-21 kinaba: RIGHT_CTRL_PRESSED = 4, 4e2933c620 2015-04-21 kinaba: LEFT_CTRL_PRESSED = 8, 4e2933c620 2015-04-21 kinaba: SHIFT_PRESSED = 16, 4e2933c620 2015-04-21 kinaba: NUMLOCK_ON = 32, 4e2933c620 2015-04-21 kinaba: SCROLLLOCK_ON = 64, 4e2933c620 2015-04-21 kinaba: CAPSLOCK_ON = 128, 4e2933c620 2015-04-21 kinaba: ENHANCED_KEY = 256 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: FROM_LEFT_1ST_BUTTON_PRESSED = 1, 4e2933c620 2015-04-21 kinaba: RIGHTMOST_BUTTON_PRESSED = 2, 4e2933c620 2015-04-21 kinaba: FROM_LEFT_2ND_BUTTON_PRESSED = 4, 4e2933c620 2015-04-21 kinaba: FROM_LEFT_3RD_BUTTON_PRESSED = 8, 4e2933c620 2015-04-21 kinaba: FROM_LEFT_4TH_BUTTON_PRESSED = 16 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: enum { 4e2933c620 2015-04-21 kinaba: MOUSE_MOVED = 1, 4e2933c620 2015-04-21 kinaba: DOUBLE_CLICK = 2, 4e2933c620 2015-04-21 kinaba: MOUSE_WHEELED = 4 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct CHAR_INFO { 4e2933c620 2015-04-21 kinaba: union _Char { 4e2933c620 2015-04-21 kinaba: WCHAR UnicodeChar; 4e2933c620 2015-04-21 kinaba: CHAR AsciiChar; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: _Char Char; 4e2933c620 2015-04-21 kinaba: WORD Attributes; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: alias CHAR_INFO* PCHAR_INFO; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct SMALL_RECT { 4e2933c620 2015-04-21 kinaba: SHORT Left; 4e2933c620 2015-04-21 kinaba: SHORT Top; 4e2933c620 2015-04-21 kinaba: SHORT Right; 4e2933c620 2015-04-21 kinaba: SHORT Bottom; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: alias SMALL_RECT* PSMALL_RECT; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct CONSOLE_CURSOR_INFO { 4e2933c620 2015-04-21 kinaba: DWORD dwSize; 4e2933c620 2015-04-21 kinaba: BOOL bVisible; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: alias CONSOLE_CURSOR_INFO* PCONSOLE_CURSOR_INFO; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct COORD { 4e2933c620 2015-04-21 kinaba: SHORT X; 4e2933c620 2015-04-21 kinaba: SHORT Y; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: alias COORD* PCOORD; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct CONSOLE_FONT_INFO { 4e2933c620 2015-04-21 kinaba: DWORD nFont; 4e2933c620 2015-04-21 kinaba: COORD dwFontSize; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: alias CONSOLE_FONT_INFO* PCONSOLE_FONT_INFO; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct CONSOLE_SCREEN_BUFFER_INFO { 4e2933c620 2015-04-21 kinaba: COORD dwSize; 4e2933c620 2015-04-21 kinaba: COORD dwCursorPosition; 4e2933c620 2015-04-21 kinaba: WORD wAttributes; 4e2933c620 2015-04-21 kinaba: SMALL_RECT srWindow; 4e2933c620 2015-04-21 kinaba: COORD dwMaximumWindowSize; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: alias CONSOLE_SCREEN_BUFFER_INFO* PCONSOLE_SCREEN_BUFFER_INFO; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: alias BOOL function(DWORD) PHANDLER_ROUTINE; 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct KEY_EVENT_RECORD { 4e2933c620 2015-04-21 kinaba: BOOL bKeyDown; 4e2933c620 2015-04-21 kinaba: WORD wRepeatCount; 4e2933c620 2015-04-21 kinaba: WORD wVirtualKeyCode; 4e2933c620 2015-04-21 kinaba: WORD wVirtualScanCode; 4e2933c620 2015-04-21 kinaba: union _uChar { 4e2933c620 2015-04-21 kinaba: WCHAR UnicodeChar; 4e2933c620 2015-04-21 kinaba: CHAR AsciiChar; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: _uChar uChar; 4e2933c620 2015-04-21 kinaba: DWORD dwControlKeyState; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: 4e2933c620 2015-04-21 kinaba: struct MOUSE_EVENT_RECORD { 4e2933c620 2015-04-21 kinaba: COORD dwMousePosition; 4e2933c620 2015-04-21 kinaba: DWORD dwButtonState; 4e2933c620 2015-04-21 kinaba: DWORD dwControlKeyState; 4e2933c620 2015-04-21 kinaba: DWORD dwEventFlags; 4e2933c620 2015-04-21 kinaba: } c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: struct WINDOW_BUFFER_SIZE_RECORD { 4e2933c620 2015-04-21 kinaba: COORD dwSize; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: struct MENU_EVENT_RECORD { 4e2933c620 2015-04-21 kinaba: UINT dwCommandId; c2b7a98c21 2011-02-23 kinaba: } 4e2933c620 2015-04-21 kinaba: alias MENU_EVENT_RECORD* PMENU_EVENT_RECORD; c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: struct FOCUS_EVENT_RECORD { 4e2933c620 2015-04-21 kinaba: BOOL bSetFocus; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: struct INPUT_RECORD { 4e2933c620 2015-04-21 kinaba: WORD EventType; 4e2933c620 2015-04-21 kinaba: union _Event { 4e2933c620 2015-04-21 kinaba: KEY_EVENT_RECORD KeyEvent; 4e2933c620 2015-04-21 kinaba: MOUSE_EVENT_RECORD MouseEvent; 4e2933c620 2015-04-21 kinaba: WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent; 4e2933c620 2015-04-21 kinaba: MENU_EVENT_RECORD MenuEvent; 4e2933c620 2015-04-21 kinaba: FOCUS_EVENT_RECORD FocusEvent; 4e2933c620 2015-04-21 kinaba: } 4e2933c620 2015-04-21 kinaba: _Event Event; c2b7a98c21 2011-02-23 kinaba: } 4e2933c620 2015-04-21 kinaba: alias INPUT_RECORD* PINPUT_RECORD; c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: extern (Windows): c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: BOOL AllocConsole(); 4e2933c620 2015-04-21 kinaba: HANDLE CreateConsoleScreenBuffer(DWORD, DWORD, SECURITY_ATTRIBUTES*, DWORD, LPVOID); 4e2933c620 2015-04-21 kinaba: BOOL FillConsoleOutputAttribute(HANDLE, WORD, DWORD, COORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL FillConsoleOutputCharacterA(HANDLE, CHAR, DWORD, COORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL FillConsoleOutputCharacterW(HANDLE, WCHAR, DWORD, COORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL FlushConsoleInputBuffer(HANDLE); 4e2933c620 2015-04-21 kinaba: BOOL FreeConsole(); 4e2933c620 2015-04-21 kinaba: BOOL GenerateConsoleCtrlEvent(DWORD, DWORD); 4e2933c620 2015-04-21 kinaba: UINT GetConsoleCP(); 4e2933c620 2015-04-21 kinaba: BOOL GetConsoleCursorInfo(HANDLE, PCONSOLE_CURSOR_INFO); 4e2933c620 2015-04-21 kinaba: BOOL GetConsoleMode(HANDLE,PDWORD); 4e2933c620 2015-04-21 kinaba: UINT GetConsoleOutputCP(); 4e2933c620 2015-04-21 kinaba: BOOL GetConsoleScreenBufferInfo(HANDLE, PCONSOLE_SCREEN_BUFFER_INFO); 4e2933c620 2015-04-21 kinaba: DWORD GetConsoleTitleA(LPSTR, DWORD); 4e2933c620 2015-04-21 kinaba: DWORD GetConsoleTitleW(LPWSTR, DWORD); 4e2933c620 2015-04-21 kinaba: COORD GetLargestConsoleWindowSize(HANDLE); 4e2933c620 2015-04-21 kinaba: BOOL GetNumberOfConsoleInputEvents(HANDLE, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL GetNumberOfConsoleMouseButtons(PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL PeekConsoleInputA(HANDLE, PINPUT_RECORD, DWORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL PeekConsoleInputW(HANDLE, PINPUT_RECORD, DWORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL ReadConsoleA(HANDLE, PVOID, DWORD, PDWORD, PVOID); 4e2933c620 2015-04-21 kinaba: BOOL ReadConsoleW(HANDLE, PVOID, DWORD, PDWORD, PVOID); 4e2933c620 2015-04-21 kinaba: BOOL ReadConsoleInputA(HANDLE, PINPUT_RECORD, DWORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL ReadConsoleInputW(HANDLE, PINPUT_RECORD, DWORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL ReadConsoleOutputAttribute(HANDLE, LPWORD, DWORD, COORD, LPDWORD); 4e2933c620 2015-04-21 kinaba: BOOL ReadConsoleOutputCharacterA(HANDLE, LPSTR, DWORD, COORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL ReadConsoleOutputCharacterW(HANDLE, LPWSTR, DWORD, COORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL ReadConsoleOutputA(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT); 4e2933c620 2015-04-21 kinaba: BOOL ReadConsoleOutputW(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT); 4e2933c620 2015-04-21 kinaba: BOOL ScrollConsoleScreenBufferA(HANDLE, CPtr!(SMALL_RECT), CPtr!(SMALL_RECT), COORD, CPtr!(CHAR_INFO)); 4e2933c620 2015-04-21 kinaba: BOOL ScrollConsoleScreenBufferW(HANDLE, CPtr!(SMALL_RECT), CPtr!(SMALL_RECT), COORD, CPtr!(CHAR_INFO)); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleActiveScreenBuffer(HANDLE); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleCP(UINT); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleCtrlHandler(PHANDLER_ROUTINE, BOOL); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleCursorInfo(HANDLE, CPtr!(CONSOLE_CURSOR_INFO)); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleCursorPosition(HANDLE, COORD); 4e2933c620 2015-04-21 kinaba: c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: static if (_WIN32_WINNT >= 0x0500) { 4e2933c620 2015-04-21 kinaba: BOOL GetConsoleDisplayMode(LPDWORD); 4e2933c620 2015-04-21 kinaba: HWND GetConsoleWindow(); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: static if (_WIN32_WINNT >= 0x0501) { 4e2933c620 2015-04-21 kinaba: BOOL AttachConsole(DWORD); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleDisplayMode(HANDLE, DWORD, PCOORD); 4e2933c620 2015-04-21 kinaba: const DWORD ATTACH_PARENT_PROCESS = cast(DWORD)-1; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleMode(HANDLE, DWORD); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleOutputCP(UINT); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleScreenBufferSize(HANDLE, COORD); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleTextAttribute(HANDLE, WORD); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleTitleA(LPCSTR); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleTitleW(LPCWSTR); 4e2933c620 2015-04-21 kinaba: BOOL SetConsoleWindowInfo(HANDLE, BOOL, CPtr!(SMALL_RECT)); 4e2933c620 2015-04-21 kinaba: BOOL WriteConsoleA(HANDLE, PCVOID, DWORD, PDWORD, PVOID); 4e2933c620 2015-04-21 kinaba: BOOL WriteConsoleW(HANDLE, PCVOID, DWORD, PDWORD, PVOID); 4e2933c620 2015-04-21 kinaba: BOOL WriteConsoleInputA(HANDLE, CPtr!(INPUT_RECORD), DWORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL WriteConsoleInputW(HANDLE, CPtr!(INPUT_RECORD), DWORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL WriteConsoleOutputA(HANDLE, CPtr!(CHAR_INFO), COORD, COORD, PSMALL_RECT); 4e2933c620 2015-04-21 kinaba: BOOL WriteConsoleOutputW(HANDLE, CPtr!(CHAR_INFO), COORD, COORD, PSMALL_RECT); 4e2933c620 2015-04-21 kinaba: BOOL WriteConsoleOutputAttribute(HANDLE, CPtr!(WORD), DWORD, COORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL WriteConsoleOutputCharacterA(HANDLE, LPCSTR, DWORD, COORD, PDWORD); 4e2933c620 2015-04-21 kinaba: BOOL WriteConsoleOutputCharacterW(HANDLE, LPCWSTR, DWORD, COORD, PDWORD); c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: version (Unicode) { 4e2933c620 2015-04-21 kinaba: alias FillConsoleOutputCharacterW FillConsoleOutputCharacter; 4e2933c620 2015-04-21 kinaba: alias GetConsoleTitleW GetConsoleTitle; 4e2933c620 2015-04-21 kinaba: alias PeekConsoleInputW PeekConsoleInput; 4e2933c620 2015-04-21 kinaba: alias ReadConsoleW ReadConsole; 4e2933c620 2015-04-21 kinaba: alias ReadConsoleInputW ReadConsoleInput; 4e2933c620 2015-04-21 kinaba: alias ReadConsoleOutputW ReadConsoleOutput; 4e2933c620 2015-04-21 kinaba: alias ReadConsoleOutputCharacterW ReadConsoleOutputCharacter; 4e2933c620 2015-04-21 kinaba: alias ScrollConsoleScreenBufferW ScrollConsoleScreenBuffer; 4e2933c620 2015-04-21 kinaba: alias SetConsoleTitleW SetConsoleTitle; 4e2933c620 2015-04-21 kinaba: alias WriteConsoleW WriteConsole; 4e2933c620 2015-04-21 kinaba: alias WriteConsoleInputW WriteConsoleInput; 4e2933c620 2015-04-21 kinaba: alias WriteConsoleOutputW WriteConsoleOutput; 4e2933c620 2015-04-21 kinaba: alias WriteConsoleOutputCharacterW WriteConsoleOutputCharacter; 4e2933c620 2015-04-21 kinaba: } else { 4e2933c620 2015-04-21 kinaba: alias FillConsoleOutputCharacterA FillConsoleOutputCharacter; 4e2933c620 2015-04-21 kinaba: alias GetConsoleTitleA GetConsoleTitle; 4e2933c620 2015-04-21 kinaba: alias PeekConsoleInputA PeekConsoleInput; 4e2933c620 2015-04-21 kinaba: alias ReadConsoleA ReadConsole; 4e2933c620 2015-04-21 kinaba: alias ReadConsoleInputA ReadConsoleInput; 4e2933c620 2015-04-21 kinaba: alias ReadConsoleOutputA ReadConsoleOutput; 4e2933c620 2015-04-21 kinaba: alias ReadConsoleOutputCharacterA ReadConsoleOutputCharacter; 4e2933c620 2015-04-21 kinaba: alias ScrollConsoleScreenBufferA ScrollConsoleScreenBuffer; 4e2933c620 2015-04-21 kinaba: alias SetConsoleTitleA SetConsoleTitle; 4e2933c620 2015-04-21 kinaba: alias WriteConsoleA WriteConsole; 4e2933c620 2015-04-21 kinaba: alias WriteConsoleInputA WriteConsoleInput; 4e2933c620 2015-04-21 kinaba: alias WriteConsoleOutputA WriteConsoleOutput; 4e2933c620 2015-04-21 kinaba: alias WriteConsoleOutputCharacterA WriteConsoleOutputCharacter; 4e2933c620 2015-04-21 kinaba: }