1 /* $Id: console.c,v 1.63 2003/08/09 04:13:24 jimtabor Exp $
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 <kernel32/kernel32.h>
22 /* GLOBALS *******************************************************************/
24 static BOOL IgnoreCtrlEvents
= FALSE
;
25 static ULONG NrCtrlHandlers
= 0;
26 static PHANDLER_ROUTINE
* CtrlHandlers
= NULL
;
28 /* Default Console Handler *****************************************************************/
30 BOOL WINAPI
DefaultConsoleHandler(DWORD Event
)
36 DPRINT("Ctrl-C Event\n");
37 // ExitProcess((UINT)&ExitCode);
40 case CTRL_BREAK_EVENT
:
41 DPRINT("Ctrl-Break Event\n");
42 // ExitProcess((UINT&ExitCode);
45 case CTRL_SHUTDOWN_EVENT
:
46 DPRINT("Ctrl Shutdown Event\n");
49 case CTRL_CLOSE_EVENT
:
50 DPRINT("Ctrl Close Event\n");
53 case CTRL_LOGOFF_EVENT
:
54 DPRINT("Ctrl Logoff Event\n");
60 /* FUNCTIONS *****************************************************************/
66 AddConsoleAliasA (LPSTR Source
,
70 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
79 AddConsoleAliasW (LPWSTR Source
,
83 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
92 ConsoleMenuControl (HANDLE hConsole
,
99 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
108 DuplicateConsoleHandle (HANDLE hConsole
,
109 DWORD dwDesiredAccess
,
113 CSRSS_API_REQUEST Request
;
114 CSRSS_API_REPLY Reply
;
117 if (IsConsoleHandle (hConsole
) == FALSE
)
119 SetLastError (ERROR_INVALID_PARAMETER
);
120 return INVALID_HANDLE_VALUE
;
123 Request
.Type
= CSRSS_DUPLICATE_HANDLE
;
124 Request
.Data
.DuplicateHandleRequest
.Handle
= hConsole
;
125 Request
.Data
.DuplicateHandleRequest
.ProcessId
= GetCurrentProcessId();
126 Status
= CsrClientCallServer(&Request
,
128 sizeof(CSRSS_API_REQUEST
),
129 sizeof(CSRSS_API_REPLY
));
130 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
=Reply
.Status
))
132 SetLastErrorByStatus(Status
);
133 return INVALID_HANDLE_VALUE
;
135 return Reply
.Data
.DuplicateHandleReply
.Handle
;
143 ExpungeConsoleCommandHistoryW (DWORD Unknown0
)
148 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
157 ExpungeConsoleCommandHistoryA (DWORD Unknown0
)
162 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
171 GetConsoleAliasW (DWORD Unknown0
,
179 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
188 GetConsoleAliasA (DWORD Unknown0
,
196 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
205 GetConsoleAliasExesW (DWORD Unknown0
,
211 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
220 GetConsoleAliasExesA (DWORD Unknown0
,
226 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
235 GetConsoleAliasExesLengthA (VOID
)
240 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
249 GetConsoleAliasExesLengthW (VOID
)
254 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
263 GetConsoleAliasesW (DWORD Unknown0
,
270 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
279 GetConsoleAliasesA (DWORD Unknown0
,
286 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
295 GetConsoleAliasesLengthW (DWORD Unknown0
)
300 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
309 GetConsoleAliasesLengthA (DWORD Unknown0
)
314 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
323 GetConsoleCommandHistoryW (DWORD Unknown0
,
330 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
339 GetConsoleCommandHistoryA (DWORD Unknown0
,
346 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
355 GetConsoleCommandHistoryLengthW (DWORD Unknown0
)
360 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
369 GetConsoleCommandHistoryLengthA (DWORD Unknown0
)
374 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
382 GetConsoleDisplayMode (LPDWORD lpdwMode
)
384 * FUNCTION: Get the console display mode
386 * lpdwMode - Address of variable that receives the current value
388 * STATUS: Undocumented
391 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
400 GetConsoleFontInfo (DWORD Unknown0
,
408 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
417 GetConsoleFontSize(HANDLE hConsoleOutput
,
420 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
429 GetConsoleHardwareState (HANDLE hConsole
,
436 CSRSS_API_REQUEST Request
;
437 CSRSS_API_REPLY Reply
;
440 Request
.Type
= CSRSS_SETGET_CONSOLE_HW_STATE
;
441 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
442 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
444 Status
= CsrClientCallServer(& Request
,
446 sizeof(CSRSS_API_REQUEST
),
447 sizeof(CSRSS_API_REPLY
));
448 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
450 SetLastErrorByStatus(Status
);
453 *State
= Reply
.Data
.ConsoleHardwareStateReply
.State
;
462 GetConsoleInputWaitHandle (VOID
)
467 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
476 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
478 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
480 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
489 GetNumberOfConsoleFonts (VOID
)
494 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
495 return 1; /* FIXME: call csrss.exe */
503 InvalidateConsoleDIBits (DWORD Unknown0
,
509 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
518 OpenConsoleW (LPWSTR wsName
,
519 DWORD dwDesiredAccess
,
521 DWORD dwCreationDistribution
)
526 CSRSS_API_REQUEST Request
;
527 CSRSS_API_REPLY Reply
;
528 PHANDLE phConsole
= NULL
;
529 NTSTATUS Status
= STATUS_SUCCESS
;
532 if(0 == _wcsicmp(wsName
, L
"CONIN$"))
534 Request
.Type
= CSRSS_GET_INPUT_HANDLE
;
535 phConsole
= & Reply
.Data
.GetInputHandleReply
.InputHandle
;
537 else if (0 == _wcsicmp(wsName
, L
"CONOUT$"))
539 Request
.Type
= CSRSS_GET_OUTPUT_HANDLE
;
540 phConsole
= & Reply
.Data
.GetOutputHandleReply
.OutputHandle
;
544 SetLastError(ERROR_INVALID_PARAMETER
);
545 return(INVALID_HANDLE_VALUE
);
547 if ((GENERIC_READ
|GENERIC_WRITE
) != dwDesiredAccess
)
549 SetLastError(ERROR_INVALID_PARAMETER
);
550 return(INVALID_HANDLE_VALUE
);
552 if (OPEN_EXISTING
!= dwCreationDistribution
)
554 SetLastError(ERROR_INVALID_PARAMETER
);
555 return(INVALID_HANDLE_VALUE
);
557 Status
= CsrClientCallServer(& Request
,
559 sizeof(CSRSS_API_REQUEST
),
560 sizeof(CSRSS_API_REPLY
));
561 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
563 SetLastErrorByStatus(Status
);
564 return INVALID_HANDLE_VALUE
;
574 SetConsoleCommandHistoryMode (DWORD dwMode
)
579 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
588 SetConsoleCursor (DWORD Unknown0
,
594 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
603 SetConsoleDisplayMode (HANDLE hOut
,
607 * FUNCTION: Set the console display mode.
609 * hOut - Standard output handle.
610 * dwNewMode - New mode.
611 * lpdwOldMode - Address of a variable that receives the old mode.
614 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
623 SetConsoleFont (DWORD Unknown0
,
629 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
638 SetConsoleHardwareState (HANDLE hConsole
,
645 CSRSS_API_REQUEST Request
;
646 CSRSS_API_REPLY Reply
;
649 Request
.Type
= CSRSS_SETGET_CONSOLE_HW_STATE
;
650 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
651 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
652 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
654 Status
= CsrClientCallServer(& Request
,
656 sizeof(CSRSS_API_REQUEST
),
657 sizeof(CSRSS_API_REPLY
));
658 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
660 SetLastErrorByStatus(Status
);
671 SetConsoleKeyShortcuts (DWORD Unknown0
,
679 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
688 SetConsoleMaximumWindowSize (DWORD Unknown0
,
694 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
703 SetConsoleMenuClose (DWORD Unknown0
)
708 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
717 SetConsoleNumberOfCommandsA (DWORD Unknown0
,
723 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
732 SetConsoleNumberOfCommandsW (DWORD Unknown0
,
738 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
747 SetConsolePalette (DWORD Unknown0
,
754 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
763 SetLastConsoleEventActive (VOID
)
768 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
777 ShowConsoleCursor (DWORD Unknown0
,
783 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
789 * FUNCTION: Checks whether the given handle is a valid console handle.
791 * Handle - Handle to be checked
793 * TRUE: Handle is a valid console handle
794 * FALSE: Handle is not a valid console handle.
795 * STATUS: Officially undocumented
800 VerifyConsoleIoHandle(HANDLE Handle
)
802 CSRSS_API_REQUEST Request
;
803 CSRSS_API_REPLY Reply
;
806 Request
.Type
= CSRSS_VERIFY_HANDLE
;
807 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
808 Status
= CsrClientCallServer(&Request
,
810 sizeof(CSRSS_API_REQUEST
),
811 sizeof(CSRSS_API_REPLY
));
812 if (!NT_SUCCESS(Status
))
814 SetLastErrorByStatus(Status
);
818 return (BOOL
)NT_SUCCESS(Reply
.Status
);
826 WriteConsoleInputVDMA (DWORD Unknown0
,
831 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
840 WriteConsoleInputVDMW (DWORD Unknown0
,
845 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
854 CloseConsoleHandle(HANDLE Handle
)
859 CSRSS_API_REQUEST Request
;
860 CSRSS_API_REPLY Reply
;
863 if (IsConsoleHandle (Handle
) == FALSE
)
865 SetLastError (ERROR_INVALID_PARAMETER
);
869 Request
.Type
= CSRSS_CLOSE_HANDLE
;
870 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
871 Status
= CsrClientCallServer(&Request
,
873 sizeof(CSRSS_API_REQUEST
),
874 sizeof(CSRSS_API_REPLY
));
875 if (!NT_SUCCESS(Status
))
877 SetLastErrorByStatus(Status
);
889 IsConsoleHandle(HANDLE Handle
)
891 if ((((ULONG
)Handle
) & 0x10000003) == 0x3)
903 GetStdHandle(DWORD nStdHandle
)
905 * FUNCTION: Get a handle for the standard input, standard output
906 * and a standard error device.
908 * nStdHandle - Specifies the device for which to return the handle.
909 * RETURNS: If the function succeeds, the return value is the handle
910 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
913 PRTL_USER_PROCESS_PARAMETERS Ppb
;
915 Ppb
= NtCurrentPeb()->ProcessParameters
;
918 case STD_INPUT_HANDLE
:
919 return Ppb
->hStdInput
;
921 case STD_OUTPUT_HANDLE
:
922 return Ppb
->hStdOutput
;
924 case STD_ERROR_HANDLE
:
925 return Ppb
->hStdError
;
928 SetLastError (ERROR_INVALID_PARAMETER
);
929 return INVALID_HANDLE_VALUE
;
936 WINBASEAPI BOOL WINAPI
937 SetStdHandle(DWORD nStdHandle
,
940 * FUNCTION: Set the handle for the standard input, standard output or
941 * the standard error device.
943 * nStdHandle - Specifies the handle to be set.
944 * hHandle - The handle to set.
945 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
948 PRTL_USER_PROCESS_PARAMETERS Ppb
;
950 Ppb
= NtCurrentPeb()->ProcessParameters
;
952 /* More checking needed? */
953 if (hHandle
== INVALID_HANDLE_VALUE
)
955 SetLastError (ERROR_INVALID_HANDLE
);
959 SetLastError(ERROR_SUCCESS
); /* OK */
963 case STD_INPUT_HANDLE
:
964 Ppb
->hStdInput
= hHandle
;
967 case STD_OUTPUT_HANDLE
:
968 Ppb
->hStdOutput
= hHandle
;
971 case STD_ERROR_HANDLE
:
972 Ppb
->hStdError
= hHandle
;
976 SetLastError (ERROR_INVALID_PARAMETER
);
981 /*--------------------------------------------------------------
987 WriteConsoleA(HANDLE hConsoleOutput
,
988 CONST VOID
*lpBuffer
,
989 DWORD nNumberOfCharsToWrite
,
990 LPDWORD lpNumberOfCharsWritten
,
993 PCSRSS_API_REQUEST Request
;
994 CSRSS_API_REPLY Reply
;
999 Request
= RtlAllocateHeap(GetProcessHeap(),
1001 sizeof(CSRSS_API_REQUEST
) +
1002 CSRSS_MAX_WRITE_CONSOLE_REQUEST
);
1003 if (Request
== NULL
)
1005 SetLastError(ERROR_OUTOFMEMORY
);
1009 Request
->Type
= CSRSS_WRITE_CONSOLE
;
1010 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1011 if (lpNumberOfCharsWritten
!= NULL
)
1012 *lpNumberOfCharsWritten
= nNumberOfCharsToWrite
;
1013 while (nNumberOfCharsToWrite
)
1015 if (nNumberOfCharsToWrite
> CSRSS_MAX_WRITE_CONSOLE_REQUEST
)
1017 Size
= CSRSS_MAX_WRITE_CONSOLE_REQUEST
;
1021 Size
= nNumberOfCharsToWrite
;
1023 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= Size
;
1025 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, Size
);
1027 MessageSize
= CSRSS_REQUEST_HEADER_SIZE
+
1028 sizeof(CSRSS_WRITE_CONSOLE_REQUEST
) + Size
;
1029 Status
= CsrClientCallServer(Request
,
1032 sizeof(CSRSS_API_REPLY
));
1034 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1036 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1037 SetLastErrorByStatus(Status
);
1040 nNumberOfCharsToWrite
-= Size
;
1044 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1050 /*--------------------------------------------------------------
1055 WINBOOL STDCALL
ReadConsoleA(HANDLE hConsoleInput
,
1057 DWORD nNumberOfCharsToRead
,
1058 LPDWORD lpNumberOfCharsRead
,
1061 CSRSS_API_REQUEST Request
;
1062 PCSRSS_API_REPLY Reply
;
1064 ULONG CharsRead
= 0;
1066 Reply
= RtlAllocateHeap(GetProcessHeap(),
1068 sizeof(CSRSS_API_REPLY
) + nNumberOfCharsToRead
);
1071 SetLastError(ERROR_OUTOFMEMORY
);
1075 Request
.Type
= CSRSS_READ_CONSOLE
;
1076 Request
.Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1077 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
= nNumberOfCharsToRead
> CSRSS_MAX_READ_CONSOLE_REQUEST
? CSRSS_MAX_READ_CONSOLE_REQUEST
: nNumberOfCharsToRead
;
1078 Request
.Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= 0;
1079 Status
= CsrClientCallServer(&Request
,
1081 sizeof(CSRSS_API_REQUEST
),
1082 sizeof(CSRSS_API_REPLY
) +
1083 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
);
1084 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
->Status
))
1086 DbgPrint( "CSR returned error in ReadConsole\n" );
1087 SetLastErrorByStatus ( Status
);
1088 RtlFreeHeap( GetProcessHeap(), 0, Reply
);
1091 if( Reply
->Status
== STATUS_NOTIFY_CLEANUP
)
1092 Reply
->Status
= STATUS_PENDING
; // ignore backspace because we have no chars to backspace
1093 /* There may not be any chars or lines to read yet, so wait */
1094 while( Reply
->Status
== STATUS_PENDING
)
1096 /* some chars may have been returned, but not a whole line yet, so recompute buffer and try again */
1097 nNumberOfCharsToRead
-= Reply
->Data
.ReadConsoleReply
.NrCharactersRead
;
1098 /* don't overflow caller's buffer, even if you still don't have a complete line */
1099 if( !nNumberOfCharsToRead
)
1101 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
= nNumberOfCharsToRead
> CSRSS_MAX_READ_CONSOLE_REQUEST
? CSRSS_MAX_READ_CONSOLE_REQUEST
: nNumberOfCharsToRead
;
1102 /* copy any chars already read to buffer */
1103 memcpy( lpBuffer
+ CharsRead
, Reply
->Data
.ReadConsoleReply
.Buffer
, Reply
->Data
.ReadConsoleReply
.NrCharactersRead
);
1104 CharsRead
+= Reply
->Data
.ReadConsoleReply
.NrCharactersRead
;
1105 /* wait for csrss to signal there is more data to read, but not if we got STATUS_NOTIFY_CLEANUP for backspace */
1106 Status
= NtWaitForSingleObject( Reply
->Data
.ReadConsoleReply
.EventHandle
, FALSE
, 0 );
1107 if( !NT_SUCCESS( Status
) )
1109 DbgPrint( "Wait for console input failed!\n" );
1110 RtlFreeHeap( GetProcessHeap(), 0, Reply
);
1113 Request
.Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= CharsRead
;
1114 Status
= CsrClientCallServer( &Request
, Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) + Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
);
1115 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
->Status
) )
1117 SetLastErrorByStatus ( Status
);
1118 RtlFreeHeap( GetProcessHeap(), 0, Reply
);
1121 if( Reply
->Status
== STATUS_NOTIFY_CLEANUP
)
1127 nNumberOfCharsToRead
++;
1129 Reply
->Status
= STATUS_PENDING
; // retry
1132 /* copy data to buffer, count total returned, and return */
1133 memcpy( lpBuffer
+ CharsRead
, Reply
->Data
.ReadConsoleReply
.Buffer
, Reply
->Data
.ReadConsoleReply
.NrCharactersRead
);
1134 CharsRead
+= Reply
->Data
.ReadConsoleReply
.NrCharactersRead
;
1135 if (lpNumberOfCharsRead
!= NULL
)
1136 *lpNumberOfCharsRead
= CharsRead
;
1137 RtlFreeHeap(GetProcessHeap(),
1145 /*--------------------------------------------------------------
1150 WINBOOL STDCALL
AllocConsole(VOID
)
1152 CSRSS_API_REQUEST Request
;
1153 CSRSS_API_REPLY Reply
;
1157 Request
.Type
= CSRSS_ALLOC_CONSOLE
;
1158 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1159 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1161 SetLastErrorByStatus ( Status
);
1164 SetStdHandle( STD_INPUT_HANDLE
, Reply
.Data
.AllocConsoleReply
.InputHandle
);
1165 SetStdHandle( STD_OUTPUT_HANDLE
, Reply
.Data
.AllocConsoleReply
.OutputHandle
);
1166 hStdError
= DuplicateConsoleHandle(Reply
.Data
.AllocConsoleReply
.OutputHandle
,
1169 DUPLICATE_SAME_ACCESS
);
1170 SetStdHandle( STD_ERROR_HANDLE
, hStdError
);
1175 /*--------------------------------------------------------------
1180 WINBOOL STDCALL
FreeConsole(VOID
)
1182 DbgPrint("FreeConsole() is unimplemented\n");
1187 /*--------------------------------------------------------------
1188 * GetConsoleScreenBufferInfo
1194 GetConsoleScreenBufferInfo(
1195 HANDLE hConsoleOutput
,
1196 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
1199 CSRSS_API_REQUEST Request
;
1200 CSRSS_API_REPLY Reply
;
1203 Request
.Type
= CSRSS_SCREEN_BUFFER_INFO
;
1204 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1205 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1206 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1208 SetLastErrorByStatus ( Status
);
1211 *lpConsoleScreenBufferInfo
= Reply
.Data
.ScreenBufferInfoReply
.Info
;
1216 /*--------------------------------------------------------------
1217 * SetConsoleCursorPosition
1223 SetConsoleCursorPosition(
1224 HANDLE hConsoleOutput
,
1225 COORD dwCursorPosition
1228 CSRSS_API_REQUEST Request
;
1229 CSRSS_API_REPLY Reply
;
1232 Request
.Type
= CSRSS_SET_CURSOR
;
1233 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1234 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1235 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1236 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1238 SetLastErrorByStatus ( Status
);
1245 /*--------------------------------------------------------------
1246 * FillConsoleOutputCharacterA
1251 FillConsoleOutputCharacterA(
1252 HANDLE hConsoleOutput
,
1256 LPDWORD lpNumberOfCharsWritten
1259 CSRSS_API_REQUEST Request
;
1260 CSRSS_API_REPLY Reply
;
1263 Request
.Type
= CSRSS_FILL_OUTPUT
;
1264 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1265 Request
.Data
.FillOutputRequest
.Char
= cCharacter
;
1266 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1267 Request
.Data
.FillOutputRequest
.Length
= nLength
;
1268 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1269 if ( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1271 SetLastErrorByStatus(Status
);
1274 if (lpNumberOfCharsWritten
!= NULL
)
1275 *lpNumberOfCharsWritten
= nLength
;
1280 /*--------------------------------------------------------------
1281 * FillConsoleOutputCharacterW
1287 FillConsoleOutputCharacterW(
1288 HANDLE hConsoleOutput
,
1292 LPDWORD lpNumberOfCharsWritten
1300 /*--------------------------------------------------------------
1309 HANDLE hConsoleInput
,
1310 PINPUT_RECORD lpBuffer
,
1312 LPDWORD lpNumberOfEventsRead
1315 PCSRSS_API_REQUEST Request
;
1316 CSRSS_API_REPLY Reply
;
1319 PVOID BufferTargetBase
;
1322 if(lpBuffer
== NULL
)
1324 SetLastError(ERROR_INVALID_PARAMETER
);
1328 Size
= nLength
* sizeof(INPUT_RECORD
);
1330 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1331 if(!NT_SUCCESS(Status
))
1333 SetLastErrorByStatus(Status
);
1337 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REQUEST
));
1340 CsrReleaseParameterBuffer(BufferBase
);
1341 SetLastError(ERROR_OUTOFMEMORY
);
1345 Request
->Type
= CSRSS_PEEK_CONSOLE_INPUT
;
1346 Request
->Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1347 Request
->Data
.PeekConsoleInputRequest
.Length
= nLength
;
1348 Request
->Data
.PeekConsoleInputRequest
.InputRecord
= (INPUT_RECORD
*)BufferTargetBase
;
1350 Status
= CsrClientCallServer(Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
1352 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1354 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1355 CsrReleaseParameterBuffer(BufferBase
);
1359 memcpy(lpBuffer
, BufferBase
, sizeof(INPUT_RECORD
) * Reply
.Data
.PeekConsoleInputReply
.Length
);
1361 if(lpNumberOfEventsRead
!= NULL
)
1362 *lpNumberOfEventsRead
= Reply
.Data
.PeekConsoleInputReply
.Length
;
1364 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1365 CsrReleaseParameterBuffer(BufferBase
);
1371 /*--------------------------------------------------------------
1380 HANDLE hConsoleInput
,
1381 PINPUT_RECORD lpBuffer
,
1383 LPDWORD lpNumberOfEventsRead
1391 /*--------------------------------------------------------------
1396 WINBASEAPI BOOL WINAPI
1397 ReadConsoleInputA(HANDLE hConsoleInput
,
1398 PINPUT_RECORD lpBuffer
,
1400 LPDWORD lpNumberOfEventsRead
)
1402 CSRSS_API_REQUEST Request
;
1403 CSRSS_API_REPLY Reply
;
1404 DWORD NumEventsRead
;
1407 Request
.Type
= CSRSS_READ_INPUT
;
1408 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1409 Status
= CsrClientCallServer(&Request
, &Reply
, sizeof(CSRSS_API_REQUEST
),
1410 sizeof(CSRSS_API_REPLY
));
1411 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1413 SetLastErrorByStatus(Status
);
1417 while (Status
== STATUS_PENDING
)
1419 Status
= NtWaitForSingleObject(Reply
.Data
.ReadInputReply
.Event
, FALSE
,
1421 if(!NT_SUCCESS(Status
))
1423 SetLastErrorByStatus(Status
);
1427 Request
.Type
= CSRSS_READ_INPUT
;
1428 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1429 Status
= CsrClientCallServer(&Request
, &Reply
, sizeof(CSRSS_API_REQUEST
),
1430 sizeof(CSRSS_API_REPLY
));
1431 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1433 SetLastErrorByStatus(Status
);
1439 *lpBuffer
= Reply
.Data
.ReadInputReply
.Input
;
1443 while ((NumEventsRead
< nLength
) && (Reply
.Data
.ReadInputReply
.MoreEvents
))
1445 Status
= CsrClientCallServer(&Request
, &Reply
, sizeof(CSRSS_API_REQUEST
),
1446 sizeof(CSRSS_API_REPLY
));
1447 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1449 SetLastErrorByStatus(Status
);
1453 if (Status
== STATUS_PENDING
)
1458 *lpBuffer
= Reply
.Data
.ReadInputReply
.Input
;
1463 *lpNumberOfEventsRead
= NumEventsRead
;
1469 /*--------------------------------------------------------------
1478 HANDLE hConsoleInput
,
1479 PINPUT_RECORD lpBuffer
,
1481 LPDWORD lpNumberOfEventsRead
1489 /*--------------------------------------------------------------
1490 * WriteConsoleInputA
1498 HANDLE hConsoleInput
,
1499 CONST INPUT_RECORD
*lpBuffer
,
1501 LPDWORD lpNumberOfEventsWritten
1504 PCSRSS_API_REQUEST Request
;
1505 CSRSS_API_REPLY Reply
;
1506 PVOID BufferBase
, BufferTargetBase
;
1510 if(lpBuffer
== NULL
)
1512 SetLastError(ERROR_INVALID_PARAMETER
);
1516 Size
= nLength
* sizeof(INPUT_RECORD
);
1518 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1519 if(!NT_SUCCESS(Status
))
1521 SetLastErrorByStatus(Status
);
1525 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REQUEST
));
1528 SetLastError(ERROR_OUTOFMEMORY
);
1529 CsrReleaseParameterBuffer(BufferBase
);
1533 Request
->Type
= CSRSS_WRITE_CONSOLE_INPUT
;
1534 Request
->Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1535 Request
->Data
.WriteConsoleInputRequest
.Length
= nLength
;
1536 Request
->Data
.WriteConsoleInputRequest
.InputRecord
= (PINPUT_RECORD
)BufferTargetBase
;
1538 Status
= CsrClientCallServer(Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
1539 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1541 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1542 CsrReleaseParameterBuffer(BufferBase
);
1546 if(lpNumberOfEventsWritten
!= NULL
)
1547 *lpNumberOfEventsWritten
= Reply
.Data
.WriteConsoleInputReply
.Length
;
1549 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1550 CsrReleaseParameterBuffer(BufferBase
);
1556 /*--------------------------------------------------------------
1557 * WriteConsoleInputW
1565 HANDLE hConsoleInput
,
1566 CONST INPUT_RECORD
*lpBuffer
,
1568 LPDWORD lpNumberOfEventsWritten
1576 /*--------------------------------------------------------------
1577 * ReadConsoleOutputA
1585 HANDLE hConsoleOutput
,
1586 PCHAR_INFO lpBuffer
,
1588 COORD dwBufferCoord
,
1589 PSMALL_RECT lpReadRegion
1592 PCSRSS_API_REQUEST Request
;
1593 CSRSS_API_REPLY Reply
;
1595 PVOID BufferTargetBase
;
1597 DWORD Size
, SizeX
, SizeY
;
1599 if(lpBuffer
== NULL
)
1601 SetLastError(ERROR_INVALID_PARAMETER
);
1605 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
1607 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1608 if(!NT_SUCCESS(Status
))
1610 SetLastErrorByStatus(Status
);
1614 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REQUEST
));
1617 SetLastError(ERROR_OUTOFMEMORY
);
1618 CsrReleaseParameterBuffer(BufferBase
);
1622 Request
->Type
= CSRSS_READ_CONSOLE_OUTPUT
;
1623 Request
->Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1624 Request
->Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1625 Request
->Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1626 Request
->Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
1627 Request
->Data
.ReadConsoleOutputRequest
.CharInfo
= (PCHAR_INFO
)BufferTargetBase
;
1629 Status
= CsrClientCallServer(Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
1630 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1632 SetLastErrorByStatus(Status
);
1633 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1634 CsrReleaseParameterBuffer(BufferBase
);
1638 SizeX
= Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Right
- Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Left
+ 1;
1639 SizeY
= Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Bottom
- Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Top
+ 1;
1641 memcpy(lpBuffer
, BufferBase
, sizeof(CHAR_INFO
) * SizeX
* SizeY
);
1642 *lpReadRegion
= Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
;
1644 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1645 CsrReleaseParameterBuffer(BufferBase
);
1651 /*--------------------------------------------------------------
1652 * ReadConsoleOutputW
1660 HANDLE hConsoleOutput
,
1661 PCHAR_INFO lpBuffer
,
1663 COORD dwBufferCoord
,
1664 PSMALL_RECT lpReadRegion
1671 /*--------------------------------------------------------------
1672 * WriteConsoleOutputA
1676 WINBASEAPI BOOL WINAPI
1677 WriteConsoleOutputA(HANDLE hConsoleOutput
,
1678 CONST CHAR_INFO
*lpBuffer
,
1680 COORD dwBufferCoord
,
1681 PSMALL_RECT lpWriteRegion
)
1683 PCSRSS_API_REQUEST Request
;
1684 CSRSS_API_REPLY Reply
;
1690 PVOID BufferTargetBase
;
1692 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
1694 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
,
1698 if (!NT_SUCCESS(Status
))
1700 SetLastErrorByStatus(Status
);
1704 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
,
1705 sizeof(CSRSS_API_REQUEST
));
1706 if (Request
== NULL
)
1708 CsrReleaseParameterBuffer(BufferBase
);
1709 SetLastError(ERROR_OUTOFMEMORY
);
1712 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT
;
1713 Request
->Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1714 Request
->Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1715 Request
->Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1716 Request
->Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
1717 Request
->Data
.WriteConsoleOutputRequest
.CharInfo
=
1718 (CHAR_INFO
*)BufferTargetBase
;
1720 Status
= CsrClientCallServer(Request
, &Reply
,
1721 sizeof(CSRSS_API_REQUEST
),
1722 sizeof(CSRSS_API_REPLY
));
1723 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1725 CsrReleaseParameterBuffer(BufferBase
);
1726 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1727 SetLastErrorByStatus(Status
);
1731 *lpWriteRegion
= Reply
.Data
.WriteConsoleOutputReply
.WriteRegion
;
1732 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1733 CsrReleaseParameterBuffer(BufferBase
);
1738 /*--------------------------------------------------------------
1739 * WriteConsoleOutputW
1746 WriteConsoleOutputW(
1747 HANDLE hConsoleOutput
,
1748 CONST CHAR_INFO
*lpBuffer
,
1750 COORD dwBufferCoord
,
1751 PSMALL_RECT lpWriteRegion
1759 /*--------------------------------------------------------------
1760 * ReadConsoleOutputCharacterA
1767 ReadConsoleOutputCharacterA(
1768 HANDLE hConsoleOutput
,
1772 LPDWORD lpNumberOfCharsRead
1775 CSRSS_API_REQUEST Request
;
1776 PCSRSS_API_REPLY Reply
;
1780 Reply
= RtlAllocateHeap(GetProcessHeap(),
1782 sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
);
1785 SetLastError(ERROR_OUTOFMEMORY
);
1789 if (lpNumberOfCharsRead
!= NULL
)
1790 *lpNumberOfCharsRead
= nLength
;
1792 Request
.Type
= CSRSS_READ_CONSOLE_OUTPUT_CHAR
;
1793 Request
.Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
1794 Request
.Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
1796 while (nLength
!= 0)
1798 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
)
1799 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
;
1803 Request
.Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= Size
;
1805 Status
= CsrClientCallServer(&Request
,
1807 sizeof(CSRSS_API_REQUEST
),
1808 sizeof(CSRSS_API_REPLY
) + Size
);
1809 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Reply
->Status
))
1811 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1812 SetLastErrorByStatus(Status
);
1816 memcpy(lpCharacter
, &Reply
->Data
.ReadConsoleOutputCharReply
.String
[0], Size
);
1817 lpCharacter
+= Size
;
1819 Request
.Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Reply
->Data
.ReadConsoleOutputCharReply
.EndCoord
;
1822 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1828 /*--------------------------------------------------------------
1829 * ReadConsoleOutputCharacterW
1836 ReadConsoleOutputCharacterW(
1837 HANDLE hConsoleOutput
,
1841 LPDWORD lpNumberOfCharsRead
1849 /*--------------------------------------------------------------
1850 * ReadConsoleOutputAttribute
1857 ReadConsoleOutputAttribute(
1858 HANDLE hConsoleOutput
,
1862 LPDWORD lpNumberOfAttrsRead
1865 CSRSS_API_REQUEST Request
;
1866 PCSRSS_API_REPLY Reply
;
1870 Reply
= RtlAllocateHeap(GetProcessHeap(),
1872 sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
);
1875 SetLastError(ERROR_OUTOFMEMORY
);
1879 if (lpNumberOfAttrsRead
!= NULL
)
1880 *lpNumberOfAttrsRead
= nLength
;
1882 Request
.Type
= CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
;
1883 Request
.Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1884 Request
.Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
1886 while (nLength
!= 0)
1888 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
)
1889 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
;
1893 Request
.Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
1895 Status
= CsrClientCallServer(&Request
,
1897 sizeof(CSRSS_API_REQUEST
),
1898 sizeof(CSRSS_API_REPLY
) + Size
);
1899 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Reply
->Status
))
1901 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1902 SetLastErrorByStatus(Status
);
1906 // Convert CHARs to WORDs
1907 for(i
= 0; i
< Size
; ++i
)
1908 *lpAttribute
++ = Reply
->Data
.ReadConsoleOutputAttribReply
.String
[i
];
1911 Request
.Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Reply
->Data
.ReadConsoleOutputAttribReply
.EndCoord
;
1914 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1920 /*--------------------------------------------------------------
1921 * WriteConsoleOutputCharacterA
1925 WINBASEAPI BOOL WINAPI
1926 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1930 LPDWORD lpNumberOfCharsWritten
)
1932 PCSRSS_API_REQUEST Request
;
1933 CSRSS_API_REPLY Reply
;
1937 Request
= RtlAllocateHeap(GetProcessHeap(),
1939 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
);
1942 SetLastError( ERROR_OUTOFMEMORY
);
1945 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
;
1946 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
1947 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
1948 if( lpNumberOfCharsWritten
)
1949 *lpNumberOfCharsWritten
= nLength
;
1952 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
: nLength
;
1953 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= Size
;
1954 memcpy( &Request
->Data
.WriteConsoleOutputCharRequest
.String
[0],
1957 Status
= CsrClientCallServer( Request
, &Reply
, sizeof( CSRSS_API_REQUEST
) + Size
, sizeof( CSRSS_API_REPLY
) );
1958 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1960 RtlFreeHeap( GetProcessHeap(), 0, Request
);
1961 SetLastErrorByStatus ( Status
);
1965 lpCharacter
+= Size
;
1966 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Reply
.Data
.WriteConsoleOutputCharReply
.EndCoord
;
1969 RtlFreeHeap( GetProcessHeap(), 0, Request
);
1974 /*--------------------------------------------------------------
1975 * WriteConsoleOutputCharacterW
1979 WINBASEAPI BOOL WINAPI
1980 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1981 LPCWSTR lpCharacter
,
1984 LPDWORD lpNumberOfCharsWritten
)
1986 PCSRSS_API_REQUEST Request
;
1987 CSRSS_API_REPLY Reply
;
1991 Request
= RtlAllocateHeap(GetProcessHeap(),
1993 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
);
1996 SetLastError( ERROR_OUTOFMEMORY
);
1999 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
;
2000 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2001 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2002 if( lpNumberOfCharsWritten
)
2003 *lpNumberOfCharsWritten
= nLength
;
2006 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
: nLength
;
2007 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= Size
;
2008 Status
= RtlUnicodeToOemN (&Request
->Data
.WriteConsoleOutputCharRequest
.String
[0],
2011 (PWCHAR
)lpCharacter
,
2012 Size
* sizeof(WCHAR
));
2013 if (!NT_SUCCESS(Status
))
2015 RtlFreeHeap (GetProcessHeap(), 0, Request
);
2016 SetLastErrorByStatus (Status
);
2020 Status
= CsrClientCallServer( Request
, &Reply
, sizeof( CSRSS_API_REQUEST
) + Size
, sizeof( CSRSS_API_REPLY
) );
2021 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2023 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2024 SetLastErrorByStatus ( Status
);
2028 lpCharacter
+= Size
;
2029 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Reply
.Data
.WriteConsoleOutputCharReply
.EndCoord
;
2032 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2037 /*--------------------------------------------------------------
2038 * WriteConsoleOutputAttribute
2045 WriteConsoleOutputAttribute(
2046 HANDLE hConsoleOutput
,
2047 CONST WORD
*lpAttribute
,
2050 LPDWORD lpNumberOfAttrsWritten
2053 PCSRSS_API_REQUEST Request
;
2054 CSRSS_API_REPLY Reply
;
2059 Request
= RtlAllocateHeap(GetProcessHeap(),
2061 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
);
2064 SetLastError( ERROR_OUTOFMEMORY
);
2067 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
;
2068 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2069 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2070 if( lpNumberOfAttrsWritten
)
2071 *lpNumberOfAttrsWritten
= nLength
;
2074 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
: nLength
;
2075 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2076 for( c
= 0; c
< ( Size
* 2 ); c
++ )
2077 Request
->Data
.WriteConsoleOutputAttribRequest
.String
[c
] = (char)lpAttribute
[c
];
2078 Status
= CsrClientCallServer( Request
, &Reply
, sizeof( CSRSS_API_REQUEST
) + (Size
* 2), sizeof( CSRSS_API_REPLY
) );
2079 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2081 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2082 SetLastErrorByStatus ( Status
);
2086 lpAttribute
+= Size
;
2087 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Reply
.Data
.WriteConsoleOutputAttribReply
.EndCoord
;
2090 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2095 /*--------------------------------------------------------------
2096 * FillConsoleOutputAttribute
2103 FillConsoleOutputAttribute(
2104 HANDLE hConsoleOutput
,
2108 LPDWORD lpNumberOfAttrsWritten
2111 CSRSS_API_REQUEST Request
;
2112 CSRSS_API_REPLY Reply
;
2115 Request
.Type
= CSRSS_FILL_OUTPUT_ATTRIB
;
2116 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2117 Request
.Data
.FillOutputAttribRequest
.Attribute
= wAttribute
;
2118 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2119 Request
.Data
.FillOutputAttribRequest
.Length
= nLength
;
2120 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2121 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2123 SetLastErrorByStatus ( Status
);
2126 if( lpNumberOfAttrsWritten
)
2127 *lpNumberOfAttrsWritten
= nLength
;
2132 /*--------------------------------------------------------------
2141 HANDLE hConsoleHandle
,
2145 CSRSS_API_REQUEST Request
;
2146 CSRSS_API_REPLY Reply
;
2149 Request
.Type
= CSRSS_GET_MODE
;
2150 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2151 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2152 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2154 SetLastErrorByStatus ( Status
);
2157 *lpMode
= Reply
.Data
.GetConsoleModeReply
.ConsoleMode
;
2162 /*--------------------------------------------------------------
2163 * GetNumberOfConsoleInputEvents
2170 GetNumberOfConsoleInputEvents(
2171 HANDLE hConsoleInput
,
2172 LPDWORD lpNumberOfEvents
2175 CSRSS_API_REQUEST Request
;
2176 CSRSS_API_REPLY Reply
;
2179 if(lpNumberOfEvents
== NULL
)
2181 SetLastError(ERROR_INVALID_PARAMETER
);
2185 Request
.Type
= CSRSS_GET_NUM_INPUT_EVENTS
;
2186 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2187 Status
= CsrClientCallServer(&Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
2188 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
2190 SetLastErrorByStatus(Status
);
2194 *lpNumberOfEvents
= Reply
.Data
.GetNumInputEventsReply
.NumInputEvents
;
2200 /*--------------------------------------------------------------
2201 * GetLargestConsoleWindowSize
2208 GetLargestConsoleWindowSize(
2209 HANDLE hConsoleOutput
2213 COORD Coord
= {80,25};
2221 /*--------------------------------------------------------------
2222 * GetConsoleCursorInfo
2229 GetConsoleCursorInfo(
2230 HANDLE hConsoleOutput
,
2231 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
2234 CSRSS_API_REQUEST Request
;
2235 CSRSS_API_REPLY Reply
;
2238 Request
.Type
= CSRSS_GET_CURSOR_INFO
;
2239 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2240 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2242 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2244 SetLastErrorByStatus ( Status
);
2247 *lpConsoleCursorInfo
= Reply
.Data
.GetCursorInfoReply
.Info
;
2252 /*--------------------------------------------------------------
2253 * GetNumberOfConsoleMouseButtons
2260 GetNumberOfConsoleMouseButtons(
2261 LPDWORD lpNumberOfMouseButtons
2269 /*--------------------------------------------------------------
2278 HANDLE hConsoleHandle
,
2282 CSRSS_API_REQUEST Request
;
2283 CSRSS_API_REPLY Reply
;
2286 Request
.Type
= CSRSS_SET_MODE
;
2287 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2288 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2289 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2290 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2292 SetLastErrorByStatus ( Status
);
2299 /*--------------------------------------------------------------
2300 * SetConsoleActiveScreenBuffer
2307 SetConsoleActiveScreenBuffer(
2308 HANDLE hConsoleOutput
2311 CSRSS_API_REQUEST Request
;
2312 CSRSS_API_REPLY Reply
;
2315 Request
.Type
= CSRSS_SET_SCREEN_BUFFER
;
2316 Request
.Data
.SetActiveScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
2317 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2318 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2320 SetLastErrorByStatus ( Status
);
2327 /*--------------------------------------------------------------
2328 * FlushConsoleInputBuffer
2335 FlushConsoleInputBuffer(
2336 HANDLE hConsoleInput
2339 CSRSS_API_REQUEST Request
;
2340 CSRSS_API_REPLY Reply
;
2343 Request
.Type
= CSRSS_FLUSH_INPUT_BUFFER
;
2344 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
2345 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2346 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2348 SetLastErrorByStatus ( Status
);
2355 /*--------------------------------------------------------------
2356 * SetConsoleScreenBufferSize
2363 SetConsoleScreenBufferSize(
2364 HANDLE hConsoleOutput
,
2372 /*--------------------------------------------------------------
2373 * SetConsoleCursorInfo
2380 SetConsoleCursorInfo(
2381 HANDLE hConsoleOutput
,
2382 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
2385 CSRSS_API_REQUEST Request
;
2386 CSRSS_API_REPLY Reply
;
2389 Request
.Type
= CSRSS_SET_CURSOR_INFO
;
2390 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2391 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
2392 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2394 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2396 SetLastErrorByStatus ( Status
);
2403 /*--------------------------------------------------------------
2404 * ScrollConsoleScreenBufferA
2411 ScrollConsoleScreenBufferA(
2412 HANDLE hConsoleOutput
,
2413 CONST SMALL_RECT
*lpScrollRectangle
,
2414 CONST SMALL_RECT
*lpClipRectangle
,
2415 COORD dwDestinationOrigin
,
2416 CONST CHAR_INFO
*lpFill
2419 CSRSS_API_REQUEST Request
;
2420 CSRSS_API_REPLY Reply
;
2423 Request
.Type
= CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER
;
2424 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
2425 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
2427 if (lpClipRectangle
!= NULL
)
2429 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
2430 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
2434 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
2437 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
2438 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
2439 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2441 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2443 SetLastErrorByStatus ( Status
);
2450 /*--------------------------------------------------------------
2451 * ScrollConsoleScreenBufferW
2458 ScrollConsoleScreenBufferW(
2459 HANDLE hConsoleOutput
,
2460 CONST SMALL_RECT
*lpScrollRectangle
,
2461 CONST SMALL_RECT
*lpClipRectangle
,
2462 COORD dwDestinationOrigin
,
2463 CONST CHAR_INFO
*lpFill
2471 /*--------------------------------------------------------------
2472 * SetConsoleWindowInfo
2479 SetConsoleWindowInfo(
2480 HANDLE hConsoleOutput
,
2482 CONST SMALL_RECT
*lpConsoleWindow
2490 /*--------------------------------------------------------------
2491 * SetConsoleTextAttribute
2498 SetConsoleTextAttribute(
2499 HANDLE hConsoleOutput
,
2503 CSRSS_API_REQUEST Request
;
2504 CSRSS_API_REPLY Reply
;
2507 Request
.Type
= CSRSS_SET_ATTRIB
;
2508 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2509 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
2510 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2511 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2513 SetLastErrorByStatus ( Status
);
2521 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2523 if (HandlerRoutine
== NULL
)
2525 IgnoreCtrlEvents
= TRUE
;
2532 RtlReAllocateHeap(RtlGetProcessHeap(),
2534 (PVOID
)CtrlHandlers
,
2535 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2536 if (CtrlHandlers
== NULL
)
2538 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2541 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
2548 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2552 if (HandlerRoutine
== NULL
)
2554 IgnoreCtrlEvents
= FALSE
;
2559 for (i
= 0; i
< NrCtrlHandlers
; i
++)
2561 if ( ((void*)(CtrlHandlers
[i
])) == (void*)HandlerRoutine
)
2563 CtrlHandlers
[i
] = CtrlHandlers
[NrCtrlHandlers
- 1];
2566 RtlReAllocateHeap(RtlGetProcessHeap(),
2568 (PVOID
)CtrlHandlers
,
2569 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2581 WINBASEAPI BOOL WINAPI
2582 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
2587 RtlEnterCriticalSection(&DllLock
);
2590 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
2594 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
2596 RtlLeaveCriticalSection(&DllLock
);
2601 /*--------------------------------------------------------------
2602 * GenerateConsoleCtrlEvent
2606 WINBASEAPI BOOL WINAPI
2607 GenerateConsoleCtrlEvent(
2609 DWORD dwProcessGroupId
2617 /*--------------------------------------------------------------
2626 LPWSTR lpConsoleTitle
,
2630 CSRSS_API_REQUEST Request
;
2631 PCSRSS_API_REPLY Reply
;
2635 hConsole
= CreateFileW(L
"CONIN$", GENERIC_READ
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2636 if (hConsole
== INVALID_HANDLE_VALUE
)
2641 Reply
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
2644 CloseHandle(hConsole
);
2645 SetLastError(ERROR_OUTOFMEMORY
);
2649 Request
.Type
= CSRSS_GET_TITLE
;
2650 Request
.Data
.GetTitleRequest
.ConsoleHandle
= hConsole
;
2652 Status
= CsrClientCallServer(&Request
, Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
2653 CloseHandle(hConsole
);
2654 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Reply
->Status
)))
2656 SetLastErrorByStatus(Status
);
2657 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
2661 if(nSize
* sizeof(WCHAR
) < Reply
->Data
.GetTitleReply
.Length
)
2663 wcsncpy(lpConsoleTitle
, Reply
->Data
.GetTitleReply
.Title
, nSize
- 1);
2664 lpConsoleTitle
[nSize
--] = L
'\0';
2668 nSize
= Reply
->Data
.GetTitleReply
.Length
/ sizeof (WCHAR
);
2669 wcscpy(lpConsoleTitle
, Reply
->Data
.GetTitleReply
.Title
);
2670 lpConsoleTitle
[nSize
] = L
'\0';
2673 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
2678 /*--------------------------------------------------------------
2689 LPSTR lpConsoleTitle
,
2693 wchar_t WideTitle
[CSRSS_MAX_TITLE_LENGTH
];
2694 DWORD nWideTitle
= sizeof WideTitle
;
2697 if (!lpConsoleTitle
|| !nSize
) return 0;
2698 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
2699 if (!nWideTitle
) return 0;
2701 if ( (nWritten
= WideCharToMultiByte(
2702 CP_ACP
, // ANSI code page
2703 0, // performance and mapping flags
2704 (LPWSTR
) WideTitle
, // address of wide-character string
2705 nWideTitle
, // number of characters in string
2706 lpConsoleTitle
, // address of buffer for new string
2707 nSize
, // size of buffer
2712 lpConsoleTitle
[nWritten
] = '\0';
2720 /*--------------------------------------------------------------
2729 LPCWSTR lpConsoleTitle
2732 PCSRSS_API_REQUEST Request
;
2733 CSRSS_API_REPLY Reply
;
2738 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2739 if (hConsole
== INVALID_HANDLE_VALUE
)
2744 Request
= RtlAllocateHeap(GetProcessHeap(),
2746 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_SET_TITLE_REQUEST
);
2747 if (Request
== NULL
)
2749 CloseHandle(hConsole
);
2750 SetLastError(ERROR_OUTOFMEMORY
);
2754 Request
->Type
= CSRSS_SET_TITLE
;
2755 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
2757 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
2758 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
2760 Request
->Data
.SetTitleRequest
.Title
[c
] = 0;
2761 Request
->Data
.SetTitleRequest
.Length
= c
;
2762 Status
= CsrClientCallServer(Request
,
2764 sizeof(CSRSS_API_REQUEST
) +
2766 sizeof(CSRSS_API_REPLY
));
2767 CloseHandle(hConsole
);
2768 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2770 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2771 SetLastErrorByStatus (Status
);
2774 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2779 /*--------------------------------------------------------------
2790 LPCSTR lpConsoleTitle
2793 PCSRSS_API_REQUEST Request
;
2794 CSRSS_API_REPLY Reply
;
2799 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2800 if (hConsole
== INVALID_HANDLE_VALUE
)
2805 Request
= RtlAllocateHeap(GetProcessHeap(),
2807 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_SET_TITLE_REQUEST
);
2808 if (Request
== NULL
)
2810 CloseHandle(hConsole
);
2811 SetLastError(ERROR_OUTOFMEMORY
);
2815 Request
->Type
= CSRSS_SET_TITLE
;
2816 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
2818 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
2819 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
2821 Request
->Data
.SetTitleRequest
.Title
[c
] = 0;
2822 Request
->Data
.SetTitleRequest
.Length
= c
;
2823 Status
= CsrClientCallServer(Request
,
2825 sizeof(CSRSS_API_REQUEST
) +
2827 sizeof(CSRSS_API_REPLY
));
2828 CloseHandle(hConsole
);
2829 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2831 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2832 SetLastErrorByStatus (Status
);
2835 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2840 /*--------------------------------------------------------------
2849 HANDLE hConsoleInput
,
2851 DWORD nNumberOfCharsToRead
,
2852 LPDWORD lpNumberOfCharsRead
,
2861 /*--------------------------------------------------------------
2870 HANDLE hConsoleOutput
,
2871 CONST VOID
*lpBuffer
,
2872 DWORD nNumberOfCharsToWrite
,
2873 LPDWORD lpNumberOfCharsWritten
,
2878 PCSRSS_API_REQUEST Request
;
2879 CSRSS_API_REPLY Reply
;
2882 Request
= RtlAllocateHeap(GetProcessHeap(),
2884 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
* sizeof(WCHAR
));
2885 if (Request
== NULL
)
2887 SetLastError(ERROR_OUTOFMEMORY
);
2891 Request
->Type
= CSRSS_WRITE_CONSOLE
;
2892 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
2893 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
=
2894 nNumberOfCharsToWrite
;
2895 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
2896 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
2897 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
,
2899 nNumberOfCharsToWrite
* sizeof(WCHAR
));
2901 Status
= CsrClientCallServer(Request
,
2903 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
,
2904 sizeof(CSRSS_API_REPLY
));
2906 RtlFreeHeap(GetProcessHeap(),
2910 if (!NT_SUCCESS(Status
))
2915 if (lpNumberOfCharsWritten
!= NULL
)
2917 *lpNumberOfCharsWritten
=
2918 Reply
.Data
.WriteConsoleReply
.NrCharactersWritten
;
2927 /*--------------------------------------------------------------
2928 * CreateConsoleScreenBuffer
2935 CreateConsoleScreenBuffer(
2936 DWORD dwDesiredAccess
,
2938 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
2940 LPVOID lpScreenBufferData
2943 // FIXME: don't ignore access, share mode, and security
2944 CSRSS_API_REQUEST Request
;
2945 CSRSS_API_REPLY Reply
;
2948 Request
.Type
= CSRSS_CREATE_SCREEN_BUFFER
;
2949 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2950 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2952 SetLastErrorByStatus ( Status
);
2955 return Reply
.Data
.CreateScreenBufferReply
.OutputHandle
;
2959 /*--------------------------------------------------------------
2967 GetConsoleCP( VOID
)
2970 return CP_OEMCP
; /* FIXME */
2974 /*--------------------------------------------------------------
2991 /*--------------------------------------------------------------
2992 * GetConsoleOutputCP
2999 GetConsoleOutputCP( VOID
)
3002 return 0; /* FIXME */
3006 /*--------------------------------------------------------------
3007 * SetConsoleOutputCP
3023 /*--------------------------------------------------------------
3024 * GetConsoleProcessList
3029 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3030 DWORD dwProcessCount
)
3032 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3038 /*--------------------------------------------------------------
3039 * GetConsoleSelectionInfo
3044 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3046 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3052 /*--------------------------------------------------------------
3058 AttachConsole(DWORD dwProcessId
)
3060 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
3064 /*--------------------------------------------------------------
3065 * GetConsoleWindow/0
3070 GetConsoleWindow (VOID
)
3072 CSRSS_API_REQUEST Request
;
3073 CSRSS_API_REPLY Reply
;
3076 Request
.Data
.ConsoleWindowRequest
.ConsoleHandle
=
3077 OpenConsoleW (L
"CONOUT$", (GENERIC_READ
|GENERIC_WRITE
), FALSE
, OPEN_EXISTING
);
3078 if (INVALID_HANDLE_VALUE
== Request
.Data
.ConsoleWindowRequest
.ConsoleHandle
)
3082 Request
.Type
= CSRSS_GET_CONSOLE_WINDOW
;
3083 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
3084 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
3086 SetLastErrorByStatus (Status
);
3089 return Reply
.Data
.ConsoleWindowReply
.WindowHandle
;