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 PCSR_API_MESSAGE Request
;
1104 ULONG SizeBytes
, CharSize
;
1107 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1108 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
1109 max(sizeof(CSR_API_MESSAGE
),
1110 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
)
1111 + min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
) * CharSize
));
1112 if (Request
== NULL
)
1114 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1118 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE
, CSR_CONSOLE
);
1119 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1120 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1122 while(nNumberOfCharsToWrite
> 0)
1124 nChars
= min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
);
1125 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1127 SizeBytes
= nChars
* CharSize
;
1129 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1131 Status
= CsrClientCallServer(Request
,
1134 max(sizeof(CSR_API_MESSAGE
), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + SizeBytes
));
1136 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1138 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1139 SetLastErrorByStatus(Status
);
1143 nNumberOfCharsToWrite
-= nChars
;
1144 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1145 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
1148 if(lpNumberOfCharsWritten
!= NULL
)
1150 *lpNumberOfCharsWritten
= Written
;
1152 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1158 /*--------------------------------------------------------------
1164 WriteConsoleA(HANDLE hConsoleOutput
,
1165 CONST VOID
*lpBuffer
,
1166 DWORD nNumberOfCharsToWrite
,
1167 LPDWORD lpNumberOfCharsWritten
,
1170 return IntWriteConsole(hConsoleOutput
,
1172 nNumberOfCharsToWrite
,
1173 lpNumberOfCharsWritten
,
1179 /*--------------------------------------------------------------
1186 HANDLE hConsoleOutput
,
1187 CONST VOID
*lpBuffer
,
1188 DWORD nNumberOfCharsToWrite
,
1189 LPDWORD lpNumberOfCharsWritten
,
1193 return IntWriteConsole(hConsoleOutput
,
1195 nNumberOfCharsToWrite
,
1196 lpNumberOfCharsWritten
,
1203 IntReadConsole(HANDLE hConsoleInput
,
1205 DWORD nNumberOfCharsToRead
,
1206 LPDWORD lpNumberOfCharsRead
,
1210 PCSR_API_MESSAGE Request
;
1213 ULONG CharSize
, CharsRead
= 0;
1215 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1216 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
1217 max(sizeof(CSR_API_MESSAGE
),
1218 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
)
1219 + min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
/ CharSize
) * CharSize
));
1220 if (Request
== NULL
)
1222 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1226 Request
->Status
= STATUS_SUCCESS
;
1230 if(Request
->Status
== STATUS_PENDING
)
1232 Status
= NtWaitForSingleObject(Request
->Data
.ReadConsoleRequest
.EventHandle
, FALSE
, 0);
1233 if(!NT_SUCCESS(Status
))
1235 DPRINT1("Wait for console input failed!\n");
1240 CsrRequest
= MAKE_CSR_API(READ_CONSOLE
, CSR_CONSOLE
);
1241 Request
->Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1242 Request
->Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1243 Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
= min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
/ CharSize
);
1244 Request
->Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= CharsRead
;
1245 Status
= CsrClientCallServer(Request
,
1248 max(sizeof(CSR_API_MESSAGE
),
1249 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE
)
1250 + Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
* CharSize
));
1252 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1254 DPRINT1("CSR returned error in ReadConsole\n");
1255 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1256 SetLastErrorByStatus(Status
);
1260 nNumberOfCharsToRead
-= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1261 memcpy((PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)(CharsRead
* CharSize
)),
1262 Request
->Data
.ReadConsoleRequest
.Buffer
,
1263 Request
->Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1264 CharsRead
+= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1266 if(Request
->Status
== STATUS_NOTIFY_CLEANUP
)
1271 nNumberOfCharsToRead
++;
1273 Request
->Status
= STATUS_PENDING
;
1275 } while(Request
->Status
== STATUS_PENDING
&& nNumberOfCharsToRead
> 0);
1277 if(lpNumberOfCharsRead
!= NULL
)
1279 *lpNumberOfCharsRead
= CharsRead
;
1282 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1288 /*--------------------------------------------------------------
1294 ReadConsoleA(HANDLE hConsoleInput
,
1296 DWORD nNumberOfCharsToRead
,
1297 LPDWORD lpNumberOfCharsRead
,
1300 return IntReadConsole(hConsoleInput
,
1302 nNumberOfCharsToRead
,
1303 lpNumberOfCharsRead
,
1309 /*--------------------------------------------------------------
1315 ReadConsoleW(HANDLE hConsoleInput
,
1317 DWORD nNumberOfCharsToRead
,
1318 LPDWORD lpNumberOfCharsRead
,
1321 return IntReadConsole(hConsoleInput
,
1323 nNumberOfCharsToRead
,
1324 lpNumberOfCharsRead
,
1330 /*--------------------------------------------------------------
1335 BOOL STDCALL
AllocConsole(VOID
)
1337 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1342 if(NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
1344 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1345 SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS
);
1349 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1350 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
1352 CsrRequest
= MAKE_CSR_API(ALLOC_CONSOLE
, CSR_CONSOLE
);
1353 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1354 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1356 SetLastErrorByStatus ( Status
);
1359 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
1360 SetStdHandle( STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1361 SetStdHandle( STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1362 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1365 DUPLICATE_SAME_ACCESS
);
1366 SetStdHandle( STD_ERROR_HANDLE
, hStdError
);
1371 /*--------------------------------------------------------------
1376 BOOL STDCALL
FreeConsole(VOID
)
1378 // AG: I'm not sure if this is correct (what happens to std handles?)
1379 // but I just tried to reverse what AllocConsole() does...
1381 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1385 CsrRequest
= MAKE_CSR_API(FREE_CONSOLE
, CSR_CONSOLE
);
1386 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1387 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1389 SetLastErrorByStatus ( Status
);
1397 /*--------------------------------------------------------------
1398 * GetConsoleScreenBufferInfo
1404 GetConsoleScreenBufferInfo(
1405 HANDLE hConsoleOutput
,
1406 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
1409 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1413 CsrRequest
= MAKE_CSR_API(SCREEN_BUFFER_INFO
, CSR_CONSOLE
);
1414 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1415 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1416 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1418 SetLastErrorByStatus ( Status
);
1421 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1426 /*--------------------------------------------------------------
1427 * SetConsoleCursorPosition
1433 SetConsoleCursorPosition(
1434 HANDLE hConsoleOutput
,
1435 COORD dwCursorPosition
1438 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1442 CsrRequest
= MAKE_CSR_API(SET_CURSOR
, CSR_CONSOLE
);
1443 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1444 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1445 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1446 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1448 SetLastErrorByStatus ( Status
);
1456 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1460 LPDWORD lpNumberOfCharsWritten
,
1463 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1467 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT
, CSR_CONSOLE
);
1468 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1469 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1471 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1473 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1474 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1475 Request
.Data
.FillOutputRequest
.Length
= nLength
;
1476 Status
= CsrClientCallServer(&Request
, NULL
,
1478 sizeof(CSR_API_MESSAGE
));
1480 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1482 SetLastErrorByStatus(Status
);
1486 if(lpNumberOfCharsWritten
!= NULL
)
1488 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1494 /*--------------------------------------------------------------
1495 * FillConsoleOutputCharacterA
1500 FillConsoleOutputCharacterA(
1501 HANDLE hConsoleOutput
,
1505 LPDWORD lpNumberOfCharsWritten
1508 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1512 lpNumberOfCharsWritten
,
1517 /*--------------------------------------------------------------
1518 * FillConsoleOutputCharacterW
1524 FillConsoleOutputCharacterW(
1525 HANDLE hConsoleOutput
,
1529 LPDWORD lpNumberOfCharsWritten
1532 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1536 lpNumberOfCharsWritten
,
1542 IntPeekConsoleInput(HANDLE hConsoleInput
,
1543 PINPUT_RECORD lpBuffer
,
1545 LPDWORD lpNumberOfEventsRead
,
1548 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1551 PVOID BufferTargetBase
;
1554 if(lpBuffer
== NULL
)
1556 SetLastError(ERROR_INVALID_PARAMETER
);
1560 Size
= nLength
* sizeof(INPUT_RECORD
);
1562 Status
= CsrCaptureParameterBuffer(NULL
, Size
, &BufferBase
, &BufferTargetBase
);
1563 if(!NT_SUCCESS(Status
))
1565 SetLastErrorByStatus(Status
);
1569 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1570 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1571 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1572 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1573 Request
.Data
.PeekConsoleInputRequest
.InputRecord
= (INPUT_RECORD
*)BufferTargetBase
;
1575 Status
= CsrClientCallServer(&Request
,
1578 sizeof(CSR_API_MESSAGE
));
1580 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1582 CsrReleaseParameterBuffer(BufferBase
);
1586 memcpy(lpBuffer
, BufferBase
, sizeof(INPUT_RECORD
) * Request
.Data
.PeekConsoleInputRequest
.Length
);
1588 CsrReleaseParameterBuffer(BufferBase
);
1590 if(lpNumberOfEventsRead
!= NULL
)
1592 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1598 /*--------------------------------------------------------------
1606 HANDLE hConsoleInput
,
1607 PINPUT_RECORD lpBuffer
,
1609 LPDWORD lpNumberOfEventsRead
1612 return IntPeekConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1613 lpNumberOfEventsRead
, FALSE
);
1617 /*--------------------------------------------------------------
1625 HANDLE hConsoleInput
,
1626 PINPUT_RECORD lpBuffer
,
1628 LPDWORD lpNumberOfEventsRead
1631 return IntPeekConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1632 lpNumberOfEventsRead
, TRUE
);
1637 IntReadConsoleInput(HANDLE hConsoleInput
,
1638 PINPUT_RECORD lpBuffer
,
1640 LPDWORD lpNumberOfEventsRead
,
1643 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1648 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
1649 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1650 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
1655 Status
= CsrClientCallServer(&Request
, NULL
,
1657 sizeof(CSR_API_MESSAGE
));
1658 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1662 /* we couldn't read a single record, fail */
1663 SetLastErrorByStatus(Status
);
1668 /* FIXME - fail gracefully in case we already read at least one record? */
1672 else if(Status
== STATUS_PENDING
)
1676 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
1677 if(!NT_SUCCESS(Status
))
1679 SetLastErrorByStatus(Status
);
1685 /* nothing more to read (waiting for more input??), let's just bail */
1691 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
1694 if(!Request
.Data
.ReadInputRequest
.MoreEvents
)
1696 /* nothing more to read, bail */
1702 if(lpNumberOfEventsRead
!= NULL
)
1704 *lpNumberOfEventsRead
= Read
;
1711 /*--------------------------------------------------------------
1717 ReadConsoleInputA(HANDLE hConsoleInput
,
1718 PINPUT_RECORD lpBuffer
,
1720 LPDWORD lpNumberOfEventsRead
)
1722 return IntReadConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1723 lpNumberOfEventsRead
, FALSE
);
1727 /*--------------------------------------------------------------
1735 HANDLE hConsoleInput
,
1736 PINPUT_RECORD lpBuffer
,
1738 LPDWORD lpNumberOfEventsRead
1741 return IntReadConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1742 lpNumberOfEventsRead
, TRUE
);
1747 IntWriteConsoleInput(HANDLE hConsoleInput
,
1748 PINPUT_RECORD lpBuffer
,
1750 LPDWORD lpNumberOfEventsWritten
,
1753 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1755 PVOID BufferBase
, BufferTargetBase
;
1759 if(lpBuffer
== NULL
)
1761 SetLastError(ERROR_INVALID_PARAMETER
);
1765 Size
= nLength
* sizeof(INPUT_RECORD
);
1767 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1768 if(!NT_SUCCESS(Status
))
1770 SetLastErrorByStatus(Status
);
1774 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_INPUT
, CSR_CONSOLE
);
1775 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1776 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
1777 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
1778 Request
.Data
.WriteConsoleInputRequest
.InputRecord
= (PINPUT_RECORD
)BufferTargetBase
;
1780 Status
= CsrClientCallServer(&Request
, NULL
,
1782 sizeof(CSR_API_MESSAGE
));
1784 CsrReleaseParameterBuffer(BufferBase
);
1786 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1788 SetLastErrorByStatus(Status
);
1792 if(lpNumberOfEventsWritten
!= NULL
)
1794 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
1801 /*--------------------------------------------------------------
1802 * WriteConsoleInputA
1809 HANDLE hConsoleInput
,
1810 CONST INPUT_RECORD
*lpBuffer
,
1812 LPDWORD lpNumberOfEventsWritten
1815 return IntWriteConsoleInput(hConsoleInput
,
1816 (PINPUT_RECORD
)lpBuffer
,
1818 lpNumberOfEventsWritten
,
1823 /*--------------------------------------------------------------
1824 * WriteConsoleInputW
1831 HANDLE hConsoleInput
,
1832 CONST INPUT_RECORD
*lpBuffer
,
1834 LPDWORD lpNumberOfEventsWritten
1837 return IntWriteConsoleInput(hConsoleInput
,
1838 (PINPUT_RECORD
)lpBuffer
,
1840 lpNumberOfEventsWritten
,
1846 IntReadConsoleOutput(HANDLE hConsoleOutput
,
1847 PCHAR_INFO lpBuffer
,
1849 COORD dwBufferCoord
,
1850 PSMALL_RECT lpReadRegion
,
1853 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1856 PVOID BufferTargetBase
;
1858 DWORD Size
, SizeX
, SizeY
;
1860 if(lpBuffer
== NULL
)
1862 SetLastError(ERROR_INVALID_PARAMETER
);
1866 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
1868 Status
= CsrCaptureParameterBuffer(NULL
, Size
, &BufferBase
, &BufferTargetBase
);
1869 if(!NT_SUCCESS(Status
))
1871 SetLastErrorByStatus(Status
);
1875 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
1876 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1877 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
1878 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1879 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1880 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
1881 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
= (PCHAR_INFO
)BufferTargetBase
;
1883 Status
= CsrClientCallServer(&Request
,
1886 sizeof(CSR_API_MESSAGE
));
1888 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1890 SetLastErrorByStatus(Status
);
1891 CsrReleaseParameterBuffer(BufferBase
);
1895 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
- Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
1896 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
- Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
1898 memcpy(lpBuffer
, BufferBase
, sizeof(CHAR_INFO
) * SizeX
* SizeY
);
1900 CsrReleaseParameterBuffer(BufferBase
);
1902 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
1907 /*--------------------------------------------------------------
1908 * ReadConsoleOutputA
1915 HANDLE hConsoleOutput
,
1916 PCHAR_INFO lpBuffer
,
1918 COORD dwBufferCoord
,
1919 PSMALL_RECT lpReadRegion
1922 return IntReadConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
1923 dwBufferCoord
, lpReadRegion
, FALSE
);
1927 /*--------------------------------------------------------------
1928 * ReadConsoleOutputW
1935 HANDLE hConsoleOutput
,
1936 PCHAR_INFO lpBuffer
,
1938 COORD dwBufferCoord
,
1939 PSMALL_RECT lpReadRegion
1942 return IntReadConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
1943 dwBufferCoord
, lpReadRegion
, TRUE
);
1948 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
1949 CONST CHAR_INFO
*lpBuffer
,
1951 COORD dwBufferCoord
,
1952 PSMALL_RECT lpWriteRegion
,
1955 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1959 PVOID BufferTargetBase
;
1961 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
1963 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
,
1967 if (!NT_SUCCESS(Status
))
1969 SetLastErrorByStatus(Status
);
1973 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
1974 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1975 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
1976 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1977 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1978 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
1979 Request
.Data
.WriteConsoleOutputRequest
.CharInfo
=
1980 (CHAR_INFO
*)BufferTargetBase
;
1982 Status
= CsrClientCallServer(&Request
,
1985 sizeof(CSR_API_MESSAGE
));
1987 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1989 CsrReleaseParameterBuffer(BufferBase
);
1990 SetLastErrorByStatus(Status
);
1994 CsrReleaseParameterBuffer(BufferBase
);
1996 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
2001 /*--------------------------------------------------------------
2002 * WriteConsoleOutputA
2007 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2008 CONST CHAR_INFO
*lpBuffer
,
2010 COORD dwBufferCoord
,
2011 PSMALL_RECT lpWriteRegion
)
2013 return IntWriteConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
2014 dwBufferCoord
, lpWriteRegion
, FALSE
);
2018 /*--------------------------------------------------------------
2019 * WriteConsoleOutputW
2025 WriteConsoleOutputW(
2026 HANDLE hConsoleOutput
,
2027 CONST CHAR_INFO
*lpBuffer
,
2029 COORD dwBufferCoord
,
2030 PSMALL_RECT lpWriteRegion
2033 return IntWriteConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
2034 dwBufferCoord
, lpWriteRegion
, TRUE
);
2039 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2043 LPDWORD lpNumberOfCharsRead
,
2046 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2048 ULONG nChars
, SizeBytes
, CharSize
;
2049 DWORD CharsRead
= 0;
2051 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2053 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2054 SizeBytes
= nChars
* CharSize
;
2056 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2057 max(sizeof(CSR_API_MESSAGE
),
2058 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
)
2059 + min (nChars
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2060 if (Request
== NULL
)
2062 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2066 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2067 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2068 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2069 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2075 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2076 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2078 Status
= CsrClientCallServer(Request
,
2081 max (sizeof(CSR_API_MESSAGE
),
2082 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2083 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2085 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2086 SetLastErrorByStatus(Status
);
2090 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2091 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2092 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2093 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2094 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2096 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2099 if(lpNumberOfCharsRead
!= NULL
)
2101 *lpNumberOfCharsRead
= CharsRead
;
2104 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2110 /*--------------------------------------------------------------
2111 * ReadConsoleOutputCharacterA
2117 ReadConsoleOutputCharacterA(
2118 HANDLE hConsoleOutput
,
2122 LPDWORD lpNumberOfCharsRead
2125 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2129 lpNumberOfCharsRead
,
2134 /*--------------------------------------------------------------
2135 * ReadConsoleOutputCharacterW
2141 ReadConsoleOutputCharacterW(
2142 HANDLE hConsoleOutput
,
2146 LPDWORD lpNumberOfCharsRead
2149 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2153 lpNumberOfCharsRead
,
2158 /*--------------------------------------------------------------
2159 * ReadConsoleOutputAttribute
2165 ReadConsoleOutputAttribute(
2166 HANDLE hConsoleOutput
,
2170 LPDWORD lpNumberOfAttrsRead
2173 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2177 if (lpNumberOfAttrsRead
!= NULL
)
2178 *lpNumberOfAttrsRead
= nLength
;
2180 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2181 max(sizeof(CSR_API_MESSAGE
),
2182 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
2183 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2184 if (Request
== NULL
)
2186 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2190 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2191 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2192 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2194 while (nLength
!= 0)
2196 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2197 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2201 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2203 Status
= CsrClientCallServer(Request
,
2206 max (sizeof(CSR_API_MESSAGE
),
2207 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2208 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2210 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2211 SetLastErrorByStatus(Status
);
2215 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2216 lpAttribute
+= Size
;
2218 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2221 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2228 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2232 LPDWORD lpNumberOfCharsWritten
,
2235 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2237 ULONG SizeBytes
, CharSize
, nChars
;
2240 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2242 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2243 SizeBytes
= nChars
* CharSize
;
2245 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2246 max (sizeof(CSR_API_MESSAGE
),
2247 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
2248 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2249 if (Request
== NULL
)
2251 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2255 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2256 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2257 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2258 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2264 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= min(nLength
, nChars
);
2265 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2267 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2269 Status
= CsrClientCallServer(Request
,
2272 max (sizeof(CSR_API_MESSAGE
),
2273 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
2275 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2277 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2278 SetLastErrorByStatus(Status
);
2282 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2283 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2284 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2286 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2289 if(lpNumberOfCharsWritten
!= NULL
)
2291 *lpNumberOfCharsWritten
= Written
;
2294 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2300 /*--------------------------------------------------------------
2301 * WriteConsoleOutputCharacterA
2306 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2310 LPDWORD lpNumberOfCharsWritten
)
2312 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2316 lpNumberOfCharsWritten
,
2321 /*--------------------------------------------------------------
2322 * WriteConsoleOutputCharacterW
2327 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2328 LPCWSTR lpCharacter
,
2331 LPDWORD lpNumberOfCharsWritten
)
2333 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2337 lpNumberOfCharsWritten
,
2342 /*--------------------------------------------------------------
2343 * WriteConsoleOutputAttribute
2349 WriteConsoleOutputAttribute(
2350 HANDLE hConsoleOutput
,
2351 CONST WORD
*lpAttribute
,
2354 LPDWORD lpNumberOfAttrsWritten
2357 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2361 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2362 max (sizeof(CSR_API_MESSAGE
),
2363 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
2364 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2365 if (Request
== NULL
)
2367 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2371 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2372 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2373 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2374 if( lpNumberOfAttrsWritten
)
2375 *lpNumberOfAttrsWritten
= nLength
;
2378 Size
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2379 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2380 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2382 Status
= CsrClientCallServer( Request
,
2385 max (sizeof(CSR_API_MESSAGE
),
2386 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2388 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
->Status
) )
2390 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2391 SetLastErrorByStatus ( Status
);
2395 lpAttribute
+= Size
;
2396 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2399 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2405 /*--------------------------------------------------------------
2406 * FillConsoleOutputAttribute
2412 FillConsoleOutputAttribute(
2413 HANDLE hConsoleOutput
,
2417 LPDWORD lpNumberOfAttrsWritten
2420 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2424 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2425 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2426 Request
.Data
.FillOutputAttribRequest
.Attribute
= wAttribute
;
2427 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2428 Request
.Data
.FillOutputAttribRequest
.Length
= nLength
;
2429 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2430 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2432 SetLastErrorByStatus ( Status
);
2435 if( lpNumberOfAttrsWritten
)
2436 *lpNumberOfAttrsWritten
= nLength
;
2441 /*--------------------------------------------------------------
2449 HANDLE hConsoleHandle
,
2453 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2457 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2458 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2459 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2460 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2462 SetLastErrorByStatus ( Status
);
2465 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2470 /*--------------------------------------------------------------
2471 * GetNumberOfConsoleInputEvents
2477 GetNumberOfConsoleInputEvents(
2478 HANDLE hConsoleInput
,
2479 LPDWORD lpNumberOfEvents
2482 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2486 if(lpNumberOfEvents
== NULL
)
2488 SetLastError(ERROR_INVALID_PARAMETER
);
2492 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2493 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2494 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2495 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2497 SetLastErrorByStatus(Status
);
2501 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2507 /*--------------------------------------------------------------
2508 * GetLargestConsoleWindowSize
2514 GetLargestConsoleWindowSize(
2515 HANDLE hConsoleOutput
2518 COORD Coord
= {80,25};
2519 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2520 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2525 /*--------------------------------------------------------------
2526 * GetConsoleCursorInfo
2532 GetConsoleCursorInfo(
2533 HANDLE hConsoleOutput
,
2534 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
2537 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2541 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2542 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2543 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2545 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2547 SetLastErrorByStatus ( Status
);
2550 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2555 /*--------------------------------------------------------------
2556 * GetNumberOfConsoleMouseButtons
2562 GetNumberOfConsoleMouseButtons(
2563 LPDWORD lpNumberOfMouseButtons
2566 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2567 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2572 /*--------------------------------------------------------------
2580 HANDLE hConsoleHandle
,
2584 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2588 if (!IsConsoleHandle (hConsoleHandle
))
2590 DPRINT("SetConsoleMode was called with a non console handle\n");
2591 SetLastError (ERROR_INVALID_PARAMETER
);
2596 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
2597 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2598 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2599 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2600 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2602 SetLastErrorByStatus ( Status
);
2609 /*--------------------------------------------------------------
2610 * SetConsoleActiveScreenBuffer
2616 SetConsoleActiveScreenBuffer(
2617 HANDLE hConsoleOutput
2620 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2624 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
2625 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
2626 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2627 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2629 SetLastErrorByStatus ( Status
);
2636 /*--------------------------------------------------------------
2637 * FlushConsoleInputBuffer
2643 FlushConsoleInputBuffer(
2644 HANDLE hConsoleInput
2647 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2651 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
2652 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
2653 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2654 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2656 SetLastErrorByStatus ( Status
);
2663 /*--------------------------------------------------------------
2664 * SetConsoleScreenBufferSize
2670 SetConsoleScreenBufferSize(
2671 HANDLE hConsoleOutput
,
2675 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
2676 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2680 /*--------------------------------------------------------------
2681 * SetConsoleCursorInfo
2687 SetConsoleCursorInfo(
2688 HANDLE hConsoleOutput
,
2689 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
2692 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2696 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
2697 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2698 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
2699 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2701 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2703 SetLastErrorByStatus ( Status
);
2711 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
2712 PSMALL_RECT lpScrollRectangle
,
2713 PSMALL_RECT lpClipRectangle
,
2714 COORD dwDestinationOrigin
,
2718 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2722 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
2723 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
2724 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
2725 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
2727 if(lpClipRectangle
!= NULL
)
2729 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
2730 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
2734 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
2737 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
2738 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
2739 Status
= CsrClientCallServer(&Request
, NULL
,
2741 sizeof(CSR_API_MESSAGE
));
2743 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2745 SetLastErrorByStatus(Status
);
2753 /*--------------------------------------------------------------
2754 * ScrollConsoleScreenBufferA
2760 ScrollConsoleScreenBufferA(
2761 HANDLE hConsoleOutput
,
2762 CONST SMALL_RECT
*lpScrollRectangle
,
2763 CONST SMALL_RECT
*lpClipRectangle
,
2764 COORD dwDestinationOrigin
,
2765 CONST CHAR_INFO
*lpFill
2768 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2769 (PSMALL_RECT
)lpScrollRectangle
,
2770 (PSMALL_RECT
)lpClipRectangle
,
2771 dwDestinationOrigin
,
2777 /*--------------------------------------------------------------
2778 * ScrollConsoleScreenBufferW
2784 ScrollConsoleScreenBufferW(
2785 HANDLE hConsoleOutput
,
2786 CONST SMALL_RECT
*lpScrollRectangle
,
2787 CONST SMALL_RECT
*lpClipRectangle
,
2788 COORD dwDestinationOrigin
,
2789 CONST CHAR_INFO
*lpFill
2792 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2793 (PSMALL_RECT
)lpScrollRectangle
,
2794 (PSMALL_RECT
)lpClipRectangle
,
2795 dwDestinationOrigin
,
2801 /*--------------------------------------------------------------
2802 * SetConsoleWindowInfo
2808 SetConsoleWindowInfo(
2809 HANDLE hConsoleOutput
,
2811 CONST SMALL_RECT
*lpConsoleWindow
2814 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
2815 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2820 /*--------------------------------------------------------------
2821 * SetConsoleTextAttribute
2827 SetConsoleTextAttribute(
2828 HANDLE hConsoleOutput
,
2832 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2836 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
2837 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2838 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
2839 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2840 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2842 SetLastErrorByStatus ( Status
);
2850 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2852 if (HandlerRoutine
== NULL
)
2854 IgnoreCtrlEvents
= TRUE
;
2860 if (CtrlHandlers
== NULL
)
2862 CtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
2863 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2867 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
2868 (PVOID
)CtrlHandlers
,
2869 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2871 if (CtrlHandlers
== NULL
)
2874 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2877 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
2884 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2888 if (HandlerRoutine
== NULL
)
2890 IgnoreCtrlEvents
= FALSE
;
2895 for (i
= 0; i
< NrCtrlHandlers
; i
++)
2897 if ( ((void*)(CtrlHandlers
[i
])) == (void*)HandlerRoutine
)
2900 memmove(CtrlHandlers
+ i
, CtrlHandlers
+ i
+ 1,
2901 (NrCtrlHandlers
- i
) * sizeof(PHANDLER_ROUTINE
));
2903 RtlReAllocateHeap(RtlGetProcessHeap(),
2905 (PVOID
)CtrlHandlers
,
2906 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2919 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
2924 RtlEnterCriticalSection(&DllLock
);
2927 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
2931 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
2933 RtlLeaveCriticalSection(&DllLock
);
2938 /*--------------------------------------------------------------
2939 * GenerateConsoleCtrlEvent
2944 GenerateConsoleCtrlEvent(
2946 DWORD dwProcessGroupId
2949 DPRINT1("GenerateConsoleCtrlEvent(0x%x, 0x%x) UNIMPLEMENTED!\n", dwCtrlEvent
, dwProcessGroupId
);
2950 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2955 /*--------------------------------------------------------------
2963 LPWSTR lpConsoleTitle
,
2967 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2971 hConsole
= CreateFileW(L
"CONIN$", GENERIC_READ
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2972 if (hConsole
== INVALID_HANDLE_VALUE
)
2977 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2978 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
2979 if (Request
== NULL
)
2981 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2985 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
2986 Request
->Data
.GetTitleRequest
.ConsoleHandle
= hConsole
;
2988 Status
= CsrClientCallServer(Request
,
2991 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
2992 CloseHandle(hConsole
);
2993 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
->Status
)))
2995 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2996 SetLastErrorByStatus(Status
);
3000 if(nSize
* sizeof(WCHAR
) < Request
->Data
.GetTitleRequest
.Length
)
3002 wcsncpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
, nSize
- 1);
3003 lpConsoleTitle
[nSize
--] = L
'\0';
3007 nSize
= Request
->Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
3008 wcscpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
);
3009 lpConsoleTitle
[nSize
] = L
'\0';
3012 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3018 /*--------------------------------------------------------------
3028 LPSTR lpConsoleTitle
,
3032 wchar_t WideTitle
[CSRSS_MAX_TITLE_LENGTH
];
3033 DWORD nWideTitle
= sizeof WideTitle
;
3036 if (!lpConsoleTitle
|| !nSize
) return 0;
3037 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
3038 if (!nWideTitle
) return 0;
3040 if ( (nWritten
= WideCharToMultiByte(
3041 CP_ACP
, // ANSI code page
3042 0, // performance and mapping flags
3043 (LPWSTR
) WideTitle
, // address of wide-character string
3044 nWideTitle
, // number of characters in string
3045 lpConsoleTitle
, // address of buffer for new string
3046 nSize
, // size of buffer
3051 lpConsoleTitle
[nWritten
] = '\0';
3059 /*--------------------------------------------------------------
3067 LPCWSTR lpConsoleTitle
3070 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3075 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
3076 if (hConsole
== INVALID_HANDLE_VALUE
)
3081 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3082 max (sizeof(CSR_API_MESSAGE
),
3083 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3084 min (wcslen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3085 if (Request
== NULL
)
3087 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3091 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3092 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
3094 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
3095 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3096 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3097 Status
= CsrClientCallServer(Request
,
3100 max (sizeof(CSR_API_MESSAGE
), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3101 CloseHandle(hConsole
);
3102 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Request
->Status
) )
3104 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3105 SetLastErrorByStatus (Status
);
3109 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3115 /*--------------------------------------------------------------
3125 LPCSTR lpConsoleTitle
3128 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3133 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
3134 if (hConsole
== INVALID_HANDLE_VALUE
)
3139 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3140 max (sizeof(CSR_API_MESSAGE
),
3141 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3142 min (strlen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3143 if (Request
== NULL
)
3145 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3149 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3150 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
3152 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
3153 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3154 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3155 Status
= CsrClientCallServer(Request
,
3158 max (sizeof(CSR_API_MESSAGE
), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3159 CloseHandle(hConsole
);
3160 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Request
->Status
) )
3162 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3163 SetLastErrorByStatus (Status
);
3167 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3173 /*--------------------------------------------------------------
3174 * CreateConsoleScreenBuffer
3180 CreateConsoleScreenBuffer(
3181 DWORD dwDesiredAccess
,
3183 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3185 LPVOID lpScreenBufferData
3188 // FIXME: don't ignore access, share mode, and security
3189 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3193 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3194 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3195 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
3197 SetLastErrorByStatus ( Status
);
3200 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3204 /*--------------------------------------------------------------
3211 GetConsoleCP( VOID
)
3213 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3217 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3218 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3219 sizeof(CSR_API_MESSAGE
));
3220 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3222 SetLastErrorByStatus (Status
);
3225 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3229 /*--------------------------------------------------------------
3240 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3244 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3245 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3246 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3247 sizeof(CSR_API_MESSAGE
));
3248 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3250 SetLastErrorByStatus (Status
);
3252 return NT_SUCCESS(Status
);
3256 /*--------------------------------------------------------------
3257 * GetConsoleOutputCP
3263 GetConsoleOutputCP( VOID
)
3265 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3269 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3270 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3271 sizeof(CSR_API_MESSAGE
));
3272 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3274 SetLastErrorByStatus (Status
);
3277 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3281 /*--------------------------------------------------------------
3282 * SetConsoleOutputCP
3292 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3296 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3297 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3298 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3299 sizeof(CSR_API_MESSAGE
));
3300 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3302 SetLastErrorByStatus (Status
);
3304 return NT_SUCCESS(Status
);
3308 /*--------------------------------------------------------------
3309 * GetConsoleProcessList
3314 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3315 DWORD dwProcessCount
)
3317 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3321 if(lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3323 SetLastError(ERROR_INVALID_PARAMETER
);
3327 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3328 max (sizeof(CSR_API_MESSAGE
),
3329 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3330 + min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
)) * sizeof(DWORD
)));
3331 if (Request
== NULL
)
3333 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3337 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3338 Request
->Data
.GetProcessListRequest
.nMaxIds
= min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
));
3340 Status
= CsrClientCallServer(Request
,
3343 max (sizeof(CSR_API_MESSAGE
),
3344 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3345 + Request
->Data
.GetProcessListRequest
.nMaxIds
* sizeof(DWORD
)));
3346 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3348 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3349 SetLastErrorByStatus (Status
);
3354 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
;
3355 if(dwProcessCount
>= nProcesses
)
3357 memcpy(lpdwProcessList
, Request
->Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3361 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3368 /*--------------------------------------------------------------
3369 * GetConsoleSelectionInfo
3374 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3376 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3377 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3383 /*--------------------------------------------------------------
3389 AttachConsole(DWORD dwProcessId
)
3391 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3392 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3396 /*--------------------------------------------------------------
3402 GetConsoleWindow (VOID
)
3404 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3408 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3409 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3410 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3412 SetLastErrorByStatus (Status
);
3415 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3419 /*--------------------------------------------------------------
3424 BOOL STDCALL
SetConsoleIcon(HICON hicon
)
3426 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3430 CsrRequest
= MAKE_CSR_API<