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
;
1549 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1553 if(lpBuffer
== NULL
)
1555 SetLastError(ERROR_INVALID_PARAMETER
);
1559 Size
= nLength
* sizeof(INPUT_RECORD
);
1561 /* Allocate a Capture Buffer */
1562 DPRINT("IntPeekConsoleInput: %lx %p\n", Size
, lpNumberOfEventsRead
);
1563 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1565 /* Allocate space in the Buffer */
1566 CsrCaptureMessageBuffer(CaptureBuffer
,
1569 (PVOID
*)&Request
.Data
.PeekConsoleInputRequest
.InputRecord
);
1571 /* Set up the data to send to the Console Server */
1572 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1573 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1574 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1575 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1577 /* Call the server */
1578 Status
= CsrClientCallServer(&Request
,
1581 sizeof(CSR_API_MESSAGE
));
1582 DPRINT("Server returned: %x\n", Request
.Status
);
1584 /* Check for success*/
1585 if (NT_SUCCESS(Request
.Status
))
1587 /* Return the number of events read */
1588 DPRINT("Events read: %lx\n", Request
.Data
.PeekConsoleInputRequest
.Length
);
1589 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1591 /* Copy into the buffer */
1592 DPRINT("Copying to buffer\n");
1593 RtlCopyMemory(lpBuffer
,
1594 Request
.Data
.PeekConsoleInputRequest
.InputRecord
,
1595 sizeof(INPUT_RECORD
) * *lpNumberOfEventsRead
);
1600 *lpNumberOfEventsRead
= 0;
1601 SetLastErrorByStatus(Request
.Status
);
1604 /* Release the capture buffer */
1605 CsrFreeCaptureBuffer(CaptureBuffer
);
1607 /* Return TRUE or FALSE */
1608 return NT_SUCCESS(Request
.Status
);
1611 /*--------------------------------------------------------------
1619 HANDLE hConsoleInput
,
1620 PINPUT_RECORD lpBuffer
,
1622 LPDWORD lpNumberOfEventsRead
1625 return IntPeekConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1626 lpNumberOfEventsRead
, FALSE
);
1630 /*--------------------------------------------------------------
1638 HANDLE hConsoleInput
,
1639 PINPUT_RECORD lpBuffer
,
1641 LPDWORD lpNumberOfEventsRead
1644 return IntPeekConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1645 lpNumberOfEventsRead
, TRUE
);
1650 IntReadConsoleInput(HANDLE hConsoleInput
,
1651 PINPUT_RECORD lpBuffer
,
1653 LPDWORD lpNumberOfEventsRead
,
1656 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1661 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
1662 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1663 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
1668 Status
= CsrClientCallServer(&Request
, NULL
,
1670 sizeof(CSR_API_MESSAGE
));
1671 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1675 /* we couldn't read a single record, fail */
1676 SetLastErrorByStatus(Status
);
1681 /* FIXME - fail gracefully in case we already read at least one record? */
1685 else if(Status
== STATUS_PENDING
)
1689 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
1690 if(!NT_SUCCESS(Status
))
1692 SetLastErrorByStatus(Status
);
1698 /* nothing more to read (waiting for more input??), let's just bail */
1704 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
1707 if(!Request
.Data
.ReadInputRequest
.MoreEvents
)
1709 /* nothing more to read, bail */
1715 if(lpNumberOfEventsRead
!= NULL
)
1717 *lpNumberOfEventsRead
= Read
;
1724 /*--------------------------------------------------------------
1730 ReadConsoleInputA(HANDLE hConsoleInput
,
1731 PINPUT_RECORD lpBuffer
,
1733 LPDWORD lpNumberOfEventsRead
)
1735 return IntReadConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1736 lpNumberOfEventsRead
, FALSE
);
1740 /*--------------------------------------------------------------
1748 HANDLE hConsoleInput
,
1749 PINPUT_RECORD lpBuffer
,
1751 LPDWORD lpNumberOfEventsRead
1754 return IntReadConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1755 lpNumberOfEventsRead
, TRUE
);
1760 IntWriteConsoleInput(HANDLE hConsoleInput
,
1761 PINPUT_RECORD lpBuffer
,
1763 LPDWORD lpNumberOfEventsWritten
,
1766 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1767 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1771 if(lpBuffer
== NULL
)
1773 SetLastError(ERROR_INVALID_PARAMETER
);
1777 Size
= nLength
* sizeof(INPUT_RECORD
);
1779 /* Allocate a Capture Buffer */
1780 DPRINT("IntWriteConsoleInput: %lx %p\n", Size
, lpNumberOfEventsWritten
);
1781 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1783 /* Allocate space in the Buffer */
1784 CsrCaptureMessageBuffer(CaptureBuffer
,
1787 (PVOID
*)&Request
.Data
.WriteConsoleInputRequest
.InputRecord
);
1789 /* Set up the data to send to the Console Server */
1790 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_INPUT
, CSR_CONSOLE
);
1791 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1792 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
1793 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
1795 /* Call the server */
1796 Status
= CsrClientCallServer(&Request
,
1799 sizeof(CSR_API_MESSAGE
));
1800 DPRINT("Server returned: %x\n", Request
.Status
);
1802 /* Check for success*/
1803 if (NT_SUCCESS(Request
.Status
))
1805 /* Return the number of events read */
1806 DPRINT("Events read: %lx\n", Request
.Data
.WriteConsoleInputRequest
.Length
);
1807 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
1809 /* Copy into the buffer */
1810 DPRINT("Copying to buffer\n");
1811 RtlCopyMemory(lpBuffer
,
1812 Request
.Data
.WriteConsoleInputRequest
.InputRecord
,
1813 sizeof(INPUT_RECORD
) * *lpNumberOfEventsWritten
);
1818 *lpNumberOfEventsWritten
= 0;
1819 SetLastErrorByStatus(Request
.Status
);
1822 /* Release the capture buffer */
1823 CsrFreeCaptureBuffer(CaptureBuffer
);
1825 /* Return TRUE or FALSE */
1826 return NT_SUCCESS(Request
.Status
);
1830 /*--------------------------------------------------------------
1831 * WriteConsoleInputA
1838 HANDLE hConsoleInput
,
1839 CONST INPUT_RECORD
*lpBuffer
,
1841 LPDWORD lpNumberOfEventsWritten
1844 return IntWriteConsoleInput(hConsoleInput
,
1845 (PINPUT_RECORD
)lpBuffer
,
1847 lpNumberOfEventsWritten
,
1852 /*--------------------------------------------------------------
1853 * WriteConsoleInputW
1860 HANDLE hConsoleInput
,
1861 CONST INPUT_RECORD
*lpBuffer
,
1863 LPDWORD lpNumberOfEventsWritten
1866 return IntWriteConsoleInput(hConsoleInput
,
1867 (PINPUT_RECORD
)lpBuffer
,
1869 lpNumberOfEventsWritten
,
1875 IntReadConsoleOutput(HANDLE hConsoleOutput
,
1876 PCHAR_INFO lpBuffer
,
1878 COORD dwBufferCoord
,
1879 PSMALL_RECT lpReadRegion
,
1882 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1883 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1885 DWORD Size
, SizeX
, SizeY
;
1887 if(lpBuffer
== NULL
)
1889 SetLastError(ERROR_INVALID_PARAMETER
);
1893 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
1895 /* Allocate a Capture Buffer */
1896 DPRINT("IntReadConsoleOutput: %lx %p\n", Size
, lpReadRegion
);
1897 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1899 /* Allocate space in the Buffer */
1900 CsrCaptureMessageBuffer(CaptureBuffer
,
1903 (PVOID
*)&Request
.Data
.ReadConsoleOutputRequest
.CharInfo
);
1905 /* Set up the data to send to the Console Server */
1906 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
1907 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1908 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
1909 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1910 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1911 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
1913 /* Call the server */
1914 Status
= CsrClientCallServer(&Request
,
1917 sizeof(CSR_API_MESSAGE
));
1918 DPRINT("Server returned: %x\n", Request
.Status
);
1920 /* Check for success*/
1921 if (NT_SUCCESS(Request
.Status
))
1923 /* Copy into the buffer */
1924 DPRINT("Copying to buffer\n");
1925 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
-
1926 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
1927 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
-
1928 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
1929 RtlCopyMemory(lpBuffer
,
1930 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
,
1931 sizeof(CHAR_INFO
) * SizeX
* SizeY
);
1936 SetLastErrorByStatus(Request
.Status
);
1939 /* Return the read region */
1940 DPRINT("read region: %lx\n", Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
);
1941 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
1943 /* Release the capture buffer */
1944 CsrFreeCaptureBuffer(CaptureBuffer
);
1946 /* Return TRUE or FALSE */
1947 return NT_SUCCESS(Request
.Status
);
1950 /*--------------------------------------------------------------
1951 * ReadConsoleOutputA
1958 HANDLE hConsoleOutput
,
1959 PCHAR_INFO lpBuffer
,
1961 COORD dwBufferCoord
,
1962 PSMALL_RECT lpReadRegion
1965 return IntReadConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
1966 dwBufferCoord
, lpReadRegion
, FALSE
);
1970 /*--------------------------------------------------------------
1971 * ReadConsoleOutputW
1978 HANDLE hConsoleOutput
,
1979 PCHAR_INFO lpBuffer
,
1981 COORD dwBufferCoord
,
1982 PSMALL_RECT lpReadRegion
1985 return IntReadConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
1986 dwBufferCoord
, lpReadRegion
, TRUE
);
1991 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
1992 CONST CHAR_INFO
*lpBuffer
,
1994 COORD dwBufferCoord
,
1995 PSMALL_RECT lpWriteRegion
,
1998 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1999 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2003 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
2005 /* Allocate a Capture Buffer */
2006 DPRINT("IntWriteConsoleOutput: %lx %p\n", Size
, lpWriteRegion
);
2007 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2009 /* Allocate space in the Buffer */
2010 CsrCaptureMessageBuffer(CaptureBuffer
,
2013 (PVOID
*)&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
);
2015 /* Copy from the buffer */
2016 RtlCopyMemory(&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
, lpBuffer
, Size
);
2018 /* Set up the data to send to the Console Server */
2019 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2020 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2021 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
2022 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2023 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2024 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
2026 /* Call the server */
2027 Status
= CsrClientCallServer(&Request
,
2030 sizeof(CSR_API_MESSAGE
));
2031 DPRINT("Server returned: %x\n", Request
.Status
);
2033 /* Check for success*/
2034 if (!NT_SUCCESS(Request
.Status
))
2037 SetLastErrorByStatus(Request
.Status
);
2040 /* Return the read region */
2041 DPRINT("read region: %lx\n", Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
);
2042 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
2044 /* Release the capture buffer */
2045 CsrFreeCaptureBuffer(CaptureBuffer
);
2047 /* Return TRUE or FALSE */
2048 return NT_SUCCESS(Request
.Status
);
2051 /*--------------------------------------------------------------
2052 * WriteConsoleOutputA
2057 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2058 CONST CHAR_INFO
*lpBuffer
,
2060 COORD dwBufferCoord
,
2061 PSMALL_RECT lpWriteRegion
)
2063 return IntWriteConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
2064 dwBufferCoord
, lpWriteRegion
, FALSE
);
2068 /*--------------------------------------------------------------
2069 * WriteConsoleOutputW
2075 WriteConsoleOutputW(
2076 HANDLE hConsoleOutput
,
2077 CONST CHAR_INFO
*lpBuffer
,
2079 COORD dwBufferCoord
,
2080 PSMALL_RECT lpWriteRegion
2083 return IntWriteConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
2084 dwBufferCoord
, lpWriteRegion
, TRUE
);
2089 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2093 LPDWORD lpNumberOfCharsRead
,
2096 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2098 ULONG nChars
, SizeBytes
, CharSize
;
2099 DWORD CharsRead
= 0;
2101 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2103 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2104 SizeBytes
= nChars
* CharSize
;
2106 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2107 max(sizeof(CSR_API_MESSAGE
),
2108 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
)
2109 + min (nChars
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2110 if (Request
== NULL
)
2112 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2116 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2117 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2118 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2119 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2125 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2126 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2128 Status
= CsrClientCallServer(Request
,
2131 max (sizeof(CSR_API_MESSAGE
),
2132 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2133 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2135 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2136 SetLastErrorByStatus(Status
);
2140 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2141 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2142 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2143 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2144 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2146 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2149 if(lpNumberOfCharsRead
!= NULL
)
2151 *lpNumberOfCharsRead
= CharsRead
;
2154 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2160 /*--------------------------------------------------------------
2161 * ReadConsoleOutputCharacterA
2167 ReadConsoleOutputCharacterA(
2168 HANDLE hConsoleOutput
,
2172 LPDWORD lpNumberOfCharsRead
2175 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2179 lpNumberOfCharsRead
,
2184 /*--------------------------------------------------------------
2185 * ReadConsoleOutputCharacterW
2191 ReadConsoleOutputCharacterW(
2192 HANDLE hConsoleOutput
,
2196 LPDWORD lpNumberOfCharsRead
2199 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2203 lpNumberOfCharsRead
,
2208 /*--------------------------------------------------------------
2209 * ReadConsoleOutputAttribute
2215 ReadConsoleOutputAttribute(
2216 HANDLE hConsoleOutput
,
2220 LPDWORD lpNumberOfAttrsRead
2223 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2227 if (lpNumberOfAttrsRead
!= NULL
)
2228 *lpNumberOfAttrsRead
= nLength
;
2230 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2231 max(sizeof(CSR_API_MESSAGE
),
2232 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
2233 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2234 if (Request
== NULL
)
2236 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2240 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2241 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2242 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2244 while (nLength
!= 0)
2246 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2247 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2251 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2253 Status
= CsrClientCallServer(Request
,
2256 max (sizeof(CSR_API_MESSAGE
),
2257 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2258 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2260 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2261 SetLastErrorByStatus(Status
);
2265 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2266 lpAttribute
+= Size
;
2268 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2271 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2278 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2282 LPDWORD lpNumberOfCharsWritten
,
2285 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2287 ULONG SizeBytes
, CharSize
, nChars
;
2290 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2292 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2293 SizeBytes
= nChars
* CharSize
;
2295 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2296 max (sizeof(CSR_API_MESSAGE
),
2297 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
2298 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2299 if (Request
== NULL
)
2301 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2305 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2306 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2307 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2308 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2314 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= min(nLength
, nChars
);
2315 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2317 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2319 Status
= CsrClientCallServer(Request
,
2322 max (sizeof(CSR_API_MESSAGE
),
2323 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
2325 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2327 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2328 SetLastErrorByStatus(Status
);
2332 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2333 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2334 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2336 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2339 if(lpNumberOfCharsWritten
!= NULL
)
2341 *lpNumberOfCharsWritten
= Written
;
2344 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2350 /*--------------------------------------------------------------
2351 * WriteConsoleOutputCharacterA
2356 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2360 LPDWORD lpNumberOfCharsWritten
)
2362 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2366 lpNumberOfCharsWritten
,
2371 /*--------------------------------------------------------------
2372 * WriteConsoleOutputCharacterW
2377 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2378 LPCWSTR lpCharacter
,
2381 LPDWORD lpNumberOfCharsWritten
)
2383 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2387 lpNumberOfCharsWritten
,
2392 /*--------------------------------------------------------------
2393 * WriteConsoleOutputAttribute
2399 WriteConsoleOutputAttribute(
2400 HANDLE hConsoleOutput
,
2401 CONST WORD
*lpAttribute
,
2404 LPDWORD lpNumberOfAttrsWritten
2407 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2411 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2412 max (sizeof(CSR_API_MESSAGE
),
2413 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
2414 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2415 if (Request
== NULL
)
2417 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2421 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2422 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2423 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2424 if( lpNumberOfAttrsWritten
)
2425 *lpNumberOfAttrsWritten
= nLength
;
2428 Size
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2429 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2430 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2432 Status
= CsrClientCallServer( Request
,
2435 max (sizeof(CSR_API_MESSAGE
),
2436 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2438 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
->Status
) )
2440 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2441 SetLastErrorByStatus ( Status
);
2445 lpAttribute
+= Size
;
2446 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2449 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2455 /*--------------------------------------------------------------
2456 * FillConsoleOutputAttribute
2462 FillConsoleOutputAttribute(
2463 HANDLE hConsoleOutput
,
2467 LPDWORD lpNumberOfAttrsWritten
2470 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2474 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2475 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2476 Request
.Data
.FillOutputAttribRequest
.Attribute
= wAttribute
;
2477 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2478 Request
.Data
.FillOutputAttribRequest
.Length
= nLength
;
2479 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2480 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2482 SetLastErrorByStatus ( Status
);
2485 if( lpNumberOfAttrsWritten
)
2486 *lpNumberOfAttrsWritten
= nLength
;
2491 /*--------------------------------------------------------------
2499 HANDLE hConsoleHandle
,
2503 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2507 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2508 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2509 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2510 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2512 SetLastErrorByStatus ( Status
);
2515 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2520 /*--------------------------------------------------------------
2521 * GetNumberOfConsoleInputEvents
2527 GetNumberOfConsoleInputEvents(
2528 HANDLE hConsoleInput
,
2529 LPDWORD lpNumberOfEvents
2532 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2536 if(lpNumberOfEvents
== NULL
)
2538 SetLastError(ERROR_INVALID_PARAMETER
);
2542 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2543 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2544 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2545 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2547 SetLastErrorByStatus(Status
);
2551 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2557 /*--------------------------------------------------------------
2558 * GetLargestConsoleWindowSize
2564 GetLargestConsoleWindowSize(
2565 HANDLE hConsoleOutput
2568 COORD Coord
= {80,25};
2569 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2570 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2575 /*--------------------------------------------------------------
2576 * GetConsoleCursorInfo
2582 GetConsoleCursorInfo(
2583 HANDLE hConsoleOutput
,
2584 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
2587 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2591 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2592 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2593 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2595 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2597 SetLastErrorByStatus ( Status
);
2600 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2605 /*--------------------------------------------------------------
2606 * GetNumberOfConsoleMouseButtons
2612 GetNumberOfConsoleMouseButtons(
2613 LPDWORD lpNumberOfMouseButtons
2616 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2617 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2622 /*--------------------------------------------------------------
2630 HANDLE hConsoleHandle
,
2634 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2638 if (!IsConsoleHandle (hConsoleHandle
))
2640 DPRINT("SetConsoleMode was called with a non console handle\n");
2641 SetLastError (ERROR_INVALID_PARAMETER
);
2646 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
2647 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2648 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2649 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2650 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2652 SetLastErrorByStatus ( Status
);
2659 /*--------------------------------------------------------------
2660 * SetConsoleActiveScreenBuffer
2666 SetConsoleActiveScreenBuffer(
2667 HANDLE hConsoleOutput
2670 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2674 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
2675 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
2676 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2677 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2679 SetLastErrorByStatus ( Status
);
2686 /*--------------------------------------------------------------
2687 * FlushConsoleInputBuffer
2693 FlushConsoleInputBuffer(
2694 HANDLE hConsoleInput
2697 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2701 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
2702 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
2703 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2704 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2706 SetLastErrorByStatus ( Status
);
2713 /*--------------------------------------------------------------
2714 * SetConsoleScreenBufferSize
2720 SetConsoleScreenBufferSize(
2721 HANDLE hConsoleOutput
,
2725 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
2726 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2730 /*--------------------------------------------------------------
2731 * SetConsoleCursorInfo
2737 SetConsoleCursorInfo(
2738 HANDLE hConsoleOutput
,
2739 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
2742 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2746 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
2747 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2748 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
2749 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2751 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2753 SetLastErrorByStatus ( Status
);
2761 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
2762 PSMALL_RECT lpScrollRectangle
,
2763 PSMALL_RECT lpClipRectangle
,
2764 COORD dwDestinationOrigin
,
2768 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2772 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
2773 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
2774 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
2775 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
2777 if(lpClipRectangle
!= NULL
)
2779 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
2780 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
2784 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
2787 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
2788 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
2789 Status
= CsrClientCallServer(&Request
, NULL
,
2791 sizeof(CSR_API_MESSAGE
));
2793 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2795 SetLastErrorByStatus(Status
);
2803 /*--------------------------------------------------------------
2804 * ScrollConsoleScreenBufferA
2810 ScrollConsoleScreenBufferA(
2811 HANDLE hConsoleOutput
,
2812 CONST SMALL_RECT
*lpScrollRectangle
,
2813 CONST SMALL_RECT
*lpClipRectangle
,
2814 COORD dwDestinationOrigin
,
2815 CONST CHAR_INFO
*lpFill
2818 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2819 (PSMALL_RECT
)lpScrollRectangle
,
2820 (PSMALL_RECT
)lpClipRectangle
,
2821 dwDestinationOrigin
,
2827 /*--------------------------------------------------------------
2828 * ScrollConsoleScreenBufferW
2834 ScrollConsoleScreenBufferW(
2835 HANDLE hConsoleOutput
,
2836 CONST SMALL_RECT
*lpScrollRectangle
,
2837 CONST SMALL_RECT
*lpClipRectangle
,
2838 COORD dwDestinationOrigin
,
2839 CONST CHAR_INFO
*lpFill
2842 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2843 (PSMALL_RECT
)lpScrollRectangle
,
2844 (PSMALL_RECT
)lpClipRectangle
,
2845 dwDestinationOrigin
,
2851 /*--------------------------------------------------------------
2852 * SetConsoleWindowInfo
2858 SetConsoleWindowInfo(
2859 HANDLE hConsoleOutput
,
2861 CONST SMALL_RECT
*lpConsoleWindow
2864 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
2865 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2870 /*--------------------------------------------------------------
2871 * SetConsoleTextAttribute
2877 SetConsoleTextAttribute(
2878 HANDLE hConsoleOutput
,
2882 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2886 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
2887 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2888 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
2889 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2890 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2892 SetLastErrorByStatus ( Status
);
2900 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2902 if (HandlerRoutine
== NULL
)
2904 IgnoreCtrlEvents
= TRUE
;
2910 if (CtrlHandlers
== NULL
)
2912 CtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
2913 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2917 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
2918 (PVOID
)CtrlHandlers
,
2919 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2921 if (CtrlHandlers
== NULL
)
2924 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2927 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
2934 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2938 if (HandlerRoutine
== NULL
)
2940 IgnoreCtrlEvents
= FALSE
;
2945 for (i
= 0; i
< NrCtrlHandlers
; i
++)
2947 if ( ((void*)(CtrlHandlers
[i
])) == (void*)HandlerRoutine
)
2950 memmove(CtrlHandlers
+ i
, CtrlHandlers
+ i
+ 1,
2951 (NrCtrlHandlers
- i
) * sizeof(PHANDLER_ROUTINE
));
2953 RtlReAllocateHeap(RtlGetProcessHeap(),
2955 (PVOID
)CtrlHandlers
,
2956 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2969 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
2974 RtlEnterCriticalSection(&DllLock
);
2977 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
2981 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
2983 RtlLeaveCriticalSection(&DllLock
);
2988 /*--------------------------------------------------------------
2989 * GenerateConsoleCtrlEvent
2994 GenerateConsoleCtrlEvent(
2996 DWORD dwProcessGroupId
2999 DPRINT1("GenerateConsoleCtrlEvent(0x%x, 0x%x) UNIMPLEMENTED!\n", dwCtrlEvent
, dwProcessGroupId
);
3000 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3005 /*--------------------------------------------------------------
3013 LPWSTR lpConsoleTitle
,
3017 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3021 hConsole
= CreateFileW(L
"CONIN$", GENERIC_READ
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
3022 if (hConsole
== INVALID_HANDLE_VALUE
)
3027 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3028 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3029 if (Request
== NULL
)
3031 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3035 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
3036 Request
->Data
.GetTitleRequest
.ConsoleHandle
= hConsole
;
3038 Status
= CsrClientCallServer(Request
,
3041 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3042 CloseHandle(hConsole
);
3043 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
->Status
)))
3045 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3046 SetLastErrorByStatus(Status
);
3050 if(nSize
* sizeof(WCHAR
) <= Request
->Data
.GetTitleRequest
.Length
)
3056 nSize
= Request
->Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
3058 memcpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
, nSize
* sizeof(WCHAR
));
3059 lpConsoleTitle
[nSize
] = L
'\0';
3061 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3067 /*--------------------------------------------------------------
3077 LPSTR lpConsoleTitle
,
3081 WCHAR WideTitle
[CSRSS_MAX_TITLE_LENGTH
+ 1];
3082 DWORD nWideTitle
= CSRSS_MAX_TITLE_LENGTH
+ 1;
3085 if (!lpConsoleTitle
|| !nSize
) return 0;
3086 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
3087 if (!nWideTitle
) return 0;
3089 if ( (nWritten
= WideCharToMultiByte(
3090 CP_ACP
, // ANSI code page
3091 0, // performance and mapping flags
3092 (LPWSTR
) WideTitle
, // address of wide-character string
3093 nWideTitle
, // number of characters in string
3094 lpConsoleTitle
, // address of buffer for new string
3095 nSize
- 1, // size of buffer
3100 lpConsoleTitle
[nWritten
] = '\0';
3108 /*--------------------------------------------------------------
3116 LPCWSTR lpConsoleTitle
3119 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3124 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
3125 if (hConsole
== INVALID_HANDLE_VALUE
)
3130 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3131 max (sizeof(CSR_API_MESSAGE
),
3132 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3133 min (wcslen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3134 if (Request
== NULL
)
3136 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3140 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3141 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
3143 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
3144 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3145 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3146 Status
= CsrClientCallServer(Request
,
3149 max (sizeof(CSR_API_MESSAGE
), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3150 CloseHandle(hConsole
);
3151 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Request
->Status
) )
3153 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3154 SetLastErrorByStatus (Status
);
3158 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3164 /*--------------------------------------------------------------
3174 LPCSTR lpConsoleTitle
3177 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3182 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
3183 if (hConsole
== INVALID_HANDLE_VALUE
)
3188 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3189 max (sizeof(CSR_API_MESSAGE
),
3190 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) +
3191 min (strlen(lpConsoleTitle
), CSRSS_MAX_TITLE_LENGTH
) * sizeof(WCHAR
)));
3192 if (Request
== NULL
)
3194 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3198 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3199 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
3201 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
3202 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3203 Request
->Data
.SetTitleRequest
.Length
= c
* sizeof(WCHAR
);
3204 Status
= CsrClientCallServer(Request
,
3207 max (sizeof(CSR_API_MESSAGE
), CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE
) + c
* sizeof(WCHAR
)));
3208 CloseHandle(hConsole
);
3209 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Request
->Status
) )
3211 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3212 SetLastErrorByStatus (Status
);
3216 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3222 /*--------------------------------------------------------------
3223 * CreateConsoleScreenBuffer
3229 CreateConsoleScreenBuffer(
3230 DWORD dwDesiredAccess
,
3232 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3234 LPVOID lpScreenBufferData
3237 // FIXME: don't ignore access, share mode, and security
3238 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3242 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3243 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3244 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
3246 SetLastErrorByStatus ( Status
);
3249 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3253 /*--------------------------------------------------------------
3260 GetConsoleCP( VOID
)
3262 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3266 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3267 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3268 sizeof(CSR_API_MESSAGE
));
3269 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3271 SetLastErrorByStatus (Status
);
3274 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3278 /*--------------------------------------------------------------
3289 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3293 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3294 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3295 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3296 sizeof(CSR_API_MESSAGE
));
3297 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3299 SetLastErrorByStatus (Status
);
3301 return NT_SUCCESS(Status
);
3305 /*--------------------------------------------------------------
3306 * GetConsoleOutputCP
3312 GetConsoleOutputCP( VOID
)
3314 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3318 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3319 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3320 sizeof(CSR_API_MESSAGE
));
3321 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3323 SetLastErrorByStatus (Status
);
3326 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3330 /*--------------------------------------------------------------
3331 * SetConsoleOutputCP
3341 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3345 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3346 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3347 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3348 sizeof(CSR_API_MESSAGE
));
3349 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3351 SetLastErrorByStatus (Status
);
3353 return NT_SUCCESS(Status
);
3357 /*--------------------------------------------------------------
3358 * GetConsoleProcessList
3363 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3364 DWORD dwProcessCount
)
3366 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3370 if(lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3372 SetLastError(ERROR_INVALID_PARAMETER
);
3376 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
3377 max (sizeof(CSR_API_MESSAGE
),
3378 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3379 + min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
)) * sizeof(DWORD
)));
3380 if (Request
== NULL
)
3382 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3386 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3387 Request
->Data
.GetProcessListRequest
.nMaxIds
= min (dwProcessCount
, CSRSS_MAX_GET_PROCESS_LIST
/ sizeof(DWORD
));
3389 Status
= CsrClientCallServer(Request
,
3392 max (sizeof(CSR_API_MESSAGE
),
3393 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST
)
3394 + Request
->Data
.GetProcessListRequest
.nMaxIds
* sizeof(DWORD
)));
3395 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3397 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3398 SetLastErrorByStatus (Status
);
3403 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
;
3404 if(dwProcessCount
>= nProcesses
)
3406 memcpy(lpdwProcessList
, Request
->Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3410 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
3417 /*--------------------------------------------------------------
3418 * GetConsoleSelectionInfo
3423 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3425 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3426 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3432 /*--------------------------------------------------------------
3438 AttachConsole(DWORD dwProcessId
)
3440 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3441 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3445 /*--------------------------------------------------------------
3451 GetConsoleWindow (VOID
)
3453 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3457 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3458 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3459 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3461 SetLastErrorByStatus (Status
);
3464 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3468 /*--------------------------------------------------------------
3473 BOOL STDCALL
SetConsoleIcon(HICON hicon
)
3475 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3479 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3480 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3481 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3482 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3484 SetLastErrorByStatus (Status
);
3487 return NT_SUCCESS(Status
);
3491 /*--------------------------------------------------------------
3492 * SetConsoleInputExeNameW
3497 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3500 int lenName
= lstrlenW(lpInputExeName
);
3503 lenName
> (int)(sizeof(InputExeName
) / sizeof(InputExeName
[0])) - 1)
3505 /* Fail if string is empty or too long */
3506 SetLastError(ERROR_INVALID_PARAMETER
);
3510 RtlEnterCriticalSection(&ConsoleLock
);
3511 /* wrap copying into SEH as we may copy from invalid buffer and in case of an
3512 exception the console lock would've never been released, which would cause
3513 further calls (if the exception was handled by the caller) to recursively
3514 acquire the lock... */
3517 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3518 InputExeName
[lenName
] = L
'\0';
3524 SetLastErrorByStatus(_SEH_GetExceptionCode());
3527 RtlLeaveCriticalSection(&ConsoleLock
);
3533 /*--------------------------------------------------------------
3534 * SetConsoleInputExeNameA
3539 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3541 ANSI_STRING InputExeNameA
;
3542 UNICODE_STRING InputExeNameU
;
3546 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3548 if(InputExeNameA
.Length
< sizeof(InputExeNameA
.Buffer
[0]) ||
3549 InputExeNameA
.Length
>= (sizeof(InputExeName
) / sizeof(InputExeName
[0])) - 1)
3551 /* Fail if string is empty or too long */
3552 SetLastError(ERROR_INVALID_PARAMETER
);
3556 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, TRUE
);
3557 if(NT_SUCCESS(Status
))
3559 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3560 RtlFreeUnicodeString(&InputExeNameU
);
3564 SetLastErrorByStatus(Status
);
3572 /*--------------------------------------------------------------
3573 * GetConsoleInputExeNameW
3578 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3582 RtlEnterCriticalSection(&ConsoleLock
);
3584 lenName
= lstrlenW(InputExeName
);
3585 if(lenName
>= (int)nBufferLength
)
3587 /* buffer is not large enough, return the required size */
3588 RtlLeaveCriticalSection(&ConsoleLock
);
3592 /* wrap copying into SEH as we may copy to invalid buffer and in case of an
3593 exception the console lock would've never been released, which would cause
3594 further calls (if the exception was handled by the caller) to recursively
3595 acquire the lock... */
3598 RtlCopyMemory(lpBuffer
, InputExeName
, (lenName
+ 1) * sizeof(WCHAR
));
3603 SetLastErrorByStatus(_SEH_GetExceptionCode());
3607 RtlLeaveCriticalSection(&ConsoleLock
);
3613 /*--------------------------------------------------------------
3614 * GetConsoleInputExeNameA
3619 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
3624 if(nBufferLength
> 0)
3626 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0, nBufferLength
* sizeof(WCHAR
));
3629 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3638 Ret
= GetConsoleInputExeNameW(nBufferLength
, Buffer
);
3639 if(nBufferLength
> 0)
3643 UNICODE_STRING BufferU
;
3644 ANSI_STRING BufferA
;
3646 RtlInitUnicodeString(&BufferU
, Buffer
);
3649 BufferA
.MaximumLength
= nBufferLength
;
3650 BufferA
.Buffer
= lpBuffer
;
3652 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
3655 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
3662 /*--------------------------------------------------------------
3663 * GetConsoleHistoryInfo
3668 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
3670 DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
3671 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3676 /*--------------------------------------------------------------
3677 * SetConsoleHistoryInfo
3682 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo
)
3684 DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo
);
3685 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3690 /*--------------------------------------------------------------
3691 * GetConsoleOriginalTitleW
3696 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle
,
3699 DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
3700 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3705 /*--------------------------------------------------------------
3706 * GetConsoleOriginalTitleA
3711 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle
,
3714 DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle
, nSize
);
3715 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3720 /*--------------------------------------------------------------
3721 * GetConsoleScreenBufferInfoEx
3726 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
3727 OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
3729 DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
3730 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3735 /*--------------------------------------------------------------
3736 * SetConsoleScreenBufferInfoEx
3741 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput
,
3742 IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
)
3744 DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, lpConsoleScreenBufferInfoEx
);
3745 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3750 /*--------------------------------------------------------------
3751 * GetCurrentConsoleFontEx
3756 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput
,
3757 IN BOOL bMaximumWindow
,
3758 OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
)
3760 DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFontEx
);
3761 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);