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 #define _NOACHS(__X) (sizeof(__X) / sizeof((__X)[0]))
23 extern BOOL WINAPI DefaultConsoleCtrlHandler(DWORD Event);
24 extern __declspec(noreturn) VOID CALLBACK ConsoleControlDispatcher(DWORD CodeAndFlag);
25 extern CRITICAL_SECTION ConsoleLock;
26 extern BOOL WINAPI IsDebuggerPresent(VOID);
29 /* GLOBALS *******************************************************************/
31 static BOOL IgnoreCtrlEvents = FALSE;
33 static PHANDLER_ROUTINE* CtrlHandlers = NULL;
34 static ULONG NrCtrlHandlers = 0;
36 /* Default Console Control Handler *******************************************/
38 BOOL WINAPI DefaultConsoleCtrlHandler(DWORD Event)
43 DPRINT("Ctrl-C Event\n");
47 case CTRL_BREAK_EVENT:
48 DPRINT("Ctrl-Break Event\n");
52 case CTRL_SHUTDOWN_EVENT:
53 DPRINT("Ctrl Shutdown Event\n");
56 case CTRL_CLOSE_EVENT:
57 DPRINT("Ctrl Close Event\n");
60 case CTRL_LOGOFF_EVENT:
61 DPRINT("Ctrl Logoff Event\n");
64 // ExitProcess((UINT)&ExitCode);
69 __declspec(noreturn) VOID CALLBACK ConsoleControlDispatcher(DWORD CodeAndFlag)
72 DWORD nCode = CodeAndFlag & MAXLONG;
75 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
80 case CTRL_BREAK_EVENT:
82 if(IsDebuggerPresent())
84 EXCEPTION_RECORD erException;
85 erException.ExceptionCode =
86 (nCode == CTRL_C_EVENT ? DBG_CONTROL_C : DBG_CONTROL_BREAK);
87 erException.ExceptionFlags = 0;
88 erException.ExceptionRecord = NULL;
89 erException.ExceptionAddress = &DefaultConsoleCtrlHandler;
90 erException.NumberParameters = 0;
91 RtlRaiseException(&erException);
93 RtlEnterCriticalSection(&ConsoleLock);
95 if(!(nCode == CTRL_C_EVENT &&
96 NtCurrentPeb()->ProcessParameters->ProcessGroup & 1))
98 for(i = NrCtrlHandlers; i > 0; -- i)
99 if(CtrlHandlers[i - 1](nCode)) break;
101 RtlLeaveCriticalSection(&ConsoleLock);
104 case CTRL_CLOSE_EVENT:
105 case CTRL_LOGOFF_EVENT:
106 case CTRL_SHUTDOWN_EVENT:
109 default: ExitThread(0);
112 RtlEnterCriticalSection(&ConsoleLock);
114 if(!(nCode == CTRL_C_EVENT &&
115 NtCurrentPeb()->ProcessParameters->ProcessGroup & 1))
120 if (i == 1 && (CodeAndFlag & MINLONG) &&
121 (nCode == CTRL_LOGOFF_EVENT || nCode == CTRL_SHUTDOWN_EVENT))
124 if(CtrlHandlers[i - 1](nCode))
128 case CTRL_CLOSE_EVENT:
129 case CTRL_LOGOFF_EVENT:
130 case CTRL_SHUTDOWN_EVENT:
131 nExitCode = CodeAndFlag;
138 RtlLeaveCriticalSection(&ConsoleLock);
139 ExitThread(nExitCode);
143 /* FUNCTIONS *****************************************************************/
149 AddConsoleAliasA (LPSTR Source,
153 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
162 AddConsoleAliasW (LPWSTR Source,
166 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
175 ConsoleMenuControl (HANDLE hConsole,
182 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
191 DuplicateConsoleHandle (HANDLE hConsole,
192 DWORD dwDesiredAccess,
196 CSRSS_API_REQUEST Request;
197 CSRSS_API_REPLY Reply;
200 if (IsConsoleHandle (hConsole) == FALSE)
202 SetLastError (ERROR_INVALID_PARAMETER);
203 return INVALID_HANDLE_VALUE;
206 Request.Type = CSRSS_DUPLICATE_HANDLE;
207 Request.Data.DuplicateHandleRequest.Handle = hConsole;
208 Request.Data.DuplicateHandleRequest.ProcessId = GetCurrentProcessId();
209 Status = CsrClientCallServer(&Request,
211 sizeof(CSRSS_API_REQUEST),
212 sizeof(CSRSS_API_REPLY));
213 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status=Reply.Status))
215 SetLastErrorByStatus(Status);
216 return INVALID_HANDLE_VALUE;
218 return Reply.Data.DuplicateHandleReply.Handle;
226 ExpungeConsoleCommandHistoryW (DWORD Unknown0)
231 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
240 ExpungeConsoleCommandHistoryA (DWORD Unknown0)
245 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
254 GetConsoleAliasW (DWORD Unknown0,
262 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
271 GetConsoleAliasA (DWORD Unknown0,
279 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
288 GetConsoleAliasExesW (DWORD Unknown0,
294 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
303 GetConsoleAliasExesA (DWORD Unknown0,
309 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
318 GetConsoleAliasExesLengthA (VOID)
323 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
332 GetConsoleAliasExesLengthW (VOID)
337 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
346 GetConsoleAliasesW (DWORD Unknown0,
353 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
362 GetConsoleAliasesA (DWORD Unknown0,
369 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
378 GetConsoleAliasesLengthW (DWORD Unknown0)
383 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
392 GetConsoleAliasesLengthA (DWORD Unknown0)
397 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
406 GetConsoleCommandHistoryW (DWORD Unknown0,
413 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
422 GetConsoleCommandHistoryA (DWORD Unknown0,
429 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
438 GetConsoleCommandHistoryLengthW (DWORD Unknown0)
443 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
452 GetConsoleCommandHistoryLengthA (DWORD Unknown0)
457 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
465 GetConsoleDisplayMode (LPDWORD lpdwMode)
467 * FUNCTION: Get the console display mode
469 * lpdwMode - Address of variable that receives the current value
471 * STATUS: Undocumented
474 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
483 GetConsoleFontInfo (DWORD Unknown0,
491 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
500 GetConsoleFontSize(HANDLE hConsoleOutput,
503 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
512 GetConsoleHardwareState (HANDLE hConsole,
519 CSRSS_API_REQUEST Request;
520 CSRSS_API_REPLY Reply;
523 Request.Type = CSRSS_SETGET_CONSOLE_HW_STATE;
524 Request.Data.ConsoleHardwareStateRequest.ConsoleHandle = hConsole;
525 Request.Data.ConsoleHardwareStateRequest.SetGet = CONSOLE_HARDWARE_STATE_GET;
527 Status = CsrClientCallServer(& Request,
529 sizeof(CSRSS_API_REQUEST),
530 sizeof(CSRSS_API_REPLY));
531 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
533 SetLastErrorByStatus(Status);
536 *State = Reply.Data.ConsoleHardwareStateReply.State;
545 GetConsoleInputWaitHandle (VOID)
550 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
559 GetCurrentConsoleFont(HANDLE hConsoleOutput,
561 PCONSOLE_FONT_INFO lpConsoleCurrentFont)
563 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
572 GetNumberOfConsoleFonts (VOID)
577 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
578 return 1; /* FIXME: call csrss.exe */
586 InvalidateConsoleDIBits (DWORD Unknown0,
592 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
601 OpenConsoleW (LPWSTR wsName,
602 DWORD dwDesiredAccess,
604 DWORD dwCreationDistribution)
609 CSRSS_API_REQUEST Request;
610 CSRSS_API_REPLY Reply;
611 PHANDLE phConsole = NULL;
612 NTSTATUS Status = STATUS_SUCCESS;
615 if(0 == _wcsicmp(wsName, L"CONIN$"))
617 Request.Type = CSRSS_GET_INPUT_HANDLE;
618 phConsole = & Reply.Data.GetInputHandleReply.InputHandle;
620 else if (0 == _wcsicmp(wsName, L"CONOUT$"))
622 Request.Type = CSRSS_GET_OUTPUT_HANDLE;
623 phConsole = & Reply.Data.GetOutputHandleReply.OutputHandle;
627 SetLastError(ERROR_INVALID_PARAMETER);
628 return(INVALID_HANDLE_VALUE);
630 if ((GENERIC_READ|GENERIC_WRITE) != dwDesiredAccess)
632 SetLastError(ERROR_INVALID_PARAMETER);
633 return(INVALID_HANDLE_VALUE);
635 if (OPEN_EXISTING != dwCreationDistribution)
637 SetLastError(ERROR_INVALID_PARAMETER);
638 return(INVALID_HANDLE_VALUE);
640 Status = CsrClientCallServer(& Request,
642 sizeof(CSRSS_API_REQUEST),
643 sizeof(CSRSS_API_REPLY));
644 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
646 SetLastErrorByStatus(Status);
647 return INVALID_HANDLE_VALUE;
657 SetConsoleCommandHistoryMode (DWORD dwMode)
662 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
671 SetConsoleCursor (DWORD Unknown0,
677 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
686 SetConsoleDisplayMode (HANDLE hOut,
690 * FUNCTION: Set the console display mode.
692 * hOut - Standard output handle.
693 * dwNewMode - New mode.
694 * lpdwOldMode - Address of a variable that receives the old mode.
697 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
706 SetConsoleFont (DWORD Unknown0,
712 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
721 SetConsoleHardwareState (HANDLE hConsole,
728 CSRSS_API_REQUEST Request;
729 CSRSS_API_REPLY Reply;
732 Request.Type = CSRSS_SETGET_CONSOLE_HW_STATE;
733 Request.Data.ConsoleHardwareStateRequest.ConsoleHandle = hConsole;
734 Request.Data.ConsoleHardwareStateRequest.SetGet = CONSOLE_HARDWARE_STATE_SET;
735 Request.Data.ConsoleHardwareStateRequest.State = State;
737 Status = CsrClientCallServer(& Request,
739 sizeof(CSRSS_API_REQUEST),
740 sizeof(CSRSS_API_REPLY));
741 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
743 SetLastErrorByStatus(Status);
754 SetConsoleKeyShortcuts (DWORD Unknown0,
762 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
771 SetConsoleMaximumWindowSize (DWORD Unknown0,
777 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
786 SetConsoleMenuClose (DWORD Unknown0)
791 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
800 SetConsoleNumberOfCommandsA (DWORD Unknown0,
806 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
815 SetConsoleNumberOfCommandsW (DWORD Unknown0,
821 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
830 SetConsolePalette (DWORD Unknown0,
837 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
846 SetLastConsoleEventActive (VOID)
851 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
860 ShowConsoleCursor (DWORD Unknown0,
866 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
872 * FUNCTION: Checks whether the given handle is a valid console handle.
874 * Handle - Handle to be checked
876 * TRUE: Handle is a valid console handle
877 * FALSE: Handle is not a valid console handle.
878 * STATUS: Officially undocumented
883 VerifyConsoleIoHandle(HANDLE Handle)
885 CSRSS_API_REQUEST Request;
886 CSRSS_API_REPLY Reply;
889 Request.Type = CSRSS_VERIFY_HANDLE;
890 Request.Data.VerifyHandleRequest.Handle = Handle;
891 Status = CsrClientCallServer(&Request,
893 sizeof(CSRSS_API_REQUEST),
894 sizeof(CSRSS_API_REPLY));
895 if (!NT_SUCCESS(Status))
897 SetLastErrorByStatus(Status);
901 return (BOOL)NT_SUCCESS(Reply.Status);
909 WriteConsoleInputVDMA (DWORD Unknown0,
914 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
923 WriteConsoleInputVDMW (DWORD Unknown0,
928 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
937 CloseConsoleHandle(HANDLE Handle)
942 CSRSS_API_REQUEST Request;
943 CSRSS_API_REPLY Reply;
946 if (IsConsoleHandle (Handle) == FALSE)
948 SetLastError (ERROR_INVALID_PARAMETER);
952 Request.Type = CSRSS_CLOSE_HANDLE;
953 Request.Data.CloseHandleRequest.Handle = Handle;
954 Status = CsrClientCallServer(&Request,
956 sizeof(CSRSS_API_REQUEST),
957 sizeof(CSRSS_API_REPLY));
958 if (!NT_SUCCESS(Status))
960 SetLastErrorByStatus(Status);
972 IsConsoleHandle(HANDLE Handle)
974 if ((((ULONG)Handle) & 0x10000003) == 0x3)
986 GetStdHandle(DWORD nStdHandle)
988 * FUNCTION: Get a handle for the standard input, standard output
989 * and a standard error device.
991 * nStdHandle - Specifies the device for which to return the handle.
992 * RETURNS: If the function succeeds, the return value is the handle
993 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
996 PRTL_USER_PROCESS_PARAMETERS Ppb;
998 Ppb = NtCurrentPeb()->ProcessParameters;
1001 case STD_INPUT_HANDLE:
1002 return Ppb->hStdInput;
1004 case STD_OUTPUT_HANDLE:
1005 return Ppb->hStdOutput;
1007 case STD_ERROR_HANDLE:
1008 return Ppb->hStdError;
1011 SetLastError (ERROR_INVALID_PARAMETER);
1012 return INVALID_HANDLE_VALUE;
1019 WINBASEAPI BOOL WINAPI
1020 SetStdHandle(DWORD nStdHandle,
1023 * FUNCTION: Set the handle for the standard input, standard output or
1024 * the standard error device.
1026 * nStdHandle - Specifies the handle to be set.
1027 * hHandle - The handle to set.
1028 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1031 PRTL_USER_PROCESS_PARAMETERS Ppb;
1033 Ppb = NtCurrentPeb()->ProcessParameters;
1035 /* More checking needed? */
1036 if (hHandle == INVALID_HANDLE_VALUE)
1038 SetLastError (ERROR_INVALID_HANDLE);
1042 SetLastError(ERROR_SUCCESS); /* OK */
1046 case STD_INPUT_HANDLE:
1047 Ppb->hStdInput = hHandle;
1050 case STD_OUTPUT_HANDLE:
1051 Ppb->hStdOutput = hHandle;
1054 case STD_ERROR_HANDLE:
1055 Ppb->hStdError = hHandle;
1059 SetLastError (ERROR_INVALID_PARAMETER);
1064 /*--------------------------------------------------------------
1070 WriteConsoleA(HANDLE hConsoleOutput,
1071 CONST VOID *lpBuffer,
1072 DWORD nNumberOfCharsToWrite,
1073 LPDWORD lpNumberOfCharsWritten,
1076 PCSRSS_API_REQUEST Request;
1077 CSRSS_API_REPLY Reply;
1082 Request = RtlAllocateHeap(GetProcessHeap(),
1084 sizeof(CSRSS_API_REQUEST) +
1085 CSRSS_MAX_WRITE_CONSOLE_REQUEST);
1086 if (Request == NULL)
1088 SetLastError(ERROR_OUTOFMEMORY);
1092 Request->Type = CSRSS_WRITE_CONSOLE;
1093 Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
1094 if (lpNumberOfCharsWritten != NULL)
1095 *lpNumberOfCharsWritten = nNumberOfCharsToWrite;
1096 while (nNumberOfCharsToWrite)
1098 if (nNumberOfCharsToWrite > CSRSS_MAX_WRITE_CONSOLE_REQUEST)
1100 Size = CSRSS_MAX_WRITE_CONSOLE_REQUEST;
1104 Size = nNumberOfCharsToWrite;
1106 Request->Data.WriteConsoleRequest.NrCharactersToWrite = Size;
1108 memcpy(Request->Data.WriteConsoleRequest.Buffer, lpBuffer, Size);
1110 MessageSize = CSRSS_REQUEST_HEADER_SIZE +
1111 sizeof(CSRSS_WRITE_CONSOLE_REQUEST) + Size;
1112 Status = CsrClientCallServer(Request,
1115 sizeof(CSRSS_API_REPLY));
1117 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1119 RtlFreeHeap(GetProcessHeap(), 0, Request);
1120 SetLastErrorByStatus(Status);
1123 nNumberOfCharsToWrite -= Size;
1127 RtlFreeHeap(GetProcessHeap(), 0, Request);
1133 /*--------------------------------------------------------------
1138 WINBOOL STDCALL ReadConsoleA(HANDLE hConsoleInput,
1140 DWORD nNumberOfCharsToRead,
1141 LPDWORD lpNumberOfCharsRead,
1144 CSRSS_API_REQUEST Request;
1145 PCSRSS_API_REPLY Reply;
1147 ULONG CharsRead = 0;
1149 Reply = RtlAllocateHeap(GetProcessHeap(),
1151 sizeof(CSRSS_API_REPLY) + nNumberOfCharsToRead);
1154 SetLastError(ERROR_OUTOFMEMORY);
1158 Request.Type = CSRSS_READ_CONSOLE;
1159 Request.Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
1160 Request.Data.ReadConsoleRequest.NrCharactersToRead = nNumberOfCharsToRead > CSRSS_MAX_READ_CONSOLE_REQUEST ? CSRSS_MAX_READ_CONSOLE_REQUEST : nNumberOfCharsToRead;
1161 Request.Data.ReadConsoleRequest.nCharsCanBeDeleted = 0;
1162 Status = CsrClientCallServer(&Request,
1164 sizeof(CSRSS_API_REQUEST),
1165 sizeof(CSRSS_API_REPLY) +
1166 Request.Data.ReadConsoleRequest.NrCharactersToRead);
1167 if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply->Status ))
1169 DbgPrint( "CSR returned error in ReadConsole\n" );
1170 SetLastErrorByStatus ( Status );
1171 RtlFreeHeap( GetProcessHeap(), 0, Reply );
1174 if( Reply->Status == STATUS_NOTIFY_CLEANUP )
1175 Reply->Status = STATUS_PENDING; // ignore backspace because we have no chars to backspace
1176 /* There may not be any chars or lines to read yet, so wait */
1177 while( Reply->Status == STATUS_PENDING )
1179 /* some chars may have been returned, but not a whole line yet, so recompute buffer and try again */
1180 nNumberOfCharsToRead -= Reply->Data.ReadConsoleReply.NrCharactersRead;
1181 /* don't overflow caller's buffer, even if you still don't have a complete line */
1182 if( !nNumberOfCharsToRead )
1184 Request.Data.ReadConsoleRequest.NrCharactersToRead = nNumberOfCharsToRead > CSRSS_MAX_READ_CONSOLE_REQUEST ? CSRSS_MAX_READ_CONSOLE_REQUEST : nNumberOfCharsToRead;
1185 /* copy any chars already read to buffer */
1186 memcpy( lpBuffer + CharsRead, Reply->Data.ReadConsoleReply.Buffer, Reply->Data.ReadConsoleReply.NrCharactersRead );
1187 CharsRead += Reply->Data.ReadConsoleReply.NrCharactersRead;
1188 /* wait for csrss to signal there is more data to read, but not if we got STATUS_NOTIFY_CLEANUP for backspace */
1189 Status = NtWaitForSingleObject( Reply->Data.ReadConsoleReply.EventHandle, FALSE, 0 );
1190 if( !NT_SUCCESS( Status ) )
1192 DbgPrint( "Wait for console input failed!\n" );
1193 RtlFreeHeap( GetProcessHeap(), 0, Reply );
1196 Request.Data.ReadConsoleRequest.nCharsCanBeDeleted = CharsRead;
1197 Status = CsrClientCallServer( &Request, Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) + Request.Data.ReadConsoleRequest.NrCharactersToRead );
1198 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply->Status ) )
1200 SetLastErrorByStatus ( Status );
1201 RtlFreeHeap( GetProcessHeap(), 0, Reply );
1204 if( Reply->Status == STATUS_NOTIFY_CLEANUP )
1210 nNumberOfCharsToRead++;
1212 Reply->Status = STATUS_PENDING; // retry
1215 /* copy data to buffer, count total returned, and return */
1216 memcpy( lpBuffer + CharsRead, Reply->Data.ReadConsoleReply.Buffer, Reply->Data.ReadConsoleReply.NrCharactersRead );
1217 CharsRead += Reply->Data.ReadConsoleReply.NrCharactersRead;
1218 if (lpNumberOfCharsRead != NULL)
1219 *lpNumberOfCharsRead = CharsRead;
1220 RtlFreeHeap(GetProcessHeap(),
1228 /*--------------------------------------------------------------
1233 WINBOOL STDCALL AllocConsole(VOID)
1235 CSRSS_API_REQUEST Request;
1236 CSRSS_API_REPLY Reply;
1240 if(NtCurrentPeb()->ProcessParameters->hConsole)
1242 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1243 SetLastErrorByStatus (STATUS_OBJECT_EXISTS);
1247 Request.Data.AllocConsoleRequest.CtrlDispatcher = (PCONTROLDISPATCHER) &ConsoleControlDispatcher;
1249 Request.Type = CSRSS_ALLOC_CONSOLE;
1250 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1251 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1253 SetLastErrorByStatus ( Status );
1256 SetStdHandle( STD_INPUT_HANDLE, Reply.Data.AllocConsoleReply.InputHandle );
1257 SetStdHandle( STD_OUTPUT_HANDLE, Reply.Data.AllocConsoleReply.OutputHandle );
1258 hStdError = DuplicateConsoleHandle(Reply.Data.AllocConsoleReply.OutputHandle,
1261 DUPLICATE_SAME_ACCESS);
1262 SetStdHandle( STD_ERROR_HANDLE, hStdError );
1267 /*--------------------------------------------------------------
1272 WINBOOL STDCALL FreeConsole(VOID)
1274 // AG: I'm not sure if this is correct (what happens to std handles?)
1275 // but I just tried to reverse what AllocConsole() does...
1277 CSRSS_API_REQUEST Request;
1278 CSRSS_API_REPLY Reply;
1281 Request.Type = CSRSS_FREE_CONSOLE;
1282 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1283 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1285 SetLastErrorByStatus ( Status );
1293 /*--------------------------------------------------------------
1294 * GetConsoleScreenBufferInfo
1300 GetConsoleScreenBufferInfo(
1301 HANDLE hConsoleOutput,
1302 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
1305 CSRSS_API_REQUEST Request;
1306 CSRSS_API_REPLY Reply;
1309 Request.Type = CSRSS_SCREEN_BUFFER_INFO;
1310 Request.Data.ScreenBufferInfoRequest.ConsoleHandle = hConsoleOutput;
1311 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1312 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1314 SetLastErrorByStatus ( Status );
1317 *lpConsoleScreenBufferInfo = Reply.Data.ScreenBufferInfoReply.Info;
1322 /*--------------------------------------------------------------
1323 * SetConsoleCursorPosition
1329 SetConsoleCursorPosition(
1330 HANDLE hConsoleOutput,
1331 COORD dwCursorPosition
1334 CSRSS_API_REQUEST Request;
1335 CSRSS_API_REPLY Reply;
1338 Request.Type = CSRSS_SET_CURSOR;
1339 Request.Data.SetCursorRequest.ConsoleHandle = hConsoleOutput;
1340 Request.Data.SetCursorRequest.Position = dwCursorPosition;
1341 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1342 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1344 SetLastErrorByStatus ( Status );
1351 /*--------------------------------------------------------------
1352 * FillConsoleOutputCharacterA
1357 FillConsoleOutputCharacterA(
1358 HANDLE hConsoleOutput,
1362 LPDWORD lpNumberOfCharsWritten
1365 CSRSS_API_REQUEST Request;
1366 CSRSS_API_REPLY Reply;
1369 Request.Type = CSRSS_FILL_OUTPUT;
1370 Request.Data.FillOutputRequest.ConsoleHandle = hConsoleOutput;
1371 Request.Data.FillOutputRequest.Char = cCharacter;
1372 Request.Data.FillOutputRequest.Position = dwWriteCoord;
1373 Request.Data.FillOutputRequest.Length = nLength;
1374 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1375 if ( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1377 SetLastErrorByStatus(Status);
1380 if (lpNumberOfCharsWritten != NULL)
1381 *lpNumberOfCharsWritten = nLength;
1386 /*--------------------------------------------------------------
1387 * FillConsoleOutputCharacterW
1393 FillConsoleOutputCharacterW(
1394 HANDLE hConsoleOutput,
1398 LPDWORD lpNumberOfCharsWritten
1406 /*--------------------------------------------------------------
1415 HANDLE hConsoleInput,
1416 PINPUT_RECORD lpBuffer,
1418 LPDWORD lpNumberOfEventsRead
1421 PCSRSS_API_REQUEST Request;
1422 CSRSS_API_REPLY Reply;
1425 PVOID BufferTargetBase;
1428 if(lpBuffer == NULL)
1430 SetLastError(ERROR_INVALID_PARAMETER);
1434 Size = nLength * sizeof(INPUT_RECORD);
1436 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase);
1437 if(!NT_SUCCESS(Status))
1439 SetLastErrorByStatus(Status);
1443 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REQUEST));
1446 CsrReleaseParameterBuffer(BufferBase);
1447 SetLastError(ERROR_OUTOFMEMORY);
1451 Request->Type = CSRSS_PEEK_CONSOLE_INPUT;
1452 Request->Data.PeekConsoleInputRequest.ConsoleHandle = hConsoleInput;
1453 Request->Data.PeekConsoleInputRequest.Length = nLength;
1454 Request->Data.PeekConsoleInputRequest.InputRecord = (INPUT_RECORD*)BufferTargetBase;
1456 Status = CsrClientCallServer(Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
1458 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1460 RtlFreeHeap(GetProcessHeap(), 0, Request);
1461 CsrReleaseParameterBuffer(BufferBase);
1465 memcpy(lpBuffer, BufferBase, sizeof(INPUT_RECORD) * Reply.Data.PeekConsoleInputReply.Length);
1467 if(lpNumberOfEventsRead != NULL)
1468 *lpNumberOfEventsRead = Reply.Data.PeekConsoleInputReply.Length;
1470 RtlFreeHeap(GetProcessHeap(), 0, Request);
1471 CsrReleaseParameterBuffer(BufferBase);
1477 /*--------------------------------------------------------------
1486 HANDLE hConsoleInput,
1487 PINPUT_RECORD lpBuffer,
1489 LPDWORD lpNumberOfEventsRead
1497 /*--------------------------------------------------------------
1502 WINBASEAPI BOOL WINAPI
1503 ReadConsoleInputA(HANDLE hConsoleInput,
1504 PINPUT_RECORD lpBuffer,
1506 LPDWORD lpNumberOfEventsRead)
1508 CSRSS_API_REQUEST Request;
1509 CSRSS_API_REPLY Reply;
1510 DWORD NumEventsRead;
1513 Request.Type = CSRSS_READ_INPUT;
1514 Request.Data.ReadInputRequest.ConsoleHandle = hConsoleInput;
1515 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST),
1516 sizeof(CSRSS_API_REPLY));
1517 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1519 SetLastErrorByStatus(Status);
1523 while (Status == STATUS_PENDING)
1525 Status = NtWaitForSingleObject(Reply.Data.ReadInputReply.Event, FALSE,
1527 if(!NT_SUCCESS(Status))
1529 SetLastErrorByStatus(Status);
1533 Request.Type = CSRSS_READ_INPUT;
1534 Request.Data.ReadInputRequest.ConsoleHandle = hConsoleInput;
1535 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST),
1536 sizeof(CSRSS_API_REPLY));
1537 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1539 SetLastErrorByStatus(Status);
1545 *lpBuffer = Reply.Data.ReadInputReply.Input;
1549 while ((NumEventsRead < nLength) && (Reply.Data.ReadInputReply.MoreEvents))
1551 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST),
1552 sizeof(CSRSS_API_REPLY));
1553 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1555 SetLastErrorByStatus(Status);
1559 if (Status == STATUS_PENDING)
1564 *lpBuffer = Reply.Data.ReadInputReply.Input;
1569 *lpNumberOfEventsRead = NumEventsRead;
1575 /*--------------------------------------------------------------
1584 HANDLE hConsoleInput,
1585 PINPUT_RECORD lpBuffer,
1587 LPDWORD lpNumberOfEventsRead
1595 /*--------------------------------------------------------------
1596 * WriteConsoleInputA
1604 HANDLE hConsoleInput,
1605 CONST INPUT_RECORD *lpBuffer,
1607 LPDWORD lpNumberOfEventsWritten
1610 PCSRSS_API_REQUEST Request;
1611 CSRSS_API_REPLY Reply;
1612 PVOID BufferBase, BufferTargetBase;
1616 if(lpBuffer == NULL)
1618 SetLastError(ERROR_INVALID_PARAMETER);
1622 Size = nLength * sizeof(INPUT_RECORD);
1624 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase);
1625 if(!NT_SUCCESS(Status))
1627 SetLastErrorByStatus(Status);
1631 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REQUEST));
1634 SetLastError(ERROR_OUTOFMEMORY);
1635 CsrReleaseParameterBuffer(BufferBase);
1639 Request->Type = CSRSS_WRITE_CONSOLE_INPUT;
1640 Request->Data.WriteConsoleInputRequest.ConsoleHandle = hConsoleInput;
1641 Request->Data.WriteConsoleInputRequest.Length = nLength;
1642 Request->Data.WriteConsoleInputRequest.InputRecord = (PINPUT_RECORD)BufferTargetBase;
1644 Status = CsrClientCallServer(Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
1645 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1647 RtlFreeHeap(GetProcessHeap(), 0, Request);
1648 CsrReleaseParameterBuffer(BufferBase);
1652 if(lpNumberOfEventsWritten != NULL)
1653 *lpNumberOfEventsWritten = Reply.Data.WriteConsoleInputReply.Length;
1655 RtlFreeHeap(GetProcessHeap(), 0, Request);
1656 CsrReleaseParameterBuffer(BufferBase);
1662 /*--------------------------------------------------------------
1663 * WriteConsoleInputW
1671 HANDLE hConsoleInput,
1672 CONST INPUT_RECORD *lpBuffer,
1674 LPDWORD lpNumberOfEventsWritten
1682 /*--------------------------------------------------------------
1683 * ReadConsoleOutputA
1691 HANDLE hConsoleOutput,
1692 PCHAR_INFO lpBuffer,
1694 COORD dwBufferCoord,
1695 PSMALL_RECT lpReadRegion
1698 PCSRSS_API_REQUEST Request;
1699 CSRSS_API_REPLY Reply;
1701 PVOID BufferTargetBase;
1703 DWORD Size, SizeX, SizeY;
1705 if(lpBuffer == NULL)
1707 SetLastError(ERROR_INVALID_PARAMETER);
1711 Size = dwBufferSize.X * dwBufferSize.Y * sizeof(CHAR_INFO);
1713 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase);
1714 if(!NT_SUCCESS(Status))
1716 SetLastErrorByStatus(Status);
1720 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REQUEST));
1723 SetLastError(ERROR_OUTOFMEMORY);
1724 CsrReleaseParameterBuffer(BufferBase);
1728 Request->Type = CSRSS_READ_CONSOLE_OUTPUT;
1729 Request->Data.ReadConsoleOutputRequest.ConsoleHandle = hConsoleOutput;
1730 Request->Data.ReadConsoleOutputRequest.BufferSize = dwBufferSize;
1731 Request->Data.ReadConsoleOutputRequest.BufferCoord = dwBufferCoord;
1732 Request->Data.ReadConsoleOutputRequest.ReadRegion = *lpReadRegion;
1733 Request->Data.ReadConsoleOutputRequest.CharInfo = (PCHAR_INFO)BufferTargetBase;
1735 Status = CsrClientCallServer(Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
1736 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1738 SetLastErrorByStatus(Status);
1739 RtlFreeHeap(GetProcessHeap(), 0, Request);
1740 CsrReleaseParameterBuffer(BufferBase);
1744 SizeX = Reply.Data.ReadConsoleOutputReply.ReadRegion.Right - Reply.Data.ReadConsoleOutputReply.ReadRegion.Left + 1;
1745 SizeY = Reply.Data.ReadConsoleOutputReply.ReadRegion.Bottom - Reply.Data.ReadConsoleOutputReply.ReadRegion.Top + 1;
1747 memcpy(lpBuffer, BufferBase, sizeof(CHAR_INFO) * SizeX * SizeY);
1748 *lpReadRegion = Reply.Data.ReadConsoleOutputReply.ReadRegion;
1750 RtlFreeHeap(GetProcessHeap(), 0, Request);
1751 CsrReleaseParameterBuffer(BufferBase);
1757 /*--------------------------------------------------------------
1758 * ReadConsoleOutputW
1766 HANDLE hConsoleOutput,
1767 PCHAR_INFO lpBuffer,
1769 COORD dwBufferCoord,
1770 PSMALL_RECT lpReadRegion
1777 /*--------------------------------------------------------------
1778 * WriteConsoleOutputA
1782 WINBASEAPI BOOL WINAPI
1783 WriteConsoleOutputA(HANDLE hConsoleOutput,
1784 CONST CHAR_INFO *lpBuffer,
1786 COORD dwBufferCoord,
1787 PSMALL_RECT lpWriteRegion)
1789 PCSRSS_API_REQUEST Request;
1790 CSRSS_API_REPLY Reply;
1794 PVOID BufferTargetBase;
1796 Size = dwBufferSize.Y * dwBufferSize.X * sizeof(CHAR_INFO);
1798 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer,
1802 if (!NT_SUCCESS(Status))
1804 SetLastErrorByStatus(Status);
1808 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY,
1809 sizeof(CSRSS_API_REQUEST));
1810 if (Request == NULL)
1812 CsrReleaseParameterBuffer(BufferBase);
1813 SetLastError(ERROR_OUTOFMEMORY);
1816 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT;
1817 Request->Data.WriteConsoleOutputRequest.ConsoleHandle = hConsoleOutput;
1818 Request->Data.WriteConsoleOutputRequest.BufferSize = dwBufferSize;
1819 Request->Data.WriteConsoleOutputRequest.BufferCoord = dwBufferCoord;
1820 Request->Data.WriteConsoleOutputRequest.WriteRegion = *lpWriteRegion;
1821 Request->Data.WriteConsoleOutputRequest.CharInfo =
1822 (CHAR_INFO*)BufferTargetBase;
1824 Status = CsrClientCallServer(Request, &Reply,
1825 sizeof(CSRSS_API_REQUEST),
1826 sizeof(CSRSS_API_REPLY));
1827 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1829 CsrReleaseParameterBuffer(BufferBase);
1830 RtlFreeHeap(GetProcessHeap(), 0, Request);
1831 SetLastErrorByStatus(Status);
1835 *lpWriteRegion = Reply.Data.WriteConsoleOutputReply.WriteRegion;
1836 RtlFreeHeap(GetProcessHeap(), 0, Request);
1837 CsrReleaseParameterBuffer(BufferBase);
1842 /*--------------------------------------------------------------
1843 * WriteConsoleOutputW
1850 WriteConsoleOutputW(
1851 HANDLE hConsoleOutput,
1852 CONST CHAR_INFO *lpBuffer,
1854 COORD dwBufferCoord,
1855 PSMALL_RECT lpWriteRegion
1863 /*--------------------------------------------------------------
1864 * ReadConsoleOutputCharacterA
1871 ReadConsoleOutputCharacterA(
1872 HANDLE hConsoleOutput,
1876 LPDWORD lpNumberOfCharsRead
1879 CSRSS_API_REQUEST Request;
1880 PCSRSS_API_REPLY Reply;
1884 Reply = RtlAllocateHeap(GetProcessHeap(),
1886 sizeof(CSRSS_API_REPLY) + CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR);
1889 SetLastError(ERROR_OUTOFMEMORY);
1893 if (lpNumberOfCharsRead != NULL)
1894 *lpNumberOfCharsRead = nLength;
1896 Request.Type = CSRSS_READ_CONSOLE_OUTPUT_CHAR;
1897 Request.Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
1898 Request.Data.ReadConsoleOutputCharRequest.ReadCoord = dwReadCoord;
1900 while (nLength != 0)
1902 if (nLength > CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR)
1903 Size = CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR;
1907 Request.Data.ReadConsoleOutputCharRequest.NumCharsToRead = Size;
1909 Status = CsrClientCallServer(&Request,
1911 sizeof(CSRSS_API_REQUEST),
1912 sizeof(CSRSS_API_REPLY) + Size);
1913 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Reply->Status))
1915 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1916 SetLastErrorByStatus(Status);
1920 memcpy(lpCharacter, &Reply->Data.ReadConsoleOutputCharReply.String[0], Size);
1921 lpCharacter += Size;
1923 Request.Data.ReadConsoleOutputCharRequest.ReadCoord = Reply->Data.ReadConsoleOutputCharReply.EndCoord;
1926 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1932 /*--------------------------------------------------------------
1933 * ReadConsoleOutputCharacterW
1940 ReadConsoleOutputCharacterW(
1941 HANDLE hConsoleOutput,
1945 LPDWORD lpNumberOfCharsRead
1953 /*--------------------------------------------------------------
1954 * ReadConsoleOutputAttribute
1961 ReadConsoleOutputAttribute(
1962 HANDLE hConsoleOutput,
1966 LPDWORD lpNumberOfAttrsRead
1969 CSRSS_API_REQUEST Request;
1970 PCSRSS_API_REPLY Reply;
1974 Reply = RtlAllocateHeap(GetProcessHeap(),
1976 sizeof(CSRSS_API_REPLY) + CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB);
1979 SetLastError(ERROR_OUTOFMEMORY);
1983 if (lpNumberOfAttrsRead != NULL)
1984 *lpNumberOfAttrsRead = nLength;
1986 Request.Type = CSRSS_READ_CONSOLE_OUTPUT_ATTRIB;
1987 Request.Data.ReadConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
1988 Request.Data.ReadConsoleOutputAttribRequest.ReadCoord = dwReadCoord;
1990 while (nLength != 0)
1992 if (nLength > CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB)
1993 Size = CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB;
1997 Request.Data.ReadConsoleOutputAttribRequest.NumAttrsToRead = Size;
1999 Status = CsrClientCallServer(&Request,
2001 sizeof(CSRSS_API_REQUEST),
2002 sizeof(CSRSS_API_REPLY) + Size);
2003 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Reply->Status))
2005 RtlFreeHeap(GetProcessHeap(), 0, Reply);
2006 SetLastErrorByStatus(Status);
2010 // Convert CHARs to WORDs
2011 for(i = 0; i < Size; ++i)
2012 *lpAttribute++ = Reply->Data.ReadConsoleOutputAttribReply.String[i];
2015 Request.Data.ReadConsoleOutputAttribRequest.ReadCoord = Reply->Data.ReadConsoleOutputAttribReply.EndCoord;
2018 RtlFreeHeap(GetProcessHeap(), 0, Reply);
2024 /*--------------------------------------------------------------
2025 * WriteConsoleOutputCharacterA
2029 WINBASEAPI BOOL WINAPI
2030 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput,
2034 LPDWORD lpNumberOfCharsWritten)
2036 PCSRSS_API_REQUEST Request;
2037 CSRSS_API_REPLY Reply;
2041 Request = RtlAllocateHeap(GetProcessHeap(),
2043 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR);
2046 SetLastError( ERROR_OUTOFMEMORY );
2049 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT_CHAR;
2050 Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
2051 Request->Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
2052 if( lpNumberOfCharsWritten )
2053 *lpNumberOfCharsWritten = nLength;
2056 Size = nLength > CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR ? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR : nLength;
2057 Request->Data.WriteConsoleOutputCharRequest.Length = Size;
2058 memcpy( &Request->Data.WriteConsoleOutputCharRequest.String[0],
2061 Status = CsrClientCallServer( Request, &Reply, sizeof( CSRSS_API_REQUEST ) + Size, sizeof( CSRSS_API_REPLY ) );
2062 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2064 RtlFreeHeap( GetProcessHeap(), 0, Request );
2065 SetLastErrorByStatus ( Status );
2069 lpCharacter += Size;
2070 Request->Data.WriteConsoleOutputCharRequest.Coord = Reply.Data.WriteConsoleOutputCharReply.EndCoord;
2073 RtlFreeHeap( GetProcessHeap(), 0, Request );
2078 /*--------------------------------------------------------------
2079 * WriteConsoleOutputCharacterW
2083 WINBASEAPI BOOL WINAPI
2084 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput,
2085 LPCWSTR lpCharacter,
2088 LPDWORD lpNumberOfCharsWritten)
2090 PCSRSS_API_REQUEST Request;
2091 CSRSS_API_REPLY Reply;
2095 Request = RtlAllocateHeap(GetProcessHeap(),
2097 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR);
2100 SetLastError( ERROR_OUTOFMEMORY );
2103 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT_CHAR;
2104 Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
2105 Request->Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
2106 if( lpNumberOfCharsWritten )
2107 *lpNumberOfCharsWritten = nLength;
2110 Size = nLength > CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR ? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR : nLength;
2111 Request->Data.WriteConsoleOutputCharRequest.Length = Size;
2112 Status = RtlUnicodeToOemN (&Request->Data.WriteConsoleOutputCharRequest.String[0],
2115 (PWCHAR)lpCharacter,
2116 Size * sizeof(WCHAR));
2117 if (!NT_SUCCESS(Status))
2119 RtlFreeHeap (GetProcessHeap(), 0, Request);
2120 SetLastErrorByStatus (Status);
2124 Status = CsrClientCallServer( Request, &Reply, sizeof( CSRSS_API_REQUEST ) + Size, sizeof( CSRSS_API_REPLY ) );
2125 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2127 RtlFreeHeap( GetProcessHeap(), 0, Request );
2128 SetLastErrorByStatus ( Status );
2132 lpCharacter += Size;
2133 Request->Data.WriteConsoleOutputCharRequest.Coord = Reply.Data.WriteConsoleOutputCharReply.EndCoord;
2136 RtlFreeHeap( GetProcessHeap(), 0, Request );
2141 /*--------------------------------------------------------------
2142 * WriteConsoleOutputAttribute
2149 WriteConsoleOutputAttribute(
2150 HANDLE hConsoleOutput,
2151 CONST WORD *lpAttribute,
2154 LPDWORD lpNumberOfAttrsWritten
2157 PCSRSS_API_REQUEST Request;
2158 CSRSS_API_REPLY Reply;
2163 Request = RtlAllocateHeap(GetProcessHeap(),
2165 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB);
2168 SetLastError( ERROR_OUTOFMEMORY );
2171 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB;
2172 Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
2173 Request->Data.WriteConsoleOutputAttribRequest.Coord = dwWriteCoord;
2174 if( lpNumberOfAttrsWritten )
2175 *lpNumberOfAttrsWritten = nLength;
2178 Size = nLength > CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB ? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB : nLength;
2179 Request->Data.WriteConsoleOutputAttribRequest.Length = Size;
2180 for( c = 0; c < ( Size * 2 ); c++ )
2181 Request->Data.WriteConsoleOutputAttribRequest.String[c] = (char)lpAttribute[c];
2182 Status = CsrClientCallServer( Request, &Reply, sizeof( CSRSS_API_REQUEST ) + (Size * 2), sizeof( CSRSS_API_REPLY ) );
2183 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2185 RtlFreeHeap( GetProcessHeap(), 0, Request );
2186 SetLastErrorByStatus ( Status );
2190 lpAttribute += Size;
2191 Request->Data.WriteConsoleOutputAttribRequest.Coord = Reply.Data.WriteConsoleOutputAttribReply.EndCoord;
2194 RtlFreeHeap( GetProcessHeap(), 0, Request );
2199 /*--------------------------------------------------------------
2200 * FillConsoleOutputAttribute
2207 FillConsoleOutputAttribute(
2208 HANDLE hConsoleOutput,
2212 LPDWORD lpNumberOfAttrsWritten
2215 CSRSS_API_REQUEST Request;
2216 CSRSS_API_REPLY Reply;
2219 Request.Type = CSRSS_FILL_OUTPUT_ATTRIB;
2220 Request.Data.FillOutputAttribRequest.ConsoleHandle = hConsoleOutput;
2221 Request.Data.FillOutputAttribRequest.Attribute = wAttribute;
2222 Request.Data.FillOutputAttribRequest.Coord = dwWriteCoord;
2223 Request.Data.FillOutputAttribRequest.Length = nLength;
2224 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2225 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2227 SetLastErrorByStatus ( Status );
2230 if( lpNumberOfAttrsWritten )
2231 *lpNumberOfAttrsWritten = nLength;
2236 /*--------------------------------------------------------------
2245 HANDLE hConsoleHandle,
2249 CSRSS_API_REQUEST Request;
2250 CSRSS_API_REPLY Reply;
2253 Request.Type = CSRSS_GET_MODE;
2254 Request.Data.GetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
2255 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2256 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2258 SetLastErrorByStatus ( Status );
2261 *lpMode = Reply.Data.GetConsoleModeReply.ConsoleMode;
2266 /*--------------------------------------------------------------
2267 * GetNumberOfConsoleInputEvents
2274 GetNumberOfConsoleInputEvents(
2275 HANDLE hConsoleInput,
2276 LPDWORD lpNumberOfEvents
2279 CSRSS_API_REQUEST Request;
2280 CSRSS_API_REPLY Reply;
2283 if(lpNumberOfEvents == NULL)
2285 SetLastError(ERROR_INVALID_PARAMETER);
2289 Request.Type = CSRSS_GET_NUM_INPUT_EVENTS;
2290 Request.Data.GetNumInputEventsRequest.ConsoleHandle = hConsoleInput;
2291 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
2292 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
2294 SetLastErrorByStatus(Status);
2298 *lpNumberOfEvents = Reply.Data.GetNumInputEventsReply.NumInputEvents;
2304 /*--------------------------------------------------------------
2305 * GetLargestConsoleWindowSize
2312 GetLargestConsoleWindowSize(
2313 HANDLE hConsoleOutput
2317 COORD Coord = {80,25};
2325 /*--------------------------------------------------------------
2326 * GetConsoleCursorInfo
2333 GetConsoleCursorInfo(
2334 HANDLE hConsoleOutput,
2335 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
2338 CSRSS_API_REQUEST Request;
2339 CSRSS_API_REPLY Reply;
2342 Request.Type = CSRSS_GET_CURSOR_INFO;
2343 Request.Data.GetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
2344 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 );
2351 *lpConsoleCursorInfo = Reply.Data.GetCursorInfoReply.Info;
2356 /*--------------------------------------------------------------
2357 * GetNumberOfConsoleMouseButtons
2364 GetNumberOfConsoleMouseButtons(
2365 LPDWORD lpNumberOfMouseButtons
2373 /*--------------------------------------------------------------
2382 HANDLE hConsoleHandle,
2386 CSRSS_API_REQUEST Request;
2387 CSRSS_API_REPLY Reply;
2390 Request.Type = CSRSS_SET_MODE;
2391 Request.Data.SetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
2392 Request.Data.SetConsoleModeRequest.Mode = dwMode;
2393 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 * SetConsoleActiveScreenBuffer
2411 SetConsoleActiveScreenBuffer(
2412 HANDLE hConsoleOutput
2415 CSRSS_API_REQUEST Request;
2416 CSRSS_API_REPLY Reply;
2419 Request.Type = CSRSS_SET_SCREEN_BUFFER;
2420 Request.Data.SetActiveScreenBufferRequest.OutputHandle = hConsoleOutput;
2421 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2422 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2424 SetLastErrorByStatus ( Status );
2431 /*--------------------------------------------------------------
2432 * FlushConsoleInputBuffer
2439 FlushConsoleInputBuffer(
2440 HANDLE hConsoleInput
2443 CSRSS_API_REQUEST Request;
2444 CSRSS_API_REPLY Reply;
2447 Request.Type = CSRSS_FLUSH_INPUT_BUFFER;
2448 Request.Data.FlushInputBufferRequest.ConsoleInput = hConsoleInput;
2449 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2450 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2452 SetLastErrorByStatus ( Status );
2459 /*--------------------------------------------------------------
2460 * SetConsoleScreenBufferSize
2467 SetConsoleScreenBufferSize(
2468 HANDLE hConsoleOutput,
2476 /*--------------------------------------------------------------
2477 * SetConsoleCursorInfo
2484 SetConsoleCursorInfo(
2485 HANDLE hConsoleOutput,
2486 CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
2489 CSRSS_API_REQUEST Request;
2490 CSRSS_API_REPLY Reply;
2493 Request.Type = CSRSS_SET_CURSOR_INFO;
2494 Request.Data.SetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
2495 Request.Data.SetCursorInfoRequest.Info = *lpConsoleCursorInfo;
2496 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2498 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2500 SetLastErrorByStatus ( Status );
2507 /*--------------------------------------------------------------
2508 * ScrollConsoleScreenBufferA
2515 ScrollConsoleScreenBufferA(
2516 HANDLE hConsoleOutput,
2517 CONST SMALL_RECT *lpScrollRectangle,
2518 CONST SMALL_RECT *lpClipRectangle,
2519 COORD dwDestinationOrigin,
2520 CONST CHAR_INFO *lpFill
2523 CSRSS_API_REQUEST Request;
2524 CSRSS_API_REPLY Reply;
2527 Request.Type = CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER;
2528 Request.Data.ScrollConsoleScreenBufferRequest.ConsoleHandle = hConsoleOutput;
2529 Request.Data.ScrollConsoleScreenBufferRequest.ScrollRectangle = *lpScrollRectangle;
2531 if (lpClipRectangle != NULL)
2533 Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = TRUE;
2534 Request.Data.ScrollConsoleScreenBufferRequest.ClipRectangle = *lpClipRectangle;
2538 Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = FALSE;
2541 Request.Data.ScrollConsoleScreenBufferRequest.DestinationOrigin = dwDestinationOrigin;
2542 Request.Data.ScrollConsoleScreenBufferRequest.Fill = *lpFill;
2543 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2545 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2547 SetLastErrorByStatus ( Status );
2554 /*--------------------------------------------------------------
2555 * ScrollConsoleScreenBufferW
2562 ScrollConsoleScreenBufferW(
2563 HANDLE hConsoleOutput,
2564 CONST SMALL_RECT *lpScrollRectangle,
2565 CONST SMALL_RECT *lpClipRectangle,
2566 COORD dwDestinationOrigin,
2567 CONST CHAR_INFO *lpFill
2575 /*--------------------------------------------------------------
2576 * SetConsoleWindowInfo
2583 SetConsoleWindowInfo(
2584 HANDLE hConsoleOutput,
2586 CONST SMALL_RECT *lpConsoleWindow
2594 /*--------------------------------------------------------------
2595 * SetConsoleTextAttribute
2602 SetConsoleTextAttribute(
2603 HANDLE hConsoleOutput,
2607 CSRSS_API_REQUEST Request;
2608 CSRSS_API_REPLY Reply;
2611 Request.Type = CSRSS_SET_ATTRIB;
2612 Request.Data.SetAttribRequest.ConsoleHandle = hConsoleOutput;
2613 Request.Data.SetAttribRequest.Attrib = wAttributes;
2614 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2615 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2617 SetLastErrorByStatus ( Status );
2625 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine)
2627 if (HandlerRoutine == NULL)
2629 IgnoreCtrlEvents = TRUE;
2636 RtlReAllocateHeap(RtlGetProcessHeap(),
2638 (PVOID)CtrlHandlers,
2639 NrCtrlHandlers * sizeof(PHANDLER_ROUTINE));
2640 if (CtrlHandlers == NULL)
2643 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
2646 CtrlHandlers[NrCtrlHandlers - 1] = HandlerRoutine;
2653 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine)
2657 if (HandlerRoutine == NULL)
2659 IgnoreCtrlEvents = FALSE;
2664 for (i = 0; i < NrCtrlHandlers; i++)
2666 if ( ((void*)(CtrlHandlers[i])) == (void*)HandlerRoutine)
2669 memmove(CtrlHandlers + i, CtrlHandlers + i + 1,
2670 (NrCtrlHandlers - i) * sizeof(PHANDLER_ROUTINE));
2672 RtlReAllocateHeap(RtlGetProcessHeap(),
2674 (PVOID)CtrlHandlers,
2675 NrCtrlHandlers * sizeof(PHANDLER_ROUTINE));
2687 WINBASEAPI BOOL WINAPI
2688 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine,
2693 RtlEnterCriticalSection(&DllLock);
2696 Ret = AddConsoleCtrlHandler(HandlerRoutine);
2700 Ret = RemoveConsoleCtrlHandler(HandlerRoutine);
2702 RtlLeaveCriticalSection(&DllLock);
2707 /*--------------------------------------------------------------
2708 * GenerateConsoleCtrlEvent
2712 WINBASEAPI BOOL WINAPI
2713 GenerateConsoleCtrlEvent(
2715 DWORD dwProcessGroupId
2723 /*--------------------------------------------------------------
2732 LPWSTR lpConsoleTitle,
2736 CSRSS_API_REQUEST Request;
2737 PCSRSS_API_REPLY Reply;
2741 hConsole = CreateFileW(L"CONIN$", GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2742 if (hConsole == INVALID_HANDLE_VALUE)
2747 Reply = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REPLY) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
2750 CloseHandle(hConsole);
2751 SetLastError(ERROR_OUTOFMEMORY);
2755 Request.Type = CSRSS_GET_TITLE;
2756 Request.Data.GetTitleRequest.ConsoleHandle = hConsole;
2758 Status = CsrClientCallServer(&Request, Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
2759 CloseHandle(hConsole);
2760 if(!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Reply->Status)))
2762 SetLastErrorByStatus(Status);
2763 RtlFreeHeap(GetProcessHeap(), 0, Reply);
2767 if(nSize * sizeof(WCHAR) < Reply->Data.GetTitleReply.Length)
2769 wcsncpy(lpConsoleTitle, Reply->Data.GetTitleReply.Title, nSize - 1);
2770 lpConsoleTitle[nSize--] = L'\0';
2774 nSize = Reply->Data.GetTitleReply.Length / sizeof (WCHAR);
2775 wcscpy(lpConsoleTitle, Reply->Data.GetTitleReply.Title);
2776 lpConsoleTitle[nSize] = L'\0';
2779 RtlFreeHeap(GetProcessHeap(), 0, Reply);
2784 /*--------------------------------------------------------------
2795 LPSTR lpConsoleTitle,
2799 wchar_t WideTitle [CSRSS_MAX_TITLE_LENGTH];
2800 DWORD nWideTitle = sizeof WideTitle;
2803 if (!lpConsoleTitle || !nSize) return 0;
2804 nWideTitle = GetConsoleTitleW( (LPWSTR) WideTitle, nWideTitle );
2805 if (!nWideTitle) return 0;
2807 if ( (nWritten = WideCharToMultiByte(
2808 CP_ACP, // ANSI code page
2809 0, // performance and mapping flags
2810 (LPWSTR) WideTitle, // address of wide-character string
2811 nWideTitle, // number of characters in string
2812 lpConsoleTitle, // address of buffer for new string
2813 nSize, // size of buffer
2818 lpConsoleTitle[nWritten] = '\0';
2826 /*--------------------------------------------------------------
2835 LPCWSTR lpConsoleTitle
2838 PCSRSS_API_REQUEST Request;
2839 CSRSS_API_REPLY Reply;
2844 hConsole = CreateFileW(L"CONIN$", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2845 if (hConsole == INVALID_HANDLE_VALUE)
2850 Request = RtlAllocateHeap(GetProcessHeap(),
2852 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_SET_TITLE_REQUEST);
2853 if (Request == NULL)
2855 CloseHandle(hConsole);
2856 SetLastError(ERROR_OUTOFMEMORY);
2860 Request->Type = CSRSS_SET_TITLE;
2861 Request->Data.SetTitleRequest.Console = hConsole;
2863 for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
2864 Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
2866 Request->Data.SetTitleRequest.Title[c] = 0;
2867 Request->Data.SetTitleRequest.Length = c;
2868 Status = CsrClientCallServer(Request,
2870 sizeof(CSRSS_API_REQUEST) +
2872 sizeof(CSRSS_API_REPLY));
2873 CloseHandle(hConsole);
2874 if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply.Status ) )
2876 RtlFreeHeap( GetProcessHeap(), 0, Request );
2877 SetLastErrorByStatus (Status);
2880 RtlFreeHeap( GetProcessHeap(), 0, Request );
2885 /*--------------------------------------------------------------
2896 LPCSTR lpConsoleTitle
2899 PCSRSS_API_REQUEST Request;
2900 CSRSS_API_REPLY Reply;
2905 hConsole = CreateFileW(L"CONIN$", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2906 if (hConsole == INVALID_HANDLE_VALUE)
2911 Request = RtlAllocateHeap(GetProcessHeap(),
2913 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_SET_TITLE_REQUEST);
2914 if (Request == NULL)
2916 CloseHandle(hConsole);
2917 SetLastError(ERROR_OUTOFMEMORY);
2921 Request->Type = CSRSS_SET_TITLE;
2922 Request->Data.SetTitleRequest.Console = hConsole;
2924 for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
2925 Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
2927 Request->Data.SetTitleRequest.Title[c] = 0;
2928 Request->Data.SetTitleRequest.Length = c;
2929 Status = CsrClientCallServer(Request,
2931 sizeof(CSRSS_API_REQUEST) +
2933 sizeof(CSRSS_API_REPLY));
2934 CloseHandle(hConsole);
2935 if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply.Status ) )
2937 RtlFreeHeap( GetProcessHeap(), 0, Request );
2938 SetLastErrorByStatus (Status);
2941 RtlFreeHeap( GetProcessHeap(), 0, Request );
2946 /*--------------------------------------------------------------
2955 HANDLE hConsoleInput,
2957 DWORD nNumberOfCharsToRead,
2958 LPDWORD lpNumberOfCharsRead,
2967 /*--------------------------------------------------------------
2976 HANDLE hConsoleOutput,
2977 CONST VOID *lpBuffer,
2978 DWORD nNumberOfCharsToWrite,
2979 LPDWORD lpNumberOfCharsWritten,
2984 PCSRSS_API_REQUEST Request;
2985 CSRSS_API_REPLY Reply;
2988 Request = RtlAllocateHeap(GetProcessHeap(),
2990 sizeof(CSRSS_API_REQUEST) + nNumberOfCharsToWrite * sizeof(WCHAR));
2991 if (Request == NULL)
2993 SetLastError(ERROR_OUTOFMEMORY);
2997 Request->Type = CSRSS_WRITE_CONSOLE;
2998 Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
2999 Request->Data.WriteConsoleRequest.NrCharactersToWrite =
3000 nNumberOfCharsToWrite;
3001 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
3002 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
3003 memcpy(Request->Data.WriteConsoleRequest.Buffer,
3005 nNumberOfCharsToWrite * sizeof(WCHAR));
3007 Status = CsrClientCallServer(Request,
3009 sizeof(CSRSS_API_REQUEST) + nNumberOfCharsToWrite,
3010 sizeof(CSRSS_API_REPLY));
3012 RtlFreeHeap(GetProcessHeap(),
3016 if (!NT_SUCCESS(Status))
3021 if (lpNumberOfCharsWritten != NULL)
3023 *lpNumberOfCharsWritten =
3024 Reply.Data.WriteConsoleReply.NrCharactersWritten;
3033 /*--------------------------------------------------------------
3034 * CreateConsoleScreenBuffer
3041 CreateConsoleScreenBuffer(
3042 DWORD dwDesiredAccess,
3044 CONST SECURITY_ATTRIBUTES *lpSecurityAttributes,
3046 LPVOID lpScreenBufferData
3049 // FIXME: don't ignore access, share mode, and security
3050 CSRSS_API_REQUEST Request;
3051 CSRSS_API_REPLY Reply;
3054 Request.Type = CSRSS_CREATE_SCREEN_BUFFER;
3055 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
3056 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
3058 SetLastErrorByStatus ( Status );
3061 return Reply.Data.CreateScreenBufferReply.OutputHandle;
3065 /*--------------------------------------------------------------
3073 GetConsoleCP( VOID )
3076 return CP_OEMCP; /* FIXME */
3080 /*--------------------------------------------------------------
3097 /*--------------------------------------------------------------
3098 * GetConsoleOutputCP
3105 GetConsoleOutputCP( VOID )
3108 return 0; /* FIXME */
3112 /*--------------------------------------------------------------
3113 * SetConsoleOutputCP
3129 /*--------------------------------------------------------------
3130 * GetConsoleProcessList
3135 GetConsoleProcessList(LPDWORD lpdwProcessList,
3136 DWORD dwProcessCount)
3138 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
3144 /*--------------------------------------------------------------
3145 * GetConsoleSelectionInfo
3150 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo)
3152 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
3158 /*--------------------------------------------------------------
3164 AttachConsole(DWORD dwProcessId)
3166 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
3170 /*--------------------------------------------------------------
3171 * GetConsoleWindow/0
3176 GetConsoleWindow (VOID)
3178 CSRSS_API_REQUEST Request;
3179 CSRSS_API_REPLY Reply;
3182 Request.Data.ConsoleWindowRequest.ConsoleHandle =
3183 OpenConsoleW (L"CONOUT$", (GENERIC_READ|GENERIC_WRITE), FALSE, OPEN_EXISTING);
3184 if (INVALID_HANDLE_VALUE == Request.Data.ConsoleWindowRequest.ConsoleHandle)
3188 Request.Type = CSRSS_GET_CONSOLE_WINDOW;
3189 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
3190 if (!NT_SUCCESS(Status ) || !NT_SUCCESS(Status = Reply.Status))
3192 SetLastErrorByStatus (Status);
3195 return Reply.Data.ConsoleWindowReply.WindowHandle;