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
->ProcessGroup
& 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
->ProcessGroup
& 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 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
524 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
533 GetConsoleHardwareState (HANDLE hConsole
,
540 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
544 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
545 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
546 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
548 Status
= CsrClientCallServer(& Request
,
551 sizeof(CSR_API_MESSAGE
));
552 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
554 SetLastErrorByStatus(Status
);
557 *State
= Request
.Data
.ConsoleHardwareStateRequest
.State
;
566 GetConsoleInputWaitHandle (VOID
)
571 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
575 CsrRequest
= MAKE_CSR_API(GET_INPUT_WAIT_HANDLE
, CSR_CONSOLE
);
576 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
577 sizeof(CSR_API_MESSAGE
));
578 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
580 SetLastErrorByStatus(Status
);
583 return (DWORD
) Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
591 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
593 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
595 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
596 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
605 GetNumberOfConsoleFonts (VOID
)
610 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
611 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
612 return 1; /* FIXME: call csrss.exe */
620 InvalidateConsoleDIBits (DWORD Unknown0
,
626 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
627 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
636 OpenConsoleW (LPWSTR wsName
,
637 DWORD dwDesiredAccess
,
639 DWORD dwCreationDistribution
)
644 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
646 PHANDLE phConsole
= NULL
;
647 NTSTATUS Status
= STATUS_SUCCESS
;
649 if(0 == _wcsicmp(wsName
, L
"CONIN$"))
651 CsrRequest
= MAKE_CSR_API(GET_INPUT_HANDLE
, CSR_NATIVE
);
652 phConsole
= & Request
.Data
.GetInputHandleRequest
.InputHandle
;
654 else if (0 == _wcsicmp(wsName
, L
"CONOUT$"))
656 CsrRequest
= MAKE_CSR_API(GET_OUTPUT_HANDLE
, CSR_NATIVE
);
657 phConsole
= & Request
.Data
.GetOutputHandleRequest
.OutputHandle
;
661 SetLastError(ERROR_INVALID_PARAMETER
);
662 return(INVALID_HANDLE_VALUE
);
664 if ((GENERIC_READ
|GENERIC_WRITE
) != dwDesiredAccess
)
666 SetLastError(ERROR_INVALID_PARAMETER
);
667 return(INVALID_HANDLE_VALUE
);
669 if (OPEN_EXISTING
!= dwCreationDistribution
)
671 SetLastError(ERROR_INVALID_PARAMETER
);
672 return(INVALID_HANDLE_VALUE
);
674 Status
= CsrClientCallServer(& Request
,
677 sizeof(CSR_API_MESSAGE
));
678 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
680 SetLastErrorByStatus(Status
);
681 return INVALID_HANDLE_VALUE
;
691 SetConsoleCommandHistoryMode (DWORD dwMode
)
696 DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode
);
697 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
706 SetConsoleCursor (DWORD Unknown0
,
712 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
713 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
722 SetConsoleDisplayMode (HANDLE hOut
,
726 * FUNCTION: Set the console display mode.
728 * hOut - Standard output handle.
729 * dwNewMode - New mode.
730 * lpdwOldMode - Address of a variable that receives the old mode.
733 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
734 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
743 SetConsoleFont (DWORD Unknown0
,
749 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
750 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
759 SetConsoleHardwareState (HANDLE hConsole
,
766 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
770 CsrRequest
= MAKE_CSR_API(SETGET_CONSOLE_HW_STATE
, CSR_CONSOLE
);
771 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
772 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
773 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
775 Status
= CsrClientCallServer(& Request
,
778 sizeof(CSR_API_MESSAGE
));
779 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
781 SetLastErrorByStatus(Status
);
792 SetConsoleKeyShortcuts (DWORD Unknown0
,
800 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
801 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
810 SetConsoleMaximumWindowSize (DWORD Unknown0
,
816 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
817 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
826 SetConsoleMenuClose (DWORD Unknown0
)
831 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
832 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
841 SetConsoleNumberOfCommandsA (DWORD Unknown0
,
847 DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
848 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
857 SetConsoleNumberOfCommandsW (DWORD Unknown0
,
863 DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
864 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
873 SetConsolePalette (DWORD Unknown0
,
880 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
881 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
890 SetLastConsoleEventActive (VOID
)
895 DPRINT1("SetLastConsoleEventActive() UNIMPLEMENTED!\n");
896 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
905 ShowConsoleCursor (DWORD Unknown0
,
911 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
912 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
918 * FUNCTION: Checks whether the given handle is a valid console handle.
920 * Handle - Handle to be checked
922 * TRUE: Handle is a valid console handle
923 * FALSE: Handle is not a valid console handle.
924 * STATUS: Officially undocumented
929 VerifyConsoleIoHandle(HANDLE Handle
)
931 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
935 CsrRequest
= MAKE_CSR_API(VERIFY_HANDLE
, CSR_NATIVE
);
936 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
937 Status
= CsrClientCallServer(&Request
,
940 sizeof(CSR_API_MESSAGE
));
941 if (!NT_SUCCESS(Status
))
943 SetLastErrorByStatus(Status
);
947 return (BOOL
)NT_SUCCESS(Request
.Status
);
955 WriteConsoleInputVDMA (DWORD Unknown0
,
960 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
961 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
970 WriteConsoleInputVDMW (DWORD Unknown0
,
975 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
976 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
985 CloseConsoleHandle(HANDLE Handle
)
990 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
994 if (IsConsoleHandle (Handle
) == FALSE
)
996 SetLastError (ERROR_INVALID_PARAMETER
);
1000 CsrRequest
= MAKE_CSR_API(CLOSE_HANDLE
, CSR_NATIVE
);
1001 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
1002 Status
= CsrClientCallServer(&Request
,
1005 sizeof(CSR_API_MESSAGE
));
1006 if (!NT_SUCCESS(Status
))
1008 SetLastErrorByStatus(Status
);
1020 IsConsoleHandle(HANDLE Handle
)
1022 if ((((ULONG
)Handle
) & 0x10000003) == 0x3)
1034 GetStdHandle(DWORD nStdHandle
)
1036 * FUNCTION: Get a handle for the standard input, standard output
1037 * and a standard error device.
1039 * nStdHandle - Specifies the device for which to return the handle.
1040 * RETURNS: If the function succeeds, the return value is the handle
1041 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
1044 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1046 Ppb
= NtCurrentPeb()->ProcessParameters
;
1049 case STD_INPUT_HANDLE
:
1050 return Ppb
->hStdInput
;
1052 case STD_OUTPUT_HANDLE
:
1053 return Ppb
->hStdOutput
;
1055 case STD_ERROR_HANDLE
:
1056 return Ppb
->hStdError
;
1059 SetLastError (ERROR_INVALID_PARAMETER
);
1060 return INVALID_HANDLE_VALUE
;
1068 SetStdHandle(DWORD nStdHandle
,
1071 * FUNCTION: Set the handle for the standard input, standard output or
1072 * the standard error device.
1074 * nStdHandle - Specifies the handle to be set.
1075 * hHandle - The handle to set.
1076 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1079 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1081 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
1083 Ppb
= NtCurrentPeb()->ProcessParameters
;
1087 case STD_INPUT_HANDLE
:
1088 Ppb
->hStdInput
= hHandle
;
1091 case STD_OUTPUT_HANDLE
:
1092 Ppb
->hStdOutput
= hHandle
;
1095 case STD_ERROR_HANDLE
:
1096 Ppb
->hStdError
= hHandle
;
1100 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
1101 SetLastError (ERROR_INVALID_HANDLE
);
1107 IntWriteConsole(HANDLE hConsoleOutput
,
1109 DWORD nNumberOfCharsToWrite
,
1110 LPDWORD lpNumberOfCharsWritten
,
1114 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
1117 ULONG MessageSize
, BufferSize
, SizeBytes
, CharSize
;
1120 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1122 BufferSize
= sizeof(CSR_API_MESSAGE
) + min(nNumberOfCharsToWrite
* CharSize
, CSRSS_MAX_WRITE_CONSOLE
);
1123 Request
= RtlAllocateHeap(GetProcessHeap(), 0, BufferSize
);
1126 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1130 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE
, CSR_CONSOLE
);
1131 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1132 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1134 while(nNumberOfCharsToWrite
> 0)
1136 nChars
= min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
) / CharSize
;
1137 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1139 SizeBytes
= nChars
* CharSize
;
1141 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1143 MessageSize
= CSRSS_HEADER_SIZE
+ sizeof(CSRSS_WRITE_CONSOLE
) + SizeBytes
;
1144 Status
= CsrClientCallServer(Request
,
1149 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1151 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1152 SetLastErrorByStatus(Status
);
1156 nNumberOfCharsToWrite
-= nChars
;
1157 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1158 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
1161 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1163 if(lpNumberOfCharsWritten
!= NULL
)
1165 *lpNumberOfCharsWritten
= Written
;
1172 /*--------------------------------------------------------------
1178 WriteConsoleA(HANDLE hConsoleOutput
,
1179 CONST VOID
*lpBuffer
,
1180 DWORD nNumberOfCharsToWrite
,
1181 LPDWORD lpNumberOfCharsWritten
,
1184 return IntWriteConsole(hConsoleOutput
,
1186 nNumberOfCharsToWrite
,
1187 lpNumberOfCharsWritten
,
1193 /*--------------------------------------------------------------
1200 HANDLE hConsoleOutput
,
1201 CONST VOID
*lpBuffer
,
1202 DWORD nNumberOfCharsToWrite
,
1203 LPDWORD lpNumberOfCharsWritten
,
1207 return IntWriteConsole(hConsoleOutput
,
1209 nNumberOfCharsToWrite
,
1210 lpNumberOfCharsWritten
,
1217 IntReadConsole(HANDLE hConsoleInput
,
1219 DWORD nNumberOfCharsToRead
,
1220 LPDWORD lpNumberOfCharsRead
,
1224 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
1226 ULONG BufferSize
, CharSize
, CharsRead
= 0;
1228 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1230 BufferSize
= sizeof(CSR_API_MESSAGE
) + min(nNumberOfCharsToRead
* CharSize
, CSRSS_MAX_READ_CONSOLE
);
1231 Request
= RtlAllocateHeap(GetProcessHeap(), 0, BufferSize
);
1234 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1238 Request
->Status
= STATUS_SUCCESS
;
1242 if(Request
->Status
== STATUS_PENDING
)
1244 Status
= NtWaitForSingleObject(Request
->Data
.ReadConsoleRequest
.EventHandle
, FALSE
, 0);
1245 if(!NT_SUCCESS(Status
))
1247 DPRINT1("Wait for console input failed!\n");
1252 CsrRequest
= MAKE_CSR_API(READ_CONSOLE
, CSR_CONSOLE
);
1253 Request
->Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1254 Request
->Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1255 Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
= min(nNumberOfCharsToRead
, CSRSS_MAX_READ_CONSOLE
) / CharSize
;
1256 Request
->Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= CharsRead
;
1257 Status
= CsrClientCallServer(Request
,
1260 sizeof(CSR_API_MESSAGE
) + (Request
->Data
.ReadConsoleRequest
.NrCharactersToRead
* CharSize
));
1262 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1264 DPRINT1("CSR returned error in ReadConsole\n");
1265 SetLastErrorByStatus(Status
);
1266 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1270 nNumberOfCharsToRead
-= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1271 memcpy((PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)(CharsRead
* CharSize
)),
1272 Request
->Data
.ReadConsoleRequest
.Buffer
,
1273 Request
->Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1274 CharsRead
+= Request
->Data
.ReadConsoleRequest
.NrCharactersRead
;
1276 if(Request
->Status
== STATUS_NOTIFY_CLEANUP
)
1281 nNumberOfCharsToRead
++;
1283 Request
->Status
= STATUS_PENDING
;
1285 } while(Request
->Status
== STATUS_PENDING
&& nNumberOfCharsToRead
> 0);
1287 if(lpNumberOfCharsRead
!= NULL
)
1289 *lpNumberOfCharsRead
= CharsRead
;
1296 /*--------------------------------------------------------------
1302 ReadConsoleA(HANDLE hConsoleInput
,
1304 DWORD nNumberOfCharsToRead
,
1305 LPDWORD lpNumberOfCharsRead
,
1308 return IntReadConsole(hConsoleInput
,
1310 nNumberOfCharsToRead
,
1311 lpNumberOfCharsRead
,
1317 /*--------------------------------------------------------------
1323 ReadConsoleW(HANDLE hConsoleInput
,
1325 DWORD nNumberOfCharsToRead
,
1326 LPDWORD lpNumberOfCharsRead
,
1329 return IntReadConsole(hConsoleInput
,
1331 nNumberOfCharsToRead
,
1332 lpNumberOfCharsRead
,
1338 /*--------------------------------------------------------------
1343 BOOL STDCALL
AllocConsole(VOID
)
1345 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1350 if(NtCurrentPeb()->ProcessParameters
->hConsole
)
1352 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1353 SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS
);
1357 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1359 CsrRequest
= MAKE_CSR_API(ALLOC_CONSOLE
, CSR_CONSOLE
);
1360 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1361 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1363 SetLastErrorByStatus ( Status
);
1366 NtCurrentPeb()->ProcessParameters
->hConsole
= Request
.Data
.AllocConsoleRequest
.Console
;
1367 SetStdHandle( STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1368 SetStdHandle( STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1369 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1372 DUPLICATE_SAME_ACCESS
);
1373 SetStdHandle( STD_ERROR_HANDLE
, hStdError
);
1378 /*--------------------------------------------------------------
1383 BOOL STDCALL
FreeConsole(VOID
)
1385 // AG: I'm not sure if this is correct (what happens to std handles?)
1386 // but I just tried to reverse what AllocConsole() does...
1388 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1392 CsrRequest
= MAKE_CSR_API(FREE_CONSOLE
, CSR_CONSOLE
);
1393 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1394 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1396 SetLastErrorByStatus ( Status
);
1404 /*--------------------------------------------------------------
1405 * GetConsoleScreenBufferInfo
1411 GetConsoleScreenBufferInfo(
1412 HANDLE hConsoleOutput
,
1413 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
1416 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1420 CsrRequest
= MAKE_CSR_API(SCREEN_BUFFER_INFO
, CSR_CONSOLE
);
1421 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1422 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1423 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1425 SetLastErrorByStatus ( Status
);
1428 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1433 /*--------------------------------------------------------------
1434 * SetConsoleCursorPosition
1440 SetConsoleCursorPosition(
1441 HANDLE hConsoleOutput
,
1442 COORD dwCursorPosition
1445 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1449 CsrRequest
= MAKE_CSR_API(SET_CURSOR
, CSR_CONSOLE
);
1450 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1451 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1452 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
1453 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
1455 SetLastErrorByStatus ( Status
);
1463 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1467 LPDWORD lpNumberOfCharsWritten
,
1470 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1474 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT
, CSR_CONSOLE
);
1475 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1476 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1478 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1480 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1481 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1482 Request
.Data
.FillOutputRequest
.Length
= nLength
;
1483 Status
= CsrClientCallServer(&Request
, NULL
,
1485 sizeof(CSR_API_MESSAGE
));
1487 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1489 SetLastErrorByStatus(Status
);
1493 if(lpNumberOfCharsWritten
!= NULL
)
1495 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1501 /*--------------------------------------------------------------
1502 * FillConsoleOutputCharacterA
1507 FillConsoleOutputCharacterA(
1508 HANDLE hConsoleOutput
,
1512 LPDWORD lpNumberOfCharsWritten
1515 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1519 lpNumberOfCharsWritten
,
1524 /*--------------------------------------------------------------
1525 * FillConsoleOutputCharacterW
1531 FillConsoleOutputCharacterW(
1532 HANDLE hConsoleOutput
,
1536 LPDWORD lpNumberOfCharsWritten
1539 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1543 lpNumberOfCharsWritten
,
1549 IntPeekConsoleInput(HANDLE hConsoleInput
,
1550 PINPUT_RECORD lpBuffer
,
1552 LPDWORD lpNumberOfEventsRead
,
1555 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
1558 PVOID BufferTargetBase
;
1561 if(lpBuffer
== NULL
)
1563 SetLastError(ERROR_INVALID_PARAMETER
);
1567 Size
= nLength
* sizeof(INPUT_RECORD
);
1569 Status
= CsrCaptureParameterBuffer(NULL
, Size
, &BufferBase
, &BufferTargetBase
);
1570 if(!NT_SUCCESS(Status
))
1572 SetLastErrorByStatus(Status
);
1576 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSR_API_MESSAGE
));
1579 CsrReleaseParameterBuffer(BufferBase
);
1580 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1584 CsrRequest
= MAKE_CSR_API(PEEK_CONSOLE_INPUT
, CSR_CONSOLE
);
1585 Request
->Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1586 Request
->Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1587 Request
->Data
.PeekConsoleInputRequest
.Length
= nLength
;
1588 Request
->Data
.PeekConsoleInputRequest
.InputRecord
= (INPUT_RECORD
*)BufferTargetBase
;
1590 Status
= CsrClientCallServer(Request
, NULL
,
1592 sizeof(CSR_API_MESSAGE
));
1594 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1596 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1597 CsrReleaseParameterBuffer(BufferBase
);
1601 memcpy(lpBuffer
, BufferBase
, sizeof(INPUT_RECORD
) * Request
->Data
.PeekConsoleInputRequest
.Length
);
1603 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1604 CsrReleaseParameterBuffer(BufferBase
);
1606 if(lpNumberOfEventsRead
!= NULL
)
1608 *lpNumberOfEventsRead
= Request
->Data
.PeekConsoleInputRequest
.Length
;
1614 /*--------------------------------------------------------------
1622 HANDLE hConsoleInput
,
1623 PINPUT_RECORD lpBuffer
,
1625 LPDWORD lpNumberOfEventsRead
1628 return IntPeekConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1629 lpNumberOfEventsRead
, FALSE
);
1633 /*--------------------------------------------------------------
1641 HANDLE hConsoleInput
,
1642 PINPUT_RECORD lpBuffer
,
1644 LPDWORD lpNumberOfEventsRead
1647 return IntPeekConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1648 lpNumberOfEventsRead
, TRUE
);
1653 IntReadConsoleInput(HANDLE hConsoleInput
,
1654 PINPUT_RECORD lpBuffer
,
1656 LPDWORD lpNumberOfEventsRead
,
1659 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1664 CsrRequest
= MAKE_CSR_API(READ_INPUT
, CSR_CONSOLE
);
1665 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1666 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
1671 Status
= CsrClientCallServer(&Request
, NULL
,
1673 sizeof(CSR_API_MESSAGE
));
1674 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1678 /* we couldn't read a single record, fail */
1679 SetLastErrorByStatus(Status
);
1684 /* FIXME - fail gracefully in case we already read at least one record? */
1688 else if(Status
== STATUS_PENDING
)
1692 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
1693 if(!NT_SUCCESS(Status
))
1695 SetLastErrorByStatus(Status
);
1701 /* nothing more to read (waiting for more input??), let's just bail */
1707 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
1710 if(!Request
.Data
.ReadInputRequest
.MoreEvents
)
1712 /* nothing more to read, bail */
1718 if(lpNumberOfEventsRead
!= NULL
)
1720 *lpNumberOfEventsRead
= Read
;
1727 /*--------------------------------------------------------------
1733 ReadConsoleInputA(HANDLE hConsoleInput
,
1734 PINPUT_RECORD lpBuffer
,
1736 LPDWORD lpNumberOfEventsRead
)
1738 return IntReadConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1739 lpNumberOfEventsRead
, FALSE
);
1743 /*--------------------------------------------------------------
1751 HANDLE hConsoleInput
,
1752 PINPUT_RECORD lpBuffer
,
1754 LPDWORD lpNumberOfEventsRead
1757 return IntReadConsoleInput(hConsoleInput
, lpBuffer
, nLength
,
1758 lpNumberOfEventsRead
, TRUE
);
1763 IntWriteConsoleInput(HANDLE hConsoleInput
,
1764 PINPUT_RECORD lpBuffer
,
1766 LPDWORD lpNumberOfEventsWritten
,
1769 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
1771 PVOID BufferBase
, BufferTargetBase
;
1775 if(lpBuffer
== NULL
)
1777 SetLastError(ERROR_INVALID_PARAMETER
);
1781 Size
= nLength
* sizeof(INPUT_RECORD
);
1783 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1784 if(!NT_SUCCESS(Status
))
1786 SetLastErrorByStatus(Status
);
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
;
1794 Request
.Data
.WriteConsoleInputRequest
.InputRecord
= (PINPUT_RECORD
)BufferTargetBase
;
1796 Status
= CsrClientCallServer(&Request
, NULL
,
1798 sizeof(CSR_API_MESSAGE
));
1800 CsrReleaseParameterBuffer(BufferBase
);
1802 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1804 SetLastErrorByStatus(Status
);
1808 if(lpNumberOfEventsWritten
!= NULL
)
1810 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
1817 /*--------------------------------------------------------------
1818 * WriteConsoleInputA
1825 HANDLE hConsoleInput
,
1826 CONST INPUT_RECORD
*lpBuffer
,
1828 LPDWORD lpNumberOfEventsWritten
1831 return IntWriteConsoleInput(hConsoleInput
,
1832 (PINPUT_RECORD
)lpBuffer
,
1834 lpNumberOfEventsWritten
,
1839 /*--------------------------------------------------------------
1840 * WriteConsoleInputW
1847 HANDLE hConsoleInput
,
1848 CONST INPUT_RECORD
*lpBuffer
,
1850 LPDWORD lpNumberOfEventsWritten
1853 return IntWriteConsoleInput(hConsoleInput
,
1854 (PINPUT_RECORD
)lpBuffer
,
1856 lpNumberOfEventsWritten
,
1862 IntReadConsoleOutput(HANDLE hConsoleOutput
,
1863 PCHAR_INFO lpBuffer
,
1865 COORD dwBufferCoord
,
1866 PSMALL_RECT lpReadRegion
,
1869 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
1872 PVOID BufferTargetBase
;
1874 DWORD Size
, SizeX
, SizeY
;
1876 if(lpBuffer
== NULL
)
1878 SetLastError(ERROR_INVALID_PARAMETER
);
1882 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
1884 Status
= CsrCaptureParameterBuffer(NULL
, Size
, &BufferBase
, &BufferTargetBase
);
1885 if(!NT_SUCCESS(Status
))
1887 SetLastErrorByStatus(Status
);
1891 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSR_API_MESSAGE
));
1894 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1895 CsrReleaseParameterBuffer(BufferBase
);
1899 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT
, CSR_CONSOLE
);
1900 Request
->Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1901 Request
->Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
1902 Request
->Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1903 Request
->Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1904 Request
->Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
1905 Request
->Data
.ReadConsoleOutputRequest
.CharInfo
= (PCHAR_INFO
)BufferTargetBase
;
1907 Status
= CsrClientCallServer(Request
, NULL
,
1909 sizeof(CSR_API_MESSAGE
));
1911 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1913 SetLastErrorByStatus(Status
);
1914 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1915 CsrReleaseParameterBuffer(BufferBase
);
1919 SizeX
= Request
->Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
- Request
->Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
1920 SizeY
= Request
->Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
- Request
->Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
1922 memcpy(lpBuffer
, BufferBase
, sizeof(CHAR_INFO
) * SizeX
* SizeY
);
1924 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1925 CsrReleaseParameterBuffer(BufferBase
);
1927 *lpReadRegion
= Request
->Data
.ReadConsoleOutputRequest
.ReadRegion
;
1932 /*--------------------------------------------------------------
1933 * ReadConsoleOutputA
1940 HANDLE hConsoleOutput
,
1941 PCHAR_INFO lpBuffer
,
1943 COORD dwBufferCoord
,
1944 PSMALL_RECT lpReadRegion
1947 return IntReadConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
1948 dwBufferCoord
, lpReadRegion
, FALSE
);
1952 /*--------------------------------------------------------------
1953 * ReadConsoleOutputW
1960 HANDLE hConsoleOutput
,
1961 PCHAR_INFO lpBuffer
,
1963 COORD dwBufferCoord
,
1964 PSMALL_RECT lpReadRegion
1967 return IntReadConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
1968 dwBufferCoord
, lpReadRegion
, TRUE
);
1973 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
1974 CONST CHAR_INFO
*lpBuffer
,
1976 COORD dwBufferCoord
,
1977 PSMALL_RECT lpWriteRegion
,
1980 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
1984 PVOID BufferTargetBase
;
1986 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
1988 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
,
1992 if (!NT_SUCCESS(Status
))
1994 SetLastErrorByStatus(Status
);
1998 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
,
1999 sizeof(CSR_API_MESSAGE
));
2000 if (Request
== NULL
)
2002 CsrReleaseParameterBuffer(BufferBase
);
2003 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2006 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT
, CSR_CONSOLE
);
2007 Request
->Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2008 Request
->Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
2009 Request
->Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2010 Request
->Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2011 Request
->Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
2012 Request
->Data
.WriteConsoleOutputRequest
.CharInfo
=
2013 (CHAR_INFO
*)BufferTargetBase
;
2015 Status
= CsrClientCallServer(Request
,
2018 sizeof(CSR_API_MESSAGE
));
2020 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2022 CsrReleaseParameterBuffer(BufferBase
);
2023 RtlFreeHeap(GetProcessHeap(), 0, Request
);
2024 SetLastErrorByStatus(Status
);
2028 RtlFreeHeap(GetProcessHeap(), 0, Request
);
2029 CsrReleaseParameterBuffer(BufferBase
);
2031 *lpWriteRegion
= Request
->Data
.WriteConsoleOutputRequest
.WriteRegion
;
2036 /*--------------------------------------------------------------
2037 * WriteConsoleOutputA
2042 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2043 CONST CHAR_INFO
*lpBuffer
,
2045 COORD dwBufferCoord
,
2046 PSMALL_RECT lpWriteRegion
)
2048 return IntWriteConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
2049 dwBufferCoord
, lpWriteRegion
, FALSE
);
2053 /*--------------------------------------------------------------
2054 * WriteConsoleOutputW
2060 WriteConsoleOutputW(
2061 HANDLE hConsoleOutput
,
2062 CONST CHAR_INFO
*lpBuffer
,
2064 COORD dwBufferCoord
,
2065 PSMALL_RECT lpWriteRegion
2068 return IntWriteConsoleOutput(hConsoleOutput
, lpBuffer
, dwBufferSize
,
2069 dwBufferCoord
, lpWriteRegion
, TRUE
);
2074 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2078 LPDWORD lpNumberOfCharsRead
,
2081 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2083 ULONG nChars
, SizeBytes
, CharSize
;
2084 DWORD CharsRead
= 0;
2086 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2088 nChars
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
) / CharSize
;
2089 SizeBytes
= nChars
* CharSize
;
2091 Request
= RtlAllocateHeap(GetProcessHeap(), 0,
2092 sizeof(CSR_API_MESSAGE
) + SizeBytes
);
2095 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2100 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2101 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2102 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2103 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2109 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= min(nLength
, nChars
);
2111 Status
= CsrClientCallServer(Request
,
2114 sizeof(CSR_API_MESSAGE
) + SizeBytes
);
2115 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2117 SetLastErrorByStatus(Status
);
2121 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2122 memcpy(lpCharacter
, &Request
->Data
.ReadConsoleOutputCharRequest
.String
[0], BytesRead
);
2123 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2124 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2125 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2127 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2130 RtlFreeHeap(GetProcessHeap(), 0, Request
);
2132 if(lpNumberOfCharsRead
!= NULL
)
2134 *lpNumberOfCharsRead
= CharsRead
;
2141 /*--------------------------------------------------------------
2142 * ReadConsoleOutputCharacterA
2148 ReadConsoleOutputCharacterA(
2149 HANDLE hConsoleOutput
,
2153 LPDWORD lpNumberOfCharsRead
2156 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2160 lpNumberOfCharsRead
,
2165 /*--------------------------------------------------------------
2166 * ReadConsoleOutputCharacterW
2172 ReadConsoleOutputCharacterW(
2173 HANDLE hConsoleOutput
,
2177 LPDWORD lpNumberOfCharsRead
2180 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2184 lpNumberOfCharsRead
,
2189 /*--------------------------------------------------------------
2190 * ReadConsoleOutputAttribute
2196 ReadConsoleOutputAttribute(
2197 HANDLE hConsoleOutput
,
2201 LPDWORD lpNumberOfAttrsRead
2204 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2208 Request
= RtlAllocateHeap(GetProcessHeap(), 0,
2209 sizeof(CSR_API_MESSAGE
) + min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
));
2210 if (Request
== NULL
)
2212 SetLastError(ERROR_OUTOFMEMORY
);
2216 if (lpNumberOfAttrsRead
!= NULL
)
2217 *lpNumberOfAttrsRead
= nLength
;
2219 CsrRequest
= MAKE_CSR_API(READ_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2220 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2221 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2223 while (nLength
!= 0)
2225 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
)
2226 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
;
2230 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2232 Status
= CsrClientCallServer(Request
,
2235 sizeof(CSR_API_MESSAGE
) + Size
);
2236 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2238 RtlFreeHeap(GetProcessHeap(), 0, Request
);
2239 SetLastErrorByStatus(Status
);
2243 // Convert CHARs to WORDs
2244 for(i
= 0; i
< Size
; ++i
)
2245 *lpAttribute
++ = Request
->Data
.ReadConsoleOutputAttribRequest
.String
[i
];
2248 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2251 RtlFreeHeap(GetProcessHeap(), 0, Request
);
2258 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2262 LPDWORD lpNumberOfCharsWritten
,
2265 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2267 ULONG SizeBytes
, CharSize
, nChars
;
2270 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2272 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE
) / CharSize
;
2273 SizeBytes
= nChars
* CharSize
;
2275 Request
= RtlAllocateHeap(GetProcessHeap(), 0,
2276 sizeof(CSR_API_MESSAGE
) + (nChars
* CharSize
));
2279 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2283 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_CHAR
, CSR_CONSOLE
);
2284 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2285 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2286 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2292 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= min(nLength
, nChars
);
2293 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2295 memcpy(&Request
->Data
.WriteConsoleOutputCharRequest
.String
[0], lpCharacter
, BytesWrite
);
2297 Status
= CsrClientCallServer(Request
,
2300 sizeof(CSR_API_MESSAGE
) + BytesWrite
);
2302 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2304 RtlFreeHeap(GetProcessHeap(), 0, Request
);
2305 SetLastErrorByStatus(Status
);
2309 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2310 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2311 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2313 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2316 RtlFreeHeap(GetProcessHeap(), 0, Request
);
2318 if(lpNumberOfCharsWritten
!= NULL
)
2320 *lpNumberOfCharsWritten
= Written
;
2327 /*--------------------------------------------------------------
2328 * WriteConsoleOutputCharacterA
2333 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2337 LPDWORD lpNumberOfCharsWritten
)
2339 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2343 lpNumberOfCharsWritten
,
2348 /*--------------------------------------------------------------
2349 * WriteConsoleOutputCharacterW
2354 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2355 LPCWSTR lpCharacter
,
2358 LPDWORD lpNumberOfCharsWritten
)
2360 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2364 lpNumberOfCharsWritten
,
2369 /*--------------------------------------------------------------
2370 * WriteConsoleOutputAttribute
2376 WriteConsoleOutputAttribute(
2377 HANDLE hConsoleOutput
,
2378 CONST WORD
*lpAttribute
,
2381 LPDWORD lpNumberOfAttrsWritten
2384 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2389 Request
= RtlAllocateHeap(GetProcessHeap(), 0,
2390 sizeof(CSR_API_MESSAGE
) +
2391 min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
));
2394 SetLastError( ERROR_OUTOFMEMORY
);
2397 CsrRequest
= MAKE_CSR_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2398 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2399 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2400 if( lpNumberOfAttrsWritten
)
2401 *lpNumberOfAttrsWritten
= nLength
;
2404 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
: nLength
;
2405 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2406 for( c
= 0; c
< Size
; c
++ )
2407 Request
->Data
.WriteConsoleOutputAttribRequest
.String
[c
] = (char)lpAttribute
[c
];
2408 Status
= CsrClientCallServer( Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) + (Size
* 2));
2409 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
->Status
) )
2411 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2412 SetLastErrorByStatus ( Status
);
2416 lpAttribute
+= Size
;
2417 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2420 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2425 /*--------------------------------------------------------------
2426 * FillConsoleOutputAttribute
2432 FillConsoleOutputAttribute(
2433 HANDLE hConsoleOutput
,
2437 LPDWORD lpNumberOfAttrsWritten
2440 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2444 CsrRequest
= MAKE_CSR_API(FILL_OUTPUT_ATTRIB
, CSR_CONSOLE
);
2445 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2446 Request
.Data
.FillOutputAttribRequest
.Attribute
= wAttribute
;
2447 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2448 Request
.Data
.FillOutputAttribRequest
.Length
= nLength
;
2449 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2450 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2452 SetLastErrorByStatus ( Status
);
2455 if( lpNumberOfAttrsWritten
)
2456 *lpNumberOfAttrsWritten
= nLength
;
2461 /*--------------------------------------------------------------
2469 HANDLE hConsoleHandle
,
2473 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2477 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_MODE
, CSR_CONSOLE
);
2478 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2479 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2480 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2482 SetLastErrorByStatus ( Status
);
2485 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2490 /*--------------------------------------------------------------
2491 * GetNumberOfConsoleInputEvents
2497 GetNumberOfConsoleInputEvents(
2498 HANDLE hConsoleInput
,
2499 LPDWORD lpNumberOfEvents
2502 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2506 if(lpNumberOfEvents
== NULL
)
2508 SetLastError(ERROR_INVALID_PARAMETER
);
2512 CsrRequest
= MAKE_CSR_API(GET_NUM_INPUT_EVENTS
, CSR_CONSOLE
);
2513 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2514 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
, sizeof(CSR_API_MESSAGE
));
2515 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2517 SetLastErrorByStatus(Status
);
2521 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2527 /*--------------------------------------------------------------
2528 * GetLargestConsoleWindowSize
2534 GetLargestConsoleWindowSize(
2535 HANDLE hConsoleOutput
2538 COORD Coord
= {80,25};
2539 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2540 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2545 /*--------------------------------------------------------------
2546 * GetConsoleCursorInfo
2552 GetConsoleCursorInfo(
2553 HANDLE hConsoleOutput
,
2554 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
2557 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2561 CsrRequest
= MAKE_CSR_API(GET_CURSOR_INFO
, CSR_CONSOLE
);
2562 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2563 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2565 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2567 SetLastErrorByStatus ( Status
);
2570 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2575 /*--------------------------------------------------------------
2576 * GetNumberOfConsoleMouseButtons
2582 GetNumberOfConsoleMouseButtons(
2583 LPDWORD lpNumberOfMouseButtons
2586 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2587 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2592 /*--------------------------------------------------------------
2600 HANDLE hConsoleHandle
,
2604 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2608 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_MODE
, CSR_CONSOLE
);
2609 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2610 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2611 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2612 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2614 SetLastErrorByStatus ( Status
);
2621 /*--------------------------------------------------------------
2622 * SetConsoleActiveScreenBuffer
2628 SetConsoleActiveScreenBuffer(
2629 HANDLE hConsoleOutput
2632 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2636 CsrRequest
= MAKE_CSR_API(SET_SCREEN_BUFFER
, CSR_CONSOLE
);
2637 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
2638 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2639 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2641 SetLastErrorByStatus ( Status
);
2648 /*--------------------------------------------------------------
2649 * FlushConsoleInputBuffer
2655 FlushConsoleInputBuffer(
2656 HANDLE hConsoleInput
2659 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2663 CsrRequest
= MAKE_CSR_API(FLUSH_INPUT_BUFFER
, CSR_CONSOLE
);
2664 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
2665 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2666 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2668 SetLastErrorByStatus ( Status
);
2675 /*--------------------------------------------------------------
2676 * SetConsoleScreenBufferSize
2682 SetConsoleScreenBufferSize(
2683 HANDLE hConsoleOutput
,
2687 DPRINT1("SetConsoleScreenBufferSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, dwSize
);
2688 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2692 /*--------------------------------------------------------------
2693 * SetConsoleCursorInfo
2699 SetConsoleCursorInfo(
2700 HANDLE hConsoleOutput
,
2701 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
2704 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2708 CsrRequest
= MAKE_CSR_API(SET_CURSOR_INFO
, CSR_CONSOLE
);
2709 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2710 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
2711 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2713 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2715 SetLastErrorByStatus ( Status
);
2723 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
2724 PSMALL_RECT lpScrollRectangle
,
2725 PSMALL_RECT lpClipRectangle
,
2726 COORD dwDestinationOrigin
,
2730 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2734 CsrRequest
= MAKE_CSR_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CSR_CONSOLE
);
2735 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
2736 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
2737 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
2739 if(lpClipRectangle
!= NULL
)
2741 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
2742 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
2746 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
2749 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
2750 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
2751 Status
= CsrClientCallServer(&Request
, NULL
,
2753 sizeof(CSR_API_MESSAGE
));
2755 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2757 SetLastErrorByStatus(Status
);
2765 /*--------------------------------------------------------------
2766 * ScrollConsoleScreenBufferA
2772 ScrollConsoleScreenBufferA(
2773 HANDLE hConsoleOutput
,
2774 CONST SMALL_RECT
*lpScrollRectangle
,
2775 CONST SMALL_RECT
*lpClipRectangle
,
2776 COORD dwDestinationOrigin
,
2777 CONST CHAR_INFO
*lpFill
2780 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2781 (PSMALL_RECT
)lpScrollRectangle
,
2782 (PSMALL_RECT
)lpClipRectangle
,
2783 dwDestinationOrigin
,
2789 /*--------------------------------------------------------------
2790 * ScrollConsoleScreenBufferW
2796 ScrollConsoleScreenBufferW(
2797 HANDLE hConsoleOutput
,
2798 CONST SMALL_RECT
*lpScrollRectangle
,
2799 CONST SMALL_RECT
*lpClipRectangle
,
2800 COORD dwDestinationOrigin
,
2801 CONST CHAR_INFO
*lpFill
2804 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2805 (PSMALL_RECT
)lpScrollRectangle
,
2806 (PSMALL_RECT
)lpClipRectangle
,
2807 dwDestinationOrigin
,
2813 /*--------------------------------------------------------------
2814 * SetConsoleWindowInfo
2820 SetConsoleWindowInfo(
2821 HANDLE hConsoleOutput
,
2823 CONST SMALL_RECT
*lpConsoleWindow
2826 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
2827 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2832 /*--------------------------------------------------------------
2833 * SetConsoleTextAttribute
2839 SetConsoleTextAttribute(
2840 HANDLE hConsoleOutput
,
2844 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
2848 CsrRequest
= MAKE_CSR_API(SET_ATTRIB
, CSR_CONSOLE
);
2849 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2850 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
2851 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
2852 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
2854 SetLastErrorByStatus ( Status
);
2862 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2864 if (HandlerRoutine
== NULL
)
2866 IgnoreCtrlEvents
= TRUE
;
2872 if (CtrlHandlers
== NULL
)
2874 CtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
2875 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2879 CtrlHandlers
= RtlReAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
2880 (PVOID
)CtrlHandlers
,
2881 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2883 if (CtrlHandlers
== NULL
)
2886 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2889 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
2896 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2900 if (HandlerRoutine
== NULL
)
2902 IgnoreCtrlEvents
= FALSE
;
2907 for (i
= 0; i
< NrCtrlHandlers
; i
++)
2909 if ( ((void*)(CtrlHandlers
[i
])) == (void*)HandlerRoutine
)
2912 memmove(CtrlHandlers
+ i
, CtrlHandlers
+ i
+ 1,
2913 (NrCtrlHandlers
- i
) * sizeof(PHANDLER_ROUTINE
));
2915 RtlReAllocateHeap(RtlGetProcessHeap(),
2917 (PVOID
)CtrlHandlers
,
2918 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2931 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
2936 RtlEnterCriticalSection(&DllLock
);
2939 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
2943 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
2945 RtlLeaveCriticalSection(&DllLock
);
2950 /*--------------------------------------------------------------
2951 * GenerateConsoleCtrlEvent
2956 GenerateConsoleCtrlEvent(
2958 DWORD dwProcessGroupId
2961 DPRINT1("GenerateConsoleCtrlEvent(0x%x, 0x%x) UNIMPLEMENTED!\n", dwCtrlEvent
, dwProcessGroupId
);
2962 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2967 /*--------------------------------------------------------------
2975 LPWSTR lpConsoleTitle
,
2979 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
2983 hConsole
= CreateFileW(L
"CONIN$", GENERIC_READ
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2984 if (hConsole
== INVALID_HANDLE_VALUE
)
2989 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSR_API_MESSAGE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
2992 CloseHandle(hConsole
);
2993 SetLastError(ERROR_OUTOFMEMORY
);
2997 CsrRequest
= MAKE_CSR_API(GET_TITLE
, CSR_CONSOLE
);
2998 Request
->Data
.GetTitleRequest
.ConsoleHandle
= hConsole
;
3000 Status
= CsrClientCallServer(Request
,
3003 sizeof(CSR_API_MESSAGE
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
3004 CloseHandle(hConsole
);
3005 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
->Status
)))
3007 SetLastErrorByStatus(Status
);
3008 RtlFreeHeap(GetProcessHeap(), 0, Request
);
3012 if(nSize
* sizeof(WCHAR
) < Request
->Data
.GetTitleRequest
.Length
)
3014 wcsncpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
, nSize
- 1);
3015 lpConsoleTitle
[nSize
--] = L
'\0';
3019 nSize
= Request
->Data
.GetTitleRequest
.Length
/ sizeof (WCHAR
);
3020 wcscpy(lpConsoleTitle
, Request
->Data
.GetTitleRequest
.Title
);
3021 lpConsoleTitle
[nSize
] = L
'\0';
3024 RtlFreeHeap(GetProcessHeap(), 0, Request
);
3029 /*--------------------------------------------------------------
3039 LPSTR lpConsoleTitle
,
3043 wchar_t WideTitle
[CSRSS_MAX_TITLE_LENGTH
];
3044 DWORD nWideTitle
= sizeof WideTitle
;
3047 if (!lpConsoleTitle
|| !nSize
) return 0;
3048 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
3049 if (!nWideTitle
) return 0;
3051 if ( (nWritten
= WideCharToMultiByte(
3052 CP_ACP
, // ANSI code page
3053 0, // performance and mapping flags
3054 (LPWSTR
) WideTitle
, // address of wide-character string
3055 nWideTitle
, // number of characters in string
3056 lpConsoleTitle
, // address of buffer for new string
3057 nSize
, // size of buffer
3062 lpConsoleTitle
[nWritten
] = '\0';
3070 /*--------------------------------------------------------------
3078 LPCWSTR lpConsoleTitle
3081 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3086 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
3087 if (hConsole
== INVALID_HANDLE_VALUE
)
3092 Request
= RtlAllocateHeap(GetProcessHeap(),
3094 sizeof(CSR_API_MESSAGE
) + CSRSS_MAX_SET_TITLE
);
3095 if (Request
== NULL
)
3097 CloseHandle(hConsole
);
3098 SetLastError(ERROR_OUTOFMEMORY
);
3102 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3103 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
3105 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
3106 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3108 Request
->Data
.SetTitleRequest
.Title
[c
] = 0;
3109 Request
->Data
.SetTitleRequest
.Length
= c
;
3110 Status
= CsrClientCallServer(Request
,
3113 sizeof(CSR_API_MESSAGE
) +
3115 CloseHandle(hConsole
);
3116 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Request
->Status
) )
3118 RtlFreeHeap( GetProcessHeap(), 0, Request
);
3119 SetLastErrorByStatus (Status
);
3122 RtlFreeHeap( GetProcessHeap(), 0, Request
);
3127 /*--------------------------------------------------------------
3137 LPCSTR lpConsoleTitle
3140 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3145 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
3146 if (hConsole
== INVALID_HANDLE_VALUE
)
3151 Request
= RtlAllocateHeap(GetProcessHeap(),
3153 sizeof(CSR_API_MESSAGE
) + CSRSS_MAX_SET_TITLE
);
3154 if (Request
== NULL
)
3156 CloseHandle(hConsole
);
3157 SetLastError(ERROR_OUTOFMEMORY
);
3161 CsrRequest
= MAKE_CSR_API(SET_TITLE
, CSR_CONSOLE
);
3162 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
3164 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
3165 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
3167 Request
->Data
.SetTitleRequest
.Title
[c
] = 0;
3168 Request
->Data
.SetTitleRequest
.Length
= c
;
3169 Status
= CsrClientCallServer(Request
,
3172 sizeof(CSR_API_MESSAGE
) +
3174 CloseHandle(hConsole
);
3175 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Request
->Status
) )
3177 RtlFreeHeap( GetProcessHeap(), 0, Request
);
3178 SetLastErrorByStatus (Status
);
3181 RtlFreeHeap( GetProcessHeap(), 0, Request
);
3186 /*--------------------------------------------------------------
3187 * CreateConsoleScreenBuffer
3193 CreateConsoleScreenBuffer(
3194 DWORD dwDesiredAccess
,
3196 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3198 LPVOID lpScreenBufferData
3201 // FIXME: don't ignore access, share mode, and security
3202 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3206 CsrRequest
= MAKE_CSR_API(CREATE_SCREEN_BUFFER
, CSR_CONSOLE
);
3207 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3208 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Request
.Status
) )
3210 SetLastErrorByStatus ( Status
);
3213 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3217 /*--------------------------------------------------------------
3224 GetConsoleCP( VOID
)
3226 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3230 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_CP
, CSR_CONSOLE
);
3231 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3232 sizeof(CSR_API_MESSAGE
));
3233 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3235 SetLastErrorByStatus (Status
);
3238 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3242 /*--------------------------------------------------------------
3253 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3257 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_CP
, CSR_CONSOLE
);
3258 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3259 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3260 sizeof(CSR_API_MESSAGE
));
3261 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3263 SetLastErrorByStatus (Status
);
3265 return NT_SUCCESS(Status
);
3269 /*--------------------------------------------------------------
3270 * GetConsoleOutputCP
3276 GetConsoleOutputCP( VOID
)
3278 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3282 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3283 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3284 sizeof(CSR_API_MESSAGE
));
3285 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3287 SetLastErrorByStatus (Status
);
3290 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3294 /*--------------------------------------------------------------
3295 * SetConsoleOutputCP
3305 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3309 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_OUTPUT_CP
, CSR_CONSOLE
);
3310 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3311 Status
= CsrClientCallServer(&Request
, NULL
, CsrRequest
,
3312 sizeof(CSR_API_MESSAGE
));
3313 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3315 SetLastErrorByStatus (Status
);
3317 return NT_SUCCESS(Status
);
3321 /*--------------------------------------------------------------
3322 * GetConsoleProcessList
3327 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3328 DWORD dwProcessCount
)
3330 PCSR_API_MESSAGE Request
; ULONG CsrRequest
;
3331 ULONG BufferSize
, nProcesses
;
3334 if(lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3336 SetLastError(ERROR_INVALID_PARAMETER
);
3340 BufferSize
= sizeof(CSR_API_MESSAGE
) +
3341 (dwProcessCount
* sizeof(Request
->Data
.GetProcessListRequest
.ProcessId
[0]));
3343 Request
= RtlAllocateHeap(GetProcessHeap(), 0, BufferSize
);
3346 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3350 Request
->Status
= STATUS_SUCCESS
;
3352 CsrRequest
= MAKE_CSR_API(GET_PROCESS_LIST
, CSR_CONSOLE
);
3353 Request
->Data
.GetProcessListRequest
.nMaxIds
= dwProcessCount
;
3355 Status
= CsrClientCallServer(Request
,
3359 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
3361 SetLastErrorByStatus (Status
);
3366 if(dwProcessCount
>= Request
->Data
.GetProcessListRequest
.nProcessIdsTotal
)
3368 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
;
3369 for(nProcesses
= 0; nProcesses
< Request
->Data
.GetProcessListRequest
.nProcessIdsCopied
; nProcesses
++)
3371 *(lpdwProcessList
++) = (DWORD
)Request
->Data
.GetProcessListRequest
.ProcessId
[nProcesses
];
3376 nProcesses
= Request
->Data
.GetProcessListRequest
.nProcessIdsTotal
;
3380 RtlFreeHeap(GetProcessHeap(), 0, Request
);
3386 /*--------------------------------------------------------------
3387 * GetConsoleSelectionInfo
3392 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3394 DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo
);
3395 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3401 /*--------------------------------------------------------------
3407 AttachConsole(DWORD dwProcessId
)
3409 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3410 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3414 /*--------------------------------------------------------------
3420 GetConsoleWindow (VOID
)
3422 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3426 CsrRequest
= MAKE_CSR_API(GET_CONSOLE_WINDOW
, CSR_CONSOLE
);
3427 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3428 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3430 SetLastErrorByStatus (Status
);
3433 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3437 /*--------------------------------------------------------------
3442 BOOL STDCALL
SetConsoleIcon(HICON hicon
)
3444 CSR_API_MESSAGE Request
; ULONG CsrRequest
;
3448 CsrRequest
= MAKE_CSR_API(SET_CONSOLE_ICON
, CSR_CONSOLE
);
3449 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3450 Status
= CsrClientCallServer( &Request
, NULL
, CsrRequest
, sizeof( CSR_API_MESSAGE
) );
3451 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3453 SetLastErrorByStatus (Status
);
3456 return NT_SUCCESS(Status
);
3460 /*--------------------------------------------------------------
3461 * SetConsoleInputExeNameW
3466 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3469 int lenName
= lstrlenW(lpInputExeName
);
3472 lenName
> (int)(sizeof(InputExeName
) / sizeof(InputExeName
[0])) - 1)
3474 /* Fail if string is empty or too long */
3475 SetLastError(ERROR_INVALID_PARAMETER
);
3479 RtlEnterCriticalSection(&ConsoleLock
);
3480 /* wrap copying into SEH as we may copy from invalid buffer and in case of an
3481 exception the console lock would've never been released, which would cause
3482 further calls (if the exception was handled by the caller) to recursively
3483 acquire the lock... */
3486 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3487 InputExeName
[lenName
] = L
'\0';
3493 SetLastErrorByStatus(_SEH_GetExceptionCode());
3496 RtlLeaveCriticalSection(&ConsoleLock
);
3502 /*--------------------------------------------------------------
3503 * SetConsoleInputExeNameA
3508 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3510 ANSI_STRING InputExeNameA
;
3511 UNICODE_STRING InputExeNameU
;
3515 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3517 if(InputExeNameA
.Length
< sizeof(InputExeNameA
.Buffer
[0]) ||
3518 InputExeNameA
.Length
>= (sizeof(InputExeName
) / sizeof(InputExeName
[0])) - 1)
3520 /* Fail if string is empty or too long */
3521 SetLastError(ERROR_INVALID_PARAMETER
);
3525 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, TRUE
);
3526 if(NT_SUCCESS(Status
))
3528 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3529 RtlFreeUnicodeString(&InputExeNameU
);
3533 SetLastErrorByStatus(Status
);
3541 /*--------------------------------------------------------------
3542 * GetConsoleInputExeNameW
3547 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3551 RtlEnterCriticalSection(&ConsoleLock
);
3553 lenName
= lstrlenW(InputExeName
);
3554 if(lenName
>= (int)nBufferLength
)
3556 /* buffer is not large enough, return the required size */
3557 RtlLeaveCriticalSection(&ConsoleLock
);
3561 /* wrap copying into SEH as we may copy to invalid buffer and in case of an
3562 exception the console lock would've never been released, which would cause
3563 further calls (if the exception was handled by the caller) to recursively
3564 acquire the lock... */
3567 RtlCopyMemory(lpBuffer
, InputExeName
, (lenName
+ 1) * sizeof(WCHAR
));
3572 SetLastErrorByStatus(_SEH_GetExceptionCode());
3576 RtlLeaveCriticalSection(&ConsoleLock
);
3582 /*--------------------------------------------------------------
3583 * GetConsoleInputExeNameA
3588 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
3593 if(nBufferLength
> 0)
3595 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0, nBufferLength
* sizeof(WCHAR
));
3598 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3607 Ret
= GetConsoleInputExeNameW(nBufferLength
, Buffer
);
3608 if(nBufferLength
> 0)
3612 UNICODE_STRING BufferU
;
3613 ANSI_STRING BufferA
;
3615 RtlInitUnicodeString(&BufferU
, Buffer
);
3618 BufferA
.MaximumLength
= nBufferLength
;
3619 BufferA
.Buffer
= lpBuffer
;
3621 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
3624 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);