3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/misc/console.c
6 * PURPOSE: Win32 server console functions
7 * PROGRAMMER: James Tabor
8 * <jimtabor@adsl-64-217-116-74.dsl.hstntx.swbell.net>
11 * 19990204 EA SetConsoleTitleA
15 /* INCLUDES ******************************************************************/
20 #include "../include/debug.h"
22 extern BOOL WINAPI
DefaultConsoleCtrlHandler(DWORD Event
);
23 extern __declspec(noreturn
) VOID CALLBACK
ConsoleControlDispatcher(DWORD CodeAndFlag
);
24 extern RTL_CRITICAL_SECTION ConsoleLock
;
25 extern BOOL WINAPI
IsDebuggerPresent(VOID
);
28 /* GLOBALS *******************************************************************/
30 static BOOL IgnoreCtrlEvents
= FALSE
;
32 static PHANDLER_ROUTINE
* CtrlHandlers
= NULL
;
33 static ULONG NrCtrlHandlers
= 0;
34 static WCHAR InputExeName
[MAX_PATH
+ 1] = L
"";
36 /* Default Console Control Handler *******************************************/
38 BOOL WINAPI
DefaultConsoleCtrlHandler(DWORD Event
)
43 DPRINT("Ctrl-C Event\n");
46 case CTRL_BREAK_EVENT
:
47 DPRINT("Ctrl-Break Event\n");
50 case CTRL_SHUTDOWN_EVENT
:
51 DPRINT("Ctrl Shutdown Event\n");
54 case CTRL_CLOSE_EVENT
:
55 DPRINT("Ctrl Close Event\n");
58 case CTRL_LOGOFF_EVENT
:
59 DPRINT("Ctrl Logoff Event\n");
67 __declspec(noreturn
) VOID CALLBACK
ConsoleControlDispatcher(DWORD CodeAndFlag
)
70 DWORD nCode
= CodeAndFlag
& MAXLONG
;
73 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST
);
78 case CTRL_BREAK_EVENT
:
80 if(IsDebuggerPresent())
82 EXCEPTION_RECORD erException
;
83 erException
.ExceptionCode
=
84 (nCode
== CTRL_C_EVENT
? DBG_CONTROL_C
: DBG_CONTROL_BREAK
);
85 erException
.ExceptionFlags
= 0;
86 erException
.ExceptionRecord
= NULL
;
87 erException
.ExceptionAddress
= &DefaultConsoleCtrlHandler
;
88 erException
.NumberParameters
= 0;
89 RtlRaiseException(&erException
);
91 RtlEnterCriticalSection(&ConsoleLock
);
93 if(!(nCode
== CTRL_C_EVENT
&&
94 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
& 1))
96 for(i
= NrCtrlHandlers
; i
> 0; -- i
)
97 if(CtrlHandlers
[i
- 1](nCode
)) break;
99 RtlLeaveCriticalSection(&ConsoleLock
);
102 case CTRL_CLOSE_EVENT
:
103 case CTRL_LOGOFF_EVENT
:
104 case CTRL_SHUTDOWN_EVENT
:
107 default: ExitThread(0);
110 RtlEnterCriticalSection(&ConsoleLock
);
112 if(!(nCode
== CTRL_C_EVENT
&&
113 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
& 1))
118 if (i
== 1 && (CodeAndFlag
& MINLONG
) &&
119 (nCode
== CTRL_LOGOFF_EVENT
|| nCode
== CTRL_SHUTDOWN_EVENT
))
122 if(CtrlHandlers
[i
- 1](nCode
))
126 case CTRL_CLOSE_EVENT
:
127 case CTRL_LOGOFF_EVENT
:
128 case CTRL_SHUTDOWN_EVENT
:
129 nExitCode
= CodeAndFlag
;
136 RtlLeaveCriticalSection(&ConsoleLock
);
137 ExitThread(nExitCode
);
141 /* FUNCTIONS *****************************************************************/
147 AddConsoleAliasA (LPSTR Source
,
151 DPRINT1("AddConsoleAliasA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Source
, Target
, ExeName
);
152 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
161 AddConsoleAliasW (LPWSTR Source
,
165 DPRINT1("AddConsoleAliasW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Source
, Target
, ExeName
);
166 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
175 ConsoleMenuControl (HANDLE hConsole
,
182 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
183 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
192 DuplicateConsoleHandle (HANDLE hConsole
,
193 DWORD dwDesiredAccess
,
197 CSR_API_MESSAGE Request
;
201 if (IsConsoleHandle (hConsole
) == FALSE
)
203 SetLastError (ERROR_INVALID_PARAMETER
);
204 return INVALID_HANDLE_VALUE
;
207 CsrRequest
= MAKE_CSR_API(DUPLICATE_HANDLE
, CSR_NATIVE
);
208 Request
.Data
.DuplicateHandleRequest
.Handle
= hConsole
;
209 Request
.Data
.DuplicateHandleRequest
.ProcessId
= GetTeb()->Cid
.UniqueProcess
;
210 Status
= CsrClientCallServer(&Request
,
213 sizeof(CSR_API_MESSAGE
));
214 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
=Request
.Status
))
216 SetLastErrorByStatus(Status
);
217 return INVALID_HANDLE_VALUE
;
219 return Request
.Data
.DuplicateHandleRequest
.Handle
;
227 ExpungeConsoleCommandHistoryW (DWORD Unknown0
)
232 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
233 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
242 ExpungeConsoleCommandHistoryA (DWORD Unknown0
)
248 DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
249 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
258 GetConsoleAliasW (LPWSTR lpSource
,
259 LPWSTR lpTargetBuffer
,
260 DWORD TargetBufferLength
,
266 DPRINT1("GetConsoleAliasW(0x%p, 0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", lpSource
, lpTargetBuffer
, TargetBufferLength
, lpExeName
);
267 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
276 GetConsoleAliasA (LPSTR lpSource
,
277 LPSTR lpTargetBuffer
,
278 DWORD TargetBufferLength
,
284 DPRINT1("GetConsoleAliasA(0x%p, 0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", lpSource
, lpTargetBuffer
, TargetBufferLength
, lpExeName
);
285 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
294 GetConsoleAliasExesW (LPWSTR lpExeNameBuffer
,
295 DWORD ExeNameBufferLength
)
300 DPRINT1("GetConsoleAliasExesW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpExeNameBuffer
, ExeNameBufferLength
);
301 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
310 GetConsoleAliasExesA (LPSTR lpExeNameBuffer
,
311 DWORD ExeNameBufferLength
)
316 DPRINT1("GetConsoleAliasExesA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpExeNameBuffer
, ExeNameBufferLength
);
317 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
326 GetConsoleAliasExesLengthA (VOID
)
331 DPRINT1("GetConsoleAliasExesLengthA() UNIMPLEMENTED!\n");
332 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
341 GetConsoleAliasExesLengthW (VOID
)
346 DPRINT1("GetConsoleAliasExesLengthW() UNIMPLEMENTED!\n");
347 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
356 GetConsoleAliasesW (DWORD Unknown0
,
363 DPRINT1("GetConsoleAliasesW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
364 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
373 GetConsoleAliasesA (DWORD Unknown0
,
380 DPRINT1("GetConsoleAliasesA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
381 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
390 GetConsoleAliasesLengthW (LPWSTR lpExeName
)
395 DPRINT1("GetConsoleAliasesLengthW(0x%p) UNIMPLEMENTED!\n", lpExeName
);
396 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
405 GetConsoleAliasesLengthA (LPSTR lpExeName
)
410 DPRINT1("GetConsoleAliasesLengthA(0x%p) UNIMPLEMENTED!\n", lpExeName
);
411 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
420 GetConsoleCommandHistoryW (DWORD Unknown0
,
427 DPRINT1("GetConsoleCommandHistoryW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
428 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
437 GetConsoleCommandHistoryA (DWORD Unknown0
,
444 DPRINT1("GetConsoleCommandHistoryA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
445 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
454 GetConsoleCommandHistoryLengthW (DWORD Unknown0
)
459 DPRINT1("GetConsoleCommandHistoryLengthW(0x%x) UNIMPLEMENTED!\n", Unknown0
);
460 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
469 GetConsoleCommandHistoryLengthA (DWORD Unknown0
)
474 DPRINT1("GetConsoleCommandHistoryLengthA(0x%x) UNIMPLEMENTED!\n", Unknown0
);
475 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
483 GetConsoleDisplayMode (LPDWORD lpdwMode
)
485 * FUNCTION: Get the console display mode
487 * lpdwMode - Address of variable that receives the current value
489 * STATUS: Undocumented
492 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
493 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
502 GetConsoleFontInfo (DWORD Unknown0
,
510 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
511 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
520 GetConsoleFontSize(HANDLE hConsoleOutput
,
523 COORD Empty
= {0, 0};
524 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
525 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
534 GetConsoleHardwareState (HANDLE hConsole
,
541 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
545 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
546 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
547 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
549 Status
= CsrClientCallServer(& Request
,
552 sizeof(CSR_API_MESSAGE
));
553 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
555 SetLastErrorByStatus(Status
);
558 *State
= Request
.Data
.ConsoleHardwareStateRequest
.State
;
567 GetConsoleInputWaitHandle (VOID
)
572 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
576 CsrRequest
= MAKE_CSR_API(GET_INPUT_WAIT_HANDLE
, CSR_CONSOLE
);
577 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
578 sizeof(CSR_API_MESSAGE
));
579 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
581 SetLastErrorByStatus(Status
);
584 return (DWORD
) Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
592 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
594 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
596 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
597 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
606 GetNumberOfConsoleFonts (VOID
)
611 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
612 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
613 return 1; /* FIXME: call csrss.exe */
621 InvalidateConsoleDIBits (DWORD Unknown0
,
627 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
628 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
637 OpenConsoleW (LPWSTR wsName
,
638 DWORD dwDesiredAccess
,
640 DWORD dwCreationDistribution
)
645 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
647 PHANDLE phConsole
= NULL
;
648 NTSTATUS Status
= STATUS_SUCCESS
;
650 if(0 == _wcsicmp(wsName
, L
"CONIN$"))
652 CsrRequest
= MAKE_CSR_API(GET_INPUT_HANDLE
, CSR_NATIVE
);
653 phConsole
= & Request
.Data
.GetInputHandleRequest
.InputHandle
;
655 else if (0 == _wcsicmp(wsName
, L
"CONOUT$"))
657 CsrRequest
= MAKE_CSR_API(GET_OUTPUT_HANDLE
, CSR_NATIVE
);
658 phConsole
= & Request
.Data
.GetOutputHandleRequest
.OutputHandle
;
662 SetLastError(ERROR_INVALID_PARAMETER
);
663 return(INVALID_HANDLE_VALUE
);
665 if ((GENERIC_READ
|GENERIC_WRITE
) != dwDesiredAccess
)
667 SetLastError(ERROR_INVALID_PARAMETER
);
668 return(INVALID_HANDLE_VALUE
);
670 if (OPEN_EXISTING
!= dwCreationDistribution
)
672 SetLastError(ERROR_INVALID_PARAMETER
);
673 return(INVALID_HANDLE_VALUE
);
675 Status
= CsrClientCallServer(& Request
,
678 sizeof(CSR_API_MESSAGE
));
679 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
681 SetLastErrorByStatus(Status
);
682 return INVALID_HANDLE_VALUE
;
692 SetConsoleCommandHistoryMode (DWORD dwMode
)
697 DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode
);
698 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
707 SetConsoleCursor (DWORD Unknown0
,
713 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
714 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
723 SetConsoleDisplayMode (HANDLE hOut
,
727 * FUNCTION: Set the console display mode.
729 * hOut - Standard output handle.
730 * dwNewMode - New mode.
731 * lpdwOldMode - Address of a variable that receives the old mode.
734 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
735 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
744 SetConsoleFont (DWORD Unknown0
,
750 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
751 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
760 SetConsoleHardwareState (HANDLE hConsole
,
767 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
771 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
772 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
773 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
774 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
776 Status
= CsrClientCallServer(& Request
,
779 sizeof(CSR_API_MESSAGE
));
780 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
782 SetLastErrorByStatus(Status
);
793 SetConsoleKeyShortcuts (DWORD Unknown0
,
801 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
802 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
811 SetConsoleMaximumWindowSize (DWORD Unknown0
,
817 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
818 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
827 SetConsoleMenuClose (DWORD Unknown0
)
832 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
833 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
842 SetConsoleNumberOfCommandsA (DWORD Unknown0
,
848 DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
849 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
858 SetConsoleNumberOfCommandsW (DWORD Unknown0
,
864 DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
865 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
874 SetConsolePalette (DWORD Unknown0
,
881 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
882 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
891 SetLastConsoleEventActive (VOID
)
896 DPRINT1("SetLastConsoleEventActive() UNIMPLEMENTED!\n");
897 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
906 ShowConsoleCursor (DWORD Unknown0
,
912 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
913 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
919 * FUNCTION: Checks whether the given handle is a valid console handle.
921 * Handle - Handle to be checked
923 * TRUE: Handle is a valid console handle
924 * FALSE: Handle is not a valid console handle.
925 * STATUS: Officially undocumented
930 VerifyConsoleIoHandle(HANDLE Handle
)
932 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
936 CsrRequest
= MAKE_CSR_API(VERIFY_HANDLE
, CSR_NATIVE
);
937 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
938 Status
= CsrClientCallServer(&Request
,
941 sizeof(CSR_API_MESSAGE
));
942 if (!NT_SUCCESS(Status
))
944 SetLastErrorByStatus(Status
);
948 return (BOOL
)NT_SUCCESS(Request
.Status
);
956 WriteConsoleInputVDMA (DWORD Unknown0
,
961 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
962 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
971 WriteConsoleInputVDMW (DWORD Unknown0
,
976 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
977 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
986 CloseConsoleHandle(HANDLE Handle
)
991 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
995 if (IsConsoleHandle (Handle
) == FALSE
)
997 SetLastError (ERROR_INVALID_PARAMETER
);
1001 CsrRequest
= MAKE_CSR_API(CLOSE_HANDLE
, CSR_NATIVE
);
1002 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
1003 Status
= CsrClientCallServer(&Request
,
1006 sizeof(CSR_API_MESSAGE
));
1007 if (!NT_SUCCESS(Status
))
1009 SetLastErrorByStatus(Status
);
1020 GetStdHandle(DWORD nStdHandle
)
1022 * FUNCTION: Get a handle for the standard input, standard output
1023 * and a standard error device.
1025 * nStdHandle - Specifies the device for which to return the handle.
1026 * RETURNS: If the function succeeds, the return value is the handle
1027 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
1030 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1032 Ppb
= NtCurrentPeb()->ProcessParameters
;
1035 case STD_INPUT_HANDLE
:
1036 return Ppb
->StandardInput
;
1038 case STD_OUTPUT_HANDLE
:
1039 return Ppb
->StandardOutput
;
1041 case STD_ERROR_HANDLE
:
1042 return Ppb
->StandardError
;
1045 SetLastError (ERROR_INVALID_PARAMETER
);
1046 return INVALID_HANDLE_VALUE
;
1054 SetStdHandle(DWORD nStdHandle
,
1057 * FUNCTION: Set the handle for the standard input, standard output or
1058 * the standard error device.
1060 * nStdHandle - Specifies the handle to be set.
1061 * hHandle - The handle to set.
1062 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1065 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1067 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
1069 Ppb
= NtCurrentPeb()->ProcessParameters
;
1073 case STD_INPUT_HANDLE
:
1074 Ppb
->StandardInput
= hHandle
;
1077 case STD_OUTPUT_HANDLE
:
1078 Ppb
->StandardOutput
= hHandle
;
1081 case STD_ERROR_HANDLE
:
1082 Ppb
->StandardError
= hHandle
;
1086 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
1087 SetLastError (ERROR_INVALID_HANDLE
);
1093 IntWriteConsole(HANDLE hConsoleOutput
,
1095 DWORD nNumberOfCharsToWrite
,
1096 LPDWORD lpNumberOfCharsWritten
,
1100 CSR_API_MESSAGE Request
;
1104 ULONG SizeBytes
, CharSize
;
1107 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1109 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE
, CSR_CONSOLE
);
1110 Request
.Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1111 Request
.Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1113 while(nNumberOfCharsToWrite
> 0)
1115 nChars
= min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
) / CharSize
;
1116 Request
.Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1118 SizeBytes
= nChars
* CharSize
;
1120 memcpy(Request
.Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1122 Status
= CsrClientCallServer(&Request
,
1125 sizeof(CSR_API_MESSAGE
));
1127 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1129 SetLastErrorByStatus(Status
);
1133 nNumberOfCharsToWrite
-= nChars
;
1134 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1135 Written
+= Request
.Data
.WriteConsoleRequest
.NrCharactersWritten
;
1138 if(lpNumberOfCharsWritten
!= NULL
)
1140 *lpNumberOfCharsWritten
= Written
;
1147 /*--------------------------------------------------------------
1153 WriteConsoleA(HANDLE hConsoleOutput
,
1154 CONST VOID
*lpBuffer
,
1155 DWORD nNumberOfCharsToWrite
,
1156 LPDWORD lpNumberOfCharsWritten
,
1159 return IntWriteConsole(hConsoleOutput
,
1161 nNumberOfCharsToWrite
,
1162 lpNumberOfCharsWritten
,
1168 /*--------------------------------------------------------------
1175 HANDLE hConsoleOutput
,
1176 CONST VOID
*lpBuffer
,
1177 DWORD nNumberOfCharsToWrite
,
1178 LPDWORD lpNumberOfCharsWritten
,
1182 return IntWriteConsole(hConsoleOutput
,
1184 nNumberOfCharsToWrite
,
1185 lpNumberOfCharsWritten
,
1192 IntReadConsole(HANDLE hConsoleInput
,
1194 DWORD nNumberOfCharsToRead
,
1195 LPDWORD lpNumberOfCharsRead
,
1199 CSR_API_MESSAGE Request
;
1202 ULONG CharSize
, CharsRead
= 0;
1204 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1206 Request
.Status
= STATUS_SUCCESS
;
1210 if(Request
.Status
== STATUS_PENDING
)
1212 Status
= NtWaitForSingleObject(Request
.Data
.ReadConsoleRequest
.EventHandle
, FALSE
, 0);
1213 if(!NT_SUCCESS(Status
))
1215 DPRINT1("Wait for console input failed!\n");
1220 CsrRequest
= MAKE_CSR_API(READ_CONSOLE
, CSR_CONSOLE
);
1221 Request
.Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1222 Request
.Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1223 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
= min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
) / CharSize
;
1224 Request
.Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= CharsRead
;
1225 Status
= CsrClientCallServer(&Request
,
1228 sizeof(CSR_API_MESSAGE
));
1230 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1232 DPRINT1("CSR returned error in ReadConsole\n");
1233 SetLastErrorByStatus(Status
);
1237 nNumberOfCharsToRead
-= Request
.Data
.ReadConsoleRequest
.NrCharactersRead
;
1238 memcpy((PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)(CharsRead
* CharSize
)),
1239 Request
.Data
.ReadConsoleRequest
.Buffer
,
1240 Request
.Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1241 CharsRead
+= Request
.Data
.ReadConsoleRequest
.NrCharactersRead
;
1243 if(Request
.Status
== STATUS_NOTIFY_CLEANUP
)
1248 nNumberOfCharsToRead
++;
1250 Request
.Status
= STATUS_PENDING
;
1252 } while(Request
.Status
== STATUS_PENDING
&& nNumberOfCharsToRead
> 0);
1254 if(lpNumberOfCharsRead
!= NULL
)
1256 *lpNumberOfCharsRead
= CharsRead
;
1263 /*--------------------------------------------------------------
1269 ReadConsoleA(HANDLE hConsoleInput
,
1271 DWORD nNumberOfCharsToRead
,
1272 LPDWORD lpNumberOfCharsRead
,
1275 return IntReadConsole(hConsoleInput
,
1277 nNumberOfCharsToRead
,
1278 lpNumberOfCharsRead
,
1284 /*--------------------------------------------------------------
1290 ReadConsoleW(HANDLE hConsoleInput
,
1292 DWORD nNumberOfCharsToRead
,
1293 LPDWORD lpNumberOfCharsRead
,
1296 return IntReadConsole(hConsoleInput
,
1298 nNumberOfCharsToRead
,
1299 lpNumberOfCharsRead
,
1305 /*--------------------------------------------------------------
1310 BOOL STDCALL
AllocConsole(VOID
)
1312 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1317 if(NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
1319 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1320 SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS
);
1324 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1325 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
1327 CsrRequest
= MAKE_CSR_API(ALLOC_CONSOLE
, CSR_CONSOLE
);
1328 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1329 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1331 SetLastErrorByStatus ( Status
);
1334 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
1335 SetStdHandle( STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1336 SetStdHandle( STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1337 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1340 DUPLICATE_SAME_ACCESS
);
1341 SetStdHandle( STD_ERROR_HANDLE
, hStdError
);
1346 /*--------------------------------------------------------------
1351 BOOL STDCALL
FreeConsole(VOID
)
1353 // AG: I'm not sure if this is correct (what happens to std handles?)
1354 // but I just tried to reverse what AllocConsole() does...
1356 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1360 CsrRequest
= MAKE_CSR_API(FREE_CONSOLE
, CSR_CONSOLE
);
1361 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1362 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1364 SetLastErrorByStatus ( Status
);
1372 /*--------------------------------------------------------------
1373 * GetConsoleScreenBufferInfo
1379 GetConsoleScreenBufferInfo(
1380 HANDLE hConsoleOutput
,
1381 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
1384 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1388 CsrRequest
= MAKE_CSR_API(SCREEN_BUFFER_INFO
, CSR_CONSOLE
);
1389 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1390 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1391 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1393 SetLastErrorByStatus ( Status
);
1396 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1401 /*--------------------------------------------------------------
1402 * SetConsoleCursorPosition
1408 SetConsoleCursorPosition(
1409 HANDLE hConsoleOutput
,
1410 COORD dwCursorPosition
1413 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1417 CsrRequest
= MAKE_CSR_API(SET_CURSOR
, CSR_CONSOLE
);
1418 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1419 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1420 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1421 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1423 SetLastErrorByStatus ( Status
);
1431 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1435 LPDWORD lpNumberOfCharsWritten
,
1438 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1442 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT
, CSR_CONSOLE
);
1443 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1444 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1446 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1448 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1449 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1450 Request
.Data
.FillOutputRequest
.Length
= nLength
;
1451 Status
= CsrClientCallServer(&Request
, NULL
,
1453 sizeof(CSR_API_MESSAGE
));
1455 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1457 SetLastErrorByStatus(Status
);
1461 if(lpNumberOfCharsWritten
!= NULL
)
1463 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1469 /*--------------------------------------------------------------
1470 * FillConsoleOutputCharacterA
1475 FillConsoleOutputCharacterA(
1476 HANDLE hConsoleOutput
,
1480 LPDWORD lpNumberOfCharsWritten
1483 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1487 lpNumberOfCharsWritten
,
1492 /*--------------------------------------------------------------
1493 * FillConsoleOutputCharacterW
1499 FillConsoleOutputCharacterW(
1500 HANDLE hConsoleOutput
,
1504 LPDWORD lpNumberOfCharsWritten
1507 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1511 lpNumberOfCharsWritten
,
1517 IntPeekConsoleInput(HANDLE hConsoleInput
,
1518 PINPUT_RECORD lpBuffer
,
1520 LPDWORD lpNumberOfEventsRead
,
1523 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1526 PVOID BufferTargetBase
;
1529 if(lpBuffer
== NULL
)
1531 SetLastError(ERROR_INVALID_PARAMETER
);
1535 Size
= nLength
* sizeof(INPUT_RECORD
);
1537 Status
= CsrCaptureParameterBuffer(NULL
, Size
, &BufferBase
, &BufferTargetBase
);
1538 if(!NT_SUCCESS(Status
))
1540 SetLastErrorByStatus(Status
);
1544 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1545 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1546 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1547 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1548 Request
.Data
.PeekConsoleInputRequest
.InputRecord
= (INPUT_RECORD
*)BufferTargetBase
;
1550 Status
= CsrClientCallServer(&Request
,
1553 sizeof(CSR_API_MESSAGE
));
1555 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1557 CsrReleaseParameterBuffer(BufferBase
);
1561 memcpy(lpBuffer
, BufferBase
, sizeof(INPUT_RECORD
) * Request
.Data
.PeekConsoleInputRequest
.Length
);
1563 CsrReleaseParameterBuffer(BufferBase
);
1565 if(lpNumberOfEventsRead
!= NULL
)
1567 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1573 /*--------------------------------------------------------------
1581 HANDLE hConsoleInput
,
1582 PINPUT_RECORD lpBuffer
,
1584 LPDWORD lpNumberOfEventsRead
1587 return IntPeekConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1588 lpNumberOfEventsRead
, FALSE
);
1592 /*--------------------------------------------------------------
1600 HANDLE hConsoleInput
,
1601 PINPUT_RECORD lpBuffer
,
1603 LPDWORD lpNumberOfEventsRead
1606 return IntPeekConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1607 lpNumberOfEventsRead
, TRUE
);
1612 IntReadConsoleInput(HANDLE hConsoleInput
,
1613 PINPUT_RECORD lpBuffer
,
1615 LPDWORD lpNumberOfEventsRead
,
1618 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1623 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
1624 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1625 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
1630 Status
= CsrClientCallServer(&Request
, NULL
,
1632 sizeof(CSR_API_MESSAGE
));
1633 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1637 /* we couldn't read a single record, fail */
1638 SetLastErrorByStatus(Status
);
1643 /* FIXME - fail gracefully in case we already read at least one record? */
1647 else if(Status
== STATUS_PENDING
)
1651 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
1652 if(!NT_SUCCESS(Status
))
1654 SetLastErrorByStatus(Status
);
1660 /* nothing more to read (waiting for more input??), let's just bail */
1666 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
1669 if(!Request
.Data
.ReadInputRequest
.MoreEvents
)
1671 /* nothing more to read, bail */
1677 if(lpNumberOfEventsRead
!= NULL
)
1679 *lpNumberOfEventsRead
= Read
;
1686 /*--------------------------------------------------------------
1692 ReadConsoleInputA(HANDLE hConsoleInput
,
1693 PINPUT_RECORD lpBuffer
,
1695 LPDWORD lpNumberOfEventsRead
)
1697 return IntReadConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1698 lpNumberOfEventsRead
, FALSE
);
1702 /*--------------------------------------------------------------
1710 HANDLE hConsoleInput
,
1711 PINPUT_RECORD lpBuffer
,
1713 LPDWORD lpNumberOfEventsRead
1716 return IntReadConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1717 lpNumberOfEventsRead
, TRUE
);
1722 IntWriteConsoleInput(HANDLE hConsoleInput
,
1723 PINPUT_RECORD lpBuffer
,
1725 LPDWORD lpNumberOfEventsWritten
,
1728 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1730 PVOID BufferBase
, BufferTargetBase
;
1734 if(lpBuffer
== NULL
)
1736 SetLastError(ERROR_INVALID_PARAMETER
);
1740 Size
= nLength
* sizeof(INPUT_RECORD
);
1742 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1743 if(!NT_SUCCESS(Status
))
1745 SetLastErrorByStatus(Status
);
1749 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_INPUT
, CSR_CONSOLE
);
1750 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1751 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
1752 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
1753 Request
.Data
.WriteConsoleInputRequest
.InputRecord
= (PINPUT_RECORD
)BufferTargetBase
;
1755 Status
= CsrClientCallServer(&Request
, NULL
,
1757 sizeof(CSR_API_MESSAGE
));
1759 CsrReleaseParameterBuffer(BufferBase
);
1761 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1763 SetLastErrorByStatus(Status
);
1767 if(lpNumberOfEventsWritten
!= NULL
)
1769 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
1776 /*--------------------------------------------------------------
1777 * WriteConsoleInputA
1784 HANDLE hConsoleInput
,
1785 CONST INPUT_RECORD
*lpBuffer
,
1787 LPDWORD lpNumberOfEventsWritten
1790 return IntWriteConsoleInput(hConsoleInput
,
1791 (PINPUT_RECORD
)lpBuffer
,
1793 lpNumberOfEventsWritten
,
1798 /*--------------------------------------------------------------
1799 * WriteConsoleInputW
1806 HANDLE hConsoleInput
,
1807 CONST INPUT_RECORD
*lpBuffer
,
1809 LPDWORD lpNumberOfEventsWritten
1812 return IntWriteConsoleInput(hConsoleInput
,
1813 (PINPUT_RECORD
)lpBuffer
,
1815 lpNumberOfEventsWritten
,
1821 IntReadConsoleOutput(HANDLE hConsoleOutput
,
1822 PCHAR_INFO lpBuffer
,
1824 COORD dwBufferCoord
,
1825 PSMALL_RECT lpReadRegion
,
1828 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1831 PVOID BufferTargetBase
;
1833 DWORD Size
, SizeX
, SizeY
;
1835 if(lpBuffer
== NULL
)
1837 SetLastError(ERROR_INVALID_PARAMETER
);
1841 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
1843 Status
= CsrCaptureParameterBuffer(NULL
, Size
, &BufferBase
, &BufferTargetBase
);
1844 if(!NT_SUCCESS(Status
))
1846 SetLastErrorByStatus(Status
);
1850 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
1851 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1852 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
1853 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1854 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1855 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
1856 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
= (PCHAR_INFO
)BufferTargetBase
;
1858 Status
= CsrClientCallServer(&Request
,
1861 sizeof(CSR_API_MESSAGE
));
1863 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1865 SetLastErrorByStatus(Status
);
1866 CsrReleaseParameterBuffer(BufferBase
);
1870 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
- Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
1871 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
- Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
1873 memcpy(lpBuffer
, BufferBase
, sizeof(CHAR_INFO
) * SizeX
* SizeY
);
1875 CsrReleaseParameterBuffer(BufferBase
);
1877 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
1882 /*--------------------------------------------------------------
1883 * ReadConsoleOutputA
1890 HANDLE hConsoleOutput
,
1891 PCHAR_INFO lpBuffer
,
1893 COORD dwBufferCoord
,
1894 PSMALL_RECT lpReadRegion
1897 return IntReadConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
1898 dwBufferCoord
, lpReadRegion
, FALSE
);
1902 /*--------------------------------------------------------------
1903 * ReadConsoleOutputW
1910 HANDLE hConsoleOutput
,
1911 PCHAR_INFO lpBuffer
,
1913 COORD dwBufferCoord
,
1914 PSMALL_RECT lpReadRegion
1917 return IntReadConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
1918 dwBufferCoord
, lpReadRegion
, TRUE
);
1923 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
1924 CONST CHAR_INFO
*lpBuffer
,
1926 COORD dwBufferCoord
,
1927 PSMALL_RECT lpWriteRegion
,
1930 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1934 PVOID BufferTargetBase
;
1936 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
1938 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
,
1942 if (!NT_SUCCESS(Status
))
1944 SetLastErrorByStatus(Status
);
1948 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
1949 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1950 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
1951 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1952 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1953 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
1954 Request
.Data
.WriteConsoleOutputRequest
.CharInfo
=
1955 (CHAR_INFO
*)BufferTargetBase
;
1957 Status
= CsrClientCallServer(&Request
,
1960 sizeof(CSR_API_MESSAGE
));
1962 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1964 CsrReleaseParameterBuffer(BufferBase
);
1965 SetLastErrorByStatus(Status
);
1969 CsrReleaseParameterBuffer(BufferBase
);
1971 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
1976 /*--------------------------------------------------------------
1977 * WriteConsoleOutputA
1982 WriteConsoleOutputA(HANDLE hConsoleOutput
,
1983 CONST CHAR_INFO
*lpBuffer
,
1985 COORD dwBufferCoord
,
1986 PSMALL_RECT lpWriteRegion
)
1988 return IntWriteConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
1989 dwBufferCoord
, lpWriteRegion
, FALSE
);
1993 /*--------------------------------------------------------------
1994 * WriteConsoleOutputW
2000 WriteConsoleOutputW(
2001 HANDLE hConsoleOutput
,
2002 CONST CHAR_INFO
*lpBuffer
,
2004 COORD dwBufferCoord
,
2005 PSMALL_RECT lpWriteRegion
2008 return IntWriteConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
2009 dwBufferCoord
, lpWriteRegion
, TRUE
);
2014 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2018 LPDWORD lpNumberOfCharsRead
,
2021 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2023 ULONG nChars
, SizeBytes
, CharSize
;
2024 DWORD CharsRead
= 0;
2026 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2028 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2029 SizeBytes
= nChars
* CharSize
;
2031 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2032 Request
.Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2033 Request
.Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2034 Request
.Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2040 Request
.Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2041 SizeBytes
= Request
.Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2043 Status
= CsrClientCallServer(&Request
,
2046 sizeof(CSR_API_MESSAGE
));
2047 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
.Status
))
2049 SetLastErrorByStatus(Status
);
2053 BytesRead
= Request
.Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2054 memcpy(lpCharacter
, Request
.Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2055 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2056 CharsRead
+= Request
.Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2057 nLength
-= Request
.Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2059 Request
.Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
.Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2062 if(lpNumberOfCharsRead
!= NULL
)
2064 *lpNumberOfCharsRead
= CharsRead
;
2071 /*--------------------------------------------------------------
2072 * ReadConsoleOutputCharacterA
2078 ReadConsoleOutputCharacterA(
2079 HANDLE hConsoleOutput
,
2083 LPDWORD lpNumberOfCharsRead
2086 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2090 lpNumberOfCharsRead
,
2095 /*--------------------------------------------------------------
2096 * ReadConsoleOutputCharacterW
2102 ReadConsoleOutputCharacterW(
2103 HANDLE hConsoleOutput
,
2107 LPDWORD lpNumberOfCharsRead
2110 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2114 lpNumberOfCharsRead
,
2119 /*--------------------------------------------------------------
2120 * ReadConsoleOutputAttribute
2126 ReadConsoleOutputAttribute(
2127 HANDLE hConsoleOutput
,
2131 LPDWORD lpNumberOfAttrsRead
2134 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2138 if (lpNumberOfAttrsRead
!= NULL
)
2139 *lpNumberOfAttrsRead
= nLength
;
2141 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2142 Request
.Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2143 Request
.Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2145 while (nLength
!= 0)
2147 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2148 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2152 Request
.Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2154 Status
= CsrClientCallServer(&Request
,
2157 sizeof(CSR_API_MESSAGE
));
2158 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
.Status
))
2160 SetLastErrorByStatus(Status
);
2164 memcpy(lpAttribute
, Request
.Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2165 lpAttribute
+= Size
;
2167 Request
.Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
.Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2175 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2179 LPDWORD lpNumberOfCharsWritten
,
2182 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2184 ULONG SizeBytes
, CharSize
, nChars
;
2187 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2189 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2190 SizeBytes
= nChars
* CharSize
;
2192 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2193 Request
.Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2194 Request
.Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2195 Request
.Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2201 Request
.Data
.WriteConsoleOutputCharRequest
.Length
= min(nLength
, nChars
);
2202 BytesWrite
= Request
.Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2204 memcpy(Request
.Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2206 Status
= CsrClientCallServer(&Request
,
2209 sizeof(CSR_API_MESSAGE
));
2211 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2213 SetLastErrorByStatus(Status
);
2217 nLength
-= Request
.Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2218 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
.Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2219 Written
+= Request
.Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2221 Request
.Data
.WriteConsoleOutputCharRequest
.Coord
= Request
.Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2224 if(lpNumberOfCharsWritten
!= NULL
)
2226 *lpNumberOfCharsWritten
= Written
;
2233 /*--------------------------------------------------------------
2234 * WriteConsoleOutputCharacterA
2239 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2243 LPDWORD lpNumberOfCharsWritten
)
2245 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2249 lpNumberOfCharsWritten
,
2254 /*--------------------------------------------------------------
2255 * WriteConsoleOutputCharacterW
2260 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2261 LPCWSTR lpCharacter
,
2264 LPDWORD lpNumberOfCharsWritten
)
2266 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2270 lpNumberOfCharsWritten
,
2275 /*--------------------------------------------------------------
2276 * WriteConsoleOutputAttribute
2282 WriteConsoleOutputAttribute(
2283 HANDLE hConsoleOutput
,
2284 CONST WORD
*lpAttribute
,
2287 LPDWORD lpNumberOfAttrsWritten
2290 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2294 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2295 Request
.Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2296 Request
.Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2297 if( lpNumberOfAttrsWritten
)
2298 *lpNumberOfAttrsWritten
= nLength
;
2301 Size
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2302 Request
.Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2303 memcpy(Request
.Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2305 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2306 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2308 SetLastErrorByStatus ( Status
);
2312 lpAttribute
+= Size
;
2313 Request
.Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
.Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2320 /*--------------------------------------------------------------
2321 * FillConsoleOutputAttribute
2327 FillConsoleOutputAttribute(
2328 HANDLE hConsoleOutput
,
2332 LPDWORD lpNumberOfAttrsWritten
2335 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2339 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2340 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2341 Request
.Data
.FillOutputAttribRequest
.Attribute
= wAttribute
;
2342 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2343 Request
.Data
.FillOutputAttribRequest
.Length
= nLength
;
2344 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2345 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2347 SetLastErrorByStatus ( Status
);
2350 if( lpNumberOfAttrsWritten
)
2351 *lpNumberOfAttrsWritten
= nLength
;
2356 /*--------------------------------------------------------------
2364 HANDLE hConsoleHandle
,
2368 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2372 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2373 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2374 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2375 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2377 SetLastErrorByStatus ( Status
);
2380 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2385 /*--------------------------------------------------------------
2386 * GetNumberOfConsoleInputEvents
2392 GetNumberOfConsoleInputEvents(
2393 HANDLE hConsoleInput
,
2394 LPDWORD lpNumberOfEvents
2397 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2401 if(lpNumberOfEvents
== NULL
)
2403 SetLastError(ERROR_INVALID_PARAMETER
);
2407 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2408 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2409 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2410 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2412 SetLastErrorByStatus(Status
);
2416 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2422 /*--------------------------------------------------------------
2423 * GetLargestConsoleWindowSize
2429 GetLargestConsoleWindowSize(
2430 HANDLE hConsoleOutput
2433 COORD Coord
= {80,25};
2434 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2435 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2440 /*--------------------------------------------------------------
2441 * GetConsoleCursorInfo
2447 GetConsoleCursorInfo(
2448 HANDLE hConsoleOutput
,
2449 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
2452 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2456 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2457 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2458 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2460 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2462 SetLastErrorByStatus ( Status
);
2465 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2470 /*--------------------------------------------------------------
2471 * GetNumberOfConsoleMouseButtons
2477 GetNumberOfConsoleMouseButtons(
2478 LPDWORD lpNumberOfMouseButtons
2481 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2482 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2487 /*--------------------------------------------------------------
2495 HANDLE hConsoleHandle
,
2499 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2503 if (!IsConsoleHandle (hConsoleHandle
))
2505 DPRINT("SetConsoleMode was called with a non console handle\n");
2506 SetLastError (ERROR_INVALID_PARAMETER
);
2511 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
2512 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2513 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2514 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2515 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2517 SetLastErrorByStatus ( Status
);
2524 /*--------------------------------------------------------------
2525 * SetConsoleActiveScreenBuffer
2531 SetConsoleActiveScreenBuffer(
2532 HANDLE hConsoleOutput
2535 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2539 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
2540 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
2541 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2542 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2544 SetLastErrorByStatus ( Status
);
2551 /*--------------------------------------------------------------
2552 * FlushConsoleInputBuffer
2558 FlushConsoleInputBuffer(
2559 HANDLE hConsoleInput
2562 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2566 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
2567 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
2568 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2569 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2571 SetLastErrorByStatus ( Status
);
2578 /*--------------------------------------------------------------
2579 * SetConsoleScreenBufferSize
2585 SetConsoleScreenBufferSize(
2586 HANDLE hConsoleOutput
,
2590 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
2591 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2595 /*--------------------------------------------------------------
2596 * SetConsoleCursorInfo
2602 SetConsoleCursorInfo(
2603 HANDLE hConsoleOutput
,
2604 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
2607 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2611 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
2612 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2613 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
2614 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2616 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2618 SetLastErrorByStatus ( Status
);
2626 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
2627 PSMALL_RECT lpScrollRectangle
,
2628 PSMALL_RECT lpClipRectangle
,
2629 COORD dwDestinationOrigin
,
2633 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2637 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
2638 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
2639 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
2640 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
2642 if(lpClipRectangle
!= NULL
)
2644 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
2645 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
2649 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
2652 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
2653 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
2654 Status
= CsrClientCallServer(&Request
, NULL
,
2656 sizeof(CSR_API_MESSAGE
));
2658 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2660 SetLastErrorByStatus(Status
);
2668 /*--------------------------------------------------------------
2669 * ScrollConsoleScreenBufferA
2675 ScrollConsoleScreenBufferA(
2676 HANDLE hConsoleOutput
,
2677 CONST SMALL_RECT
*lpScrollRectangle
,
2678 CONST SMALL_RECT
*lpClipRectangle
,
2679 COORD dwDestinationOrigin
,
2680 CONST CHAR_INFO
*lpFill
2683 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2684 (PSMALL_RECT
)lpScrollRectangle
,
2685 (PSMALL_RECT
)lpClipRectangle
,
2686 dwDestinationOrigin
,
2692 /*--------------------------------------------------------------
2693 * ScrollConsoleScreenBufferW
2699 ScrollConsoleScreenBufferW(
2700 HANDLE hConsoleOutput
,
2701 CONST SMALL_RECT
*lpScrollRectangle
,
2702 CONST SMALL_RECT
*lpClipRectangle
,
2703 COORD dwDestinationOrigin
,
2704 CONST CHAR_INFO
*lpFill
2707 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2708 (PSMALL_RECT
)lpScrollRectangle
,
2709 (PSMALL_RECT
)lpClipRectangle
,
2710 dwDestinationOrigin
,
2716 /*--------------------------------------------------------------
2717 * SetConsoleWindowInfo
2723 SetConsoleWindowInfo(
2724 HANDLE hConsoleOutput
,
2726 CONST SMALL_RECT
*lpConsoleWindow
2729 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
2730 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2735 /*--------------------------------------------------------------
2736 * SetConsoleTextAttribute
2742 SetConsoleTextAttribute(
2743 HANDLE hConsoleOutput
,
2747 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2751 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
2752 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2753 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
2754 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2755 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2757 SetLastErrorByStatus ( Status
);
2765 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2767 if (HandlerRoutine
== NULL
)
2769 IgnoreCtrlEvents
= TRUE
;
2775 if (CtrlHandlers
== NULL
)
2777 CtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
2778 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2782 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
2783 (PVOID
)CtrlHandlers
,
2784 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2786 if (CtrlHandlers
== NULL
)
2789 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2792 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
2799 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2803 if (HandlerRoutine
== NULL
)
2805 IgnoreCtrlEvents
= FALSE
;
2810 for (i
= 0; i
< NrCtrlHandlers
; i
++)
2812 if ( ((void*)(CtrlHandlers
[i
])) == (void*)HandlerRoutine
)
2815 memmove(CtrlHandlers
+ i
, CtrlHandlers
+ i
+ 1,
2816 (NrCtrlHandlers
- i
) * sizeof(PHANDLER_ROUTINE
));
2818 RtlReAllocateHeap(RtlGetProcessHeap(),
2820 (PVOID
)CtrlHandlers
,
2821 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2834 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
2839 RtlEnterCriticalSection(&DllLock
);
2842 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
2846 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
2848 RtlLeaveCriticalSection(&DllLock
);
2853 /*--------------------------------------------------------------
2854 * GenerateConsoleCtrlEvent
2859 GenerateConsoleCtrlEvent(
2861 DWORD dwProcessGroupId
2864 DPRINT1("GenerateConsoleCtrlEvent(0x%x, 0x%x) UNIMPLEMENTED!\n", dwCtrlEvent
, dwProcessGroupId
);
2865 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2870 /*--------------------------------------------------------------
2878 LPWSTR lpConsoleTitle
,
2882 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2886 hConsole
= CreateFileW(L
"CONIN$", GENERIC_READ
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2887 if (hConsole
== INVALID_HANDLE_VALUE
)
2892 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
2893 Request
.Data
.GetTitleRequest
.ConsoleHandle
= hConsole
;
2895 Status
= CsrClientCallServer(&Request
,
2898 sizeof(CSR_API_MESSAGE
));
2899 CloseHandle(hConsole
);
2900 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
2902 SetLastErrorByStatus(Status
);
2906 if(nSize
* sizeof(WCHAR
) < Request
.Data
.GetTitleRequest
.Length
)
2908 wcsncpy(lpConsoleTitle
, Request
.Data
.GetTitleRequest
.Title
, nSize
- 1);
2909 lpConsoleTitle
[nSize
--] = L
'\0';
2913 nSize
= Request
.Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
2914 wcscpy(lpConsoleTitle
, Request
.Data
.GetTitleRequest
.Title
);
2915 lpConsoleTitle
[nSize
] = L
'\0';
2922 /*--------------------------------------------------------------
2932 LPSTR lpConsoleTitle
,
2936 wchar_t WideTitle
[CSRSS_MAX_TITLE_LENGTH
];
2937 DWORD nWideTitle
= sizeof WideTitle
;
2940 if (!lpConsoleTitle
|| !nSize
) return 0;
2941 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
2942 if (!nWideTitle
) return 0;
2944 if ( (nWritten
= WideCharToMultiByte(
2945 CP_ACP
, // ANSI code page
2946 0, // performance and mapping flags
2947 (LPWSTR
) WideTitle
, // address of wide-character string
2948 nWideTitle
, // number of characters in string
2949 lpConsoleTitle
, // address of buffer for new string
2950 nSize
, // size of buffer
2955 lpConsoleTitle
[nWritten
] = '\0';
2963 /*--------------------------------------------------------------
2971 LPCWSTR lpConsoleTitle
2974 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2979 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2980 if (hConsole
== INVALID_HANDLE_VALUE
)
2985 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
2986 Request
.Data
.SetTitleRequest
.Console
= hConsole
;
2988 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
2989 Request
.Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
2991 Request
.Data
.SetTitleRequest
.Title
[c
] = 0;
2992 Request
.Data
.SetTitleRequest
.Length
= c
;
2993 Status
= CsrClientCallServer(&Request
,
2996 sizeof(CSR_API_MESSAGE
));
2997 CloseHandle(hConsole
);
2998 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
3000 SetLastErrorByStatus (Status
);
3007 /*--------------------------------------------------------------
3017 LPCSTR lpConsoleTitle
3020 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3025 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
3026 if (hConsole
== INVALID_HANDLE_VALUE
)
3031 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3032 Request
.Data
.SetTitleRequest
.Console
= hConsole
;
3034 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
3035 Request
.Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3037 Request
.Data
.SetTitleRequest
.Title
[c
] = 0;
3038 Request
.Data
.SetTitleRequest
.Length
= c
;
3039 Status
= CsrClientCallServer(&Request
,
3042 sizeof(CSR_API_MESSAGE
));
3043 CloseHandle(hConsole
);
3044 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
3046 SetLastErrorByStatus (Status
);
3053 /*--------------------------------------------------------------
3054 * CreateConsoleScreenBuffer
3060 CreateConsoleScreenBuffer(
3061 DWORD dwDesiredAccess
,
3063 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3065 LPVOID lpScreenBufferData
3068 // FIXME: don't ignore access, share mode, and security
3069 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3073 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3074 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3075 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
3077 SetLastErrorByStatus ( Status
);
3080 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3084 /*--------------------------------------------------------------
3091 GetConsoleCP( VOID
)
3093 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3097 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3098 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3099 sizeof(CSR_API_MESSAGE
));
3100 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3102 SetLastErrorByStatus (Status
);
3105 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3109 /*--------------------------------------------------------------
3120 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3124 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3125 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3126 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3127 sizeof(CSR_API_MESSAGE
));
3128 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3130 SetLastErrorByStatus (Status
);
3132 return NT_SUCCESS(Status
);
3136 /*--------------------------------------------------------------
3137 * GetConsoleOutputCP
3143 GetConsoleOutputCP( VOID
)
3145 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3149 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3150 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3151 sizeof(CSR_API_MESSAGE
));
3152 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3154 SetLastErrorByStatus (Status
);
3157 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3161 /*--------------------------------------------------------------
3162 * SetConsoleOutputCP
3172 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3176 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3177 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3178 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3179 sizeof(CSR_API_MESSAGE
));
3180 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3182 SetLastErrorByStatus (Status
);
3184 return NT_SUCCESS(Status
);
3188 /*--------------------------------------------------------------
3189 * GetConsoleProcessList
3194 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3195 DWORD dwProcessCount
)
3197 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3201 if(lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3203 SetLastError(ERROR_INVALID_PARAMETER
);
3207 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3208 Request
.Data
.GetProcessListRequest
.nMaxIds
= dwProcessCount
;
3210 Status
= CsrClientCallServer(&Request
,
3213 sizeof(CSR_API_MESSAGE
));
3214 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3216 SetLastErrorByStatus (Status
);
3221 if(dwProcessCount
>= Request
.Data
.GetProcessListRequest
.nProcessIdsTotal
)
3223 nProcesses
= Request
.Data
.GetProcessListRequest
.nProcessIdsCopied
;
3224 for(nProcesses
= 0; nProcesses
< Request
.Data
.GetProcessListRequest
.nProcessIdsCopied
; nProcesses
++)
3226 *(lpdwProcessList
++) = (DWORD
)Request
.Data
.GetProcessListRequest
.ProcessId
[nProcesses
];
3231 nProcesses
= Request
.Data
.GetProcessListRequest
.nProcessIdsTotal
;
3240 /*--------------------------------------------------------------
3241 * GetConsoleSelectionInfo
3246 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3248 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3249 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3255 /*--------------------------------------------------------------
3261 AttachConsole(DWORD dwProcessId
)
3263 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3264 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3268 /*--------------------------------------------------------------
3274 GetConsoleWindow (VOID
)
3276 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3280 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3281 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3282 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3284 SetLastErrorByStatus (Status
);
3287 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3291 /*--------------------------------------------------------------
3296 BOOL STDCALL
SetConsoleIcon(HICON hicon
)
3298 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3302 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3303 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3304 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3305 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3307 SetLastErrorByStatus (Status
);
3310 return NT_SUCCESS(Status
);
3314 /*--------------------------------------------------------------
3315 * SetConsoleInputExeNameW
3320 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3323 int lenName
= lstrlenW(lpInputExeName
);
3326 lenName
> (int)(sizeof(InputExeName
) / sizeof(InputExeName
[0])) - 1)
3328 /* Fail if string is empty or too long */
3329 SetLastError(ERROR_INVALID_PARAMETER
);
3333 RtlEnterCriticalSection(&ConsoleLock
);
3334 /* wrap copying into SEH as we may copy from invalid buffer and in case of an
3335 exception the console lock would've never been released, which would cause
3336 further calls (if the exception was handled by the caller) to recursively
3337 acquire the lock... */
3340 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3341 InputExeName
[lenName
] = L
'\0';
3347 SetLastErrorByStatus(_SEH_GetExceptionCode());
3350 RtlLeaveCriticalSection(&ConsoleLock
);
3356 /*--------------------------------------------------------------
3357 * SetConsoleInputExeNameA
3362 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3364 ANSI_STRING InputExeNameA
;
3365 UNICODE_STRING InputExeNameU
;
3369 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3371 if(InputExeNameA
.Length
< sizeof(InputExeNameA
.Buffer
[0]) ||
3372 InputExeNameA
.Length
>= (sizeof(InputExeName
) / sizeof(InputExeName
[0])) - 1)
3374 /* Fail if string is empty or too long */
3375 SetLastError(ERROR_INVALID_PARAMETER
);
3379 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, TRUE
);
3380 if(NT_SUCCESS(Status
))
3382 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3383 RtlFreeUnicodeString(&InputExeNameU
);
3387 SetLastErrorByStatus(Status
);
3395 /*--------------------------------------------------------------
3396 * GetConsoleInputExeNameW
3401 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3405 RtlEnterCriticalSection(&ConsoleLock
);
3407 lenName
= lstrlenW(InputExeName
);
3408 if(lenName
>= (int)nBufferLength
)
3410 /* buffer is not large enough, return the required size */
3411 RtlLeaveCriticalSection(&ConsoleLock
);
3415 /* wrap copying into SEH as we may copy to invalid buffer and in case of an
3416 exception the console lock would've never been released, which would cause
3417 further calls (if the exception was handled by the caller) to recursively
3418 acquire the lock... */
3421 RtlCopyMemory(lpBuffer
, InputExeName
, (lenName
+ 1) * sizeof(WCHAR
));
3426 SetLastErrorByStatus(_SEH_GetExceptionCode());
3430 RtlLeaveCriticalSection(&ConsoleLock
);
3436 /*--------------------------------------------------------------
3437 * GetConsoleInputExeNameA
3442 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
3447 if(nBufferLength
> 0)
3449 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0, nBufferLength
* sizeof(WCHAR
));
3452 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3461 Ret
= GetConsoleInputExeNameW(nBufferLength
, Buffer
);
3462 if(nBufferLength
> 0)
3466 UNICODE_STRING BufferU
;
3467 ANSI_STRING BufferA
;
3469 RtlInitUnicodeString(&BufferU
, Buffer
);
3472 BufferA
.MaximumLength
= nBufferLength
;
3473 BufferA
.Buffer
= lpBuffer
;
3475 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
3478 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
3485 /*--------------------------------------------------------------
3486 * GetConsoleHistoryInfo
3491 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
3493 DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
3494 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3499 /*--------------------------------------------------------------
3500 * SetConsoleHistoryInfo
3505 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
3507 DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
3508 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3513 /*--------------------------------------------------------------
3514 * GetConsoleOriginalTitleW
3519 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle
,
3522 DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
3523 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3528 /*--------------------------------------------------------------
3529 * GetConsoleOriginalTitleA
3534 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle
,
3537 DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
3538 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3543 /*--------------------------------------------------------------
3544 * GetConsoleScreenBufferInfoEx
3549 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
3550 OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
3552 DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
3553 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3558 /*--------------------------------------------------------------
3559 * SetConsoleScreenBufferInfoEx
3564 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
3565 IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
3567 DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
3568 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3573 /*--------------------------------------------------------------
3574 * GetCurrentConsoleFontEx
3579 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput
,
3580 IN BOOL bMaximumWindow
,
3581 OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
)
3583 DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFontEx
);
3584 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);