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
10 * 19990204 EA SetConsoleTitleA
14 /* INCLUDES ******************************************************************/
19 #include <kernel32/kernel32.h>
21 /* GLOBALS *******************************************************************/
23 static BOOL IgnoreCtrlEvents = FALSE;
24 static ULONG NrCtrlHandlers = 0;
25 static PHANDLER_ROUTINE* CtrlHandlers = NULL;
27 /* FUNCTIONS *****************************************************************/
30 AddConsoleAliasA (LPSTR Source,
34 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
39 AddConsoleAliasW (LPWSTR Source,
43 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
48 ConsoleMenuControl (HANDLE hConsole,
55 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
60 DuplicateConsoleHandle (HANDLE hConsole,
68 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
73 ExpungeConsoleCommandHistoryW (DWORD Unknown0)
78 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
84 ExpungeConsoleCommandHistoryA (DWORD Unknown0)
89 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
94 GetConsoleAliasW (DWORD Unknown0,
102 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
108 GetConsoleAliasA (DWORD Unknown0,
116 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
121 GetConsoleAliasExesW (DWORD Unknown0,
127 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
134 GetConsoleAliasExesA (DWORD Unknown0,
140 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
147 GetConsoleAliasExesLengthA (VOID)
152 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
157 GetConsoleAliasExesLengthW (VOID)
162 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
167 GetConsoleAliasesW (DWORD Unknown0,
174 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
179 GetConsoleAliasesA (DWORD Unknown0,
186 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
191 GetConsoleAliasesLengthW (DWORD Unknown0)
196 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
201 GetConsoleAliasesLengthA (DWORD Unknown0)
206 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
211 GetConsoleCommandHistoryW (DWORD Unknown0,
218 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
223 GetConsoleCommandHistoryA (DWORD Unknown0,
230 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
235 GetConsoleCommandHistoryLengthW (DWORD Unknown0)
240 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
245 GetConsoleCommandHistoryLengthA (DWORD Unknown0)
250 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
255 GetConsoleDisplayMode (LPDWORD lpdwMode)
257 * FUNCTION: Get the console display mode
259 * lpdwMode - Address of variable that receives the current value
261 * STATUS: Undocumented
264 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
269 GetConsoleFontInfo (DWORD Unknown0,
277 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
282 GetConsoleFontSize(HANDLE hConsoleOutput,
285 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
290 GetConsoleHardwareState (DWORD Unknown0,
297 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
302 GetConsoleInputWaitHandle (VOID)
307 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
312 GetCurrentConsoleFont(HANDLE hConsoleOutput,
314 PCONSOLE_FONT_INFO lpConsoleCurrentFont)
316 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
321 GetNumberOfConsoleFonts (VOID)
326 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
327 return 1; /* FIXME: call csrss.exe */
331 InvalidateConsoleDIBits (DWORD Unknown0,
337 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
342 OpenConsoleW (DWORD Unknown0,
350 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
355 SetConsoleCommandHistoryMode (DWORD dwMode)
360 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
365 SetConsoleCursor (DWORD Unknown0,
371 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
376 SetConsoleDisplayMode (HANDLE hOut,
380 * FUNCTION: Set the console display mode.
382 * hOut - Standard output handle.
383 * dwNewMode - New mode.
384 * lpdwOldMode - Address of a variable that receives the old mode.
387 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
392 SetConsoleFont (DWORD Unknown0,
398 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
403 SetConsoleHardwareState (DWORD Unknown0,
410 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
415 SetConsoleKeyShortcuts (DWORD Unknown0,
423 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
428 SetConsoleMaximumWindowSize (DWORD Unknown0,
434 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
439 SetConsoleMenuClose (DWORD Unknown0)
444 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
449 SetConsoleNumberOfCommandsA (DWORD Unknown0,
455 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
460 SetConsoleNumberOfCommandsW (DWORD Unknown0,
466 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
471 SetConsolePalette (DWORD Unknown0,
478 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
483 SetLastConsoleEventActive (VOID)
488 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
493 ShowConsoleCursor (DWORD Unknown0,
499 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
504 VerifyConsoleIoHandle (DWORD Unknown0)
509 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
514 WriteConsoleInputVDMA (DWORD Unknown0,
519 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
524 WriteConsoleInputVDMW (DWORD Unknown0,
529 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
534 CloseConsoleHandle(HANDLE Handle)
539 if (IsConsoleHandle (Handle) == FALSE)
541 SetLastError (ERROR_INVALID_PARAMETER);
544 /* FIXME: call CSRSS */
545 return TRUE/*FALSE*/;
549 IsConsoleHandle(HANDLE Handle)
551 if ((((ULONG)Handle) & 0x10000003) == 0x3)
559 GetStdHandle(DWORD nStdHandle)
561 * FUNCTION: Get a handle for the standard input, standard output
562 * and a standard error device.
564 * nStdHandle - Specifies the device for which to return the handle.
565 * RETURNS: If the function succeeds, the return value is the handle
566 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
569 PRTL_USER_PROCESS_PARAMETERS Ppb;
571 Ppb = NtCurrentPeb()->ProcessParameters;
574 case STD_INPUT_HANDLE: return Ppb->hStdInput;
575 case STD_OUTPUT_HANDLE: return Ppb->hStdOutput;
576 case STD_ERROR_HANDLE: return Ppb->hStdError;
578 SetLastError (ERROR_INVALID_PARAMETER);
579 return INVALID_HANDLE_VALUE;
582 WINBASEAPI BOOL WINAPI
583 SetStdHandle(DWORD nStdHandle,
586 * FUNCTION: Set the handle for the standard input, standard output or
587 * the standard error device.
589 * nStdHandle - Specifies the handle to be set.
590 * hHandle - The handle to set.
591 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
594 PRTL_USER_PROCESS_PARAMETERS Ppb;
596 Ppb = NtCurrentPeb()->ProcessParameters;
598 /* More checking needed? */
599 if (hHandle == INVALID_HANDLE_VALUE)
601 SetLastError (ERROR_INVALID_HANDLE);
605 SetLastError(ERROR_SUCCESS); /* OK */
608 case STD_INPUT_HANDLE:
609 Ppb->hStdInput = hHandle;
611 case STD_OUTPUT_HANDLE:
612 Ppb->hStdOutput = hHandle;
614 case STD_ERROR_HANDLE:
615 Ppb->hStdError = hHandle;
618 SetLastError (ERROR_INVALID_PARAMETER);
623 /*--------------------------------------------------------------
627 WriteConsoleA(HANDLE hConsoleOutput,
628 CONST VOID *lpBuffer,
629 DWORD nNumberOfCharsToWrite,
630 LPDWORD lpNumberOfCharsWritten,
633 PCSRSS_API_REQUEST Request;
634 CSRSS_API_REPLY Reply;
639 Request = RtlAllocateHeap(GetProcessHeap(),
641 sizeof(CSRSS_API_REQUEST) +
642 CSRSS_MAX_WRITE_CONSOLE_REQUEST);
645 SetLastError(ERROR_OUTOFMEMORY);
649 Request->Type = CSRSS_WRITE_CONSOLE;
650 Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
651 if (lpNumberOfCharsWritten != NULL)
652 *lpNumberOfCharsWritten = nNumberOfCharsToWrite;
653 while (nNumberOfCharsToWrite)
655 if (nNumberOfCharsToWrite > CSRSS_MAX_WRITE_CONSOLE_REQUEST)
657 Size = CSRSS_MAX_WRITE_CONSOLE_REQUEST;
661 Size = nNumberOfCharsToWrite;
663 Request->Data.WriteConsoleRequest.NrCharactersToWrite = Size;
665 memcpy(Request->Data.WriteConsoleRequest.Buffer, lpBuffer, Size);
667 MessageSize = CSRSS_REQUEST_HEADER_SIZE +
668 sizeof(CSRSS_WRITE_CONSOLE_REQUEST) + Size;
669 Status = CsrClientCallServer(Request,
672 sizeof(CSRSS_API_REPLY));
674 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
676 RtlFreeHeap(GetProcessHeap(), 0, Request);
677 SetLastErrorByStatus(Status);
680 nNumberOfCharsToWrite -= Size;
683 RtlFreeHeap(GetProcessHeap(), 0, Request);
688 /*--------------------------------------------------------------
691 WINBOOL STDCALL ReadConsoleA(HANDLE hConsoleInput,
693 DWORD nNumberOfCharsToRead,
694 LPDWORD lpNumberOfCharsRead,
697 CSRSS_API_REQUEST Request;
698 PCSRSS_API_REPLY Reply;
702 Reply = RtlAllocateHeap(GetProcessHeap(),
704 sizeof(CSRSS_API_REPLY) + nNumberOfCharsToRead);
707 SetLastError(ERROR_OUTOFMEMORY);
711 Request.Type = CSRSS_READ_CONSOLE;
712 Request.Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
713 Request.Data.ReadConsoleRequest.NrCharactersToRead = nNumberOfCharsToRead > CSRSS_MAX_READ_CONSOLE_REQUEST ? CSRSS_MAX_READ_CONSOLE_REQUEST : nNumberOfCharsToRead;
714 Request.Data.ReadConsoleRequest.nCharsCanBeDeleted = 0;
715 Status = CsrClientCallServer(&Request,
717 sizeof(CSRSS_API_REQUEST),
718 sizeof(CSRSS_API_REPLY) +
719 Request.Data.ReadConsoleRequest.NrCharactersToRead);
720 if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply->Status ))
722 DbgPrint( "CSR returned error in ReadConsole\n" );
723 SetLastErrorByStatus ( Status );
724 RtlFreeHeap( GetProcessHeap(), 0, Reply );
727 if( Reply->Status == STATUS_NOTIFY_CLEANUP )
728 Reply->Status = STATUS_PENDING; // ignore backspace because we have no chars to backspace
729 /* There may not be any chars or lines to read yet, so wait */
730 while( Reply->Status == STATUS_PENDING )
732 /* some chars may have been returned, but not a whole line yet, so recompute buffer and try again */
733 nNumberOfCharsToRead -= Reply->Data.ReadConsoleReply.NrCharactersRead;
734 /* don't overflow caller's buffer, even if you still don't have a complete line */
735 if( !nNumberOfCharsToRead )
737 Request.Data.ReadConsoleRequest.NrCharactersToRead = nNumberOfCharsToRead > CSRSS_MAX_READ_CONSOLE_REQUEST ? CSRSS_MAX_READ_CONSOLE_REQUEST : nNumberOfCharsToRead;
738 /* copy any chars already read to buffer */
739 memcpy( lpBuffer + CharsRead, Reply->Data.ReadConsoleReply.Buffer, Reply->Data.ReadConsoleReply.NrCharactersRead );
740 CharsRead += Reply->Data.ReadConsoleReply.NrCharactersRead;
741 /* wait for csrss to signal there is more data to read, but not if we got STATUS_NOTIFY_CLEANUP for backspace */
742 Status = NtWaitForSingleObject( Reply->Data.ReadConsoleReply.EventHandle, FALSE, 0 );
743 if( !NT_SUCCESS( Status ) )
745 DbgPrint( "Wait for console input failed!\n" );
746 RtlFreeHeap( GetProcessHeap(), 0, Reply );
749 Request.Data.ReadConsoleRequest.nCharsCanBeDeleted = CharsRead;
750 Status = CsrClientCallServer( &Request, Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) + Request.Data.ReadConsoleRequest.NrCharactersToRead );
751 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply->Status ) )
753 SetLastErrorByStatus ( Status );
754 RtlFreeHeap( GetProcessHeap(), 0, Reply );
757 if( Reply->Status == STATUS_NOTIFY_CLEANUP )
763 nNumberOfCharsToRead++;
765 Reply->Status = STATUS_PENDING; // retry
768 /* copy data to buffer, count total returned, and return */
769 memcpy( lpBuffer + CharsRead, Reply->Data.ReadConsoleReply.Buffer, Reply->Data.ReadConsoleReply.NrCharactersRead );
770 CharsRead += Reply->Data.ReadConsoleReply.NrCharactersRead;
771 if (lpNumberOfCharsRead != NULL)
772 *lpNumberOfCharsRead = CharsRead;
773 RtlFreeHeap(GetProcessHeap(),
781 /*--------------------------------------------------------------
784 WINBOOL STDCALL AllocConsole(VOID)
786 CSRSS_API_REQUEST Request;
787 CSRSS_API_REPLY Reply;
790 Request.Type = CSRSS_ALLOC_CONSOLE;
791 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
792 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
794 SetLastErrorByStatus ( Status );
797 SetStdHandle( STD_INPUT_HANDLE, Reply.Data.AllocConsoleReply.InputHandle );
798 SetStdHandle( STD_OUTPUT_HANDLE, Reply.Data.AllocConsoleReply.OutputHandle );
799 SetStdHandle( STD_ERROR_HANDLE, Reply.Data.AllocConsoleReply.OutputHandle );
804 /*--------------------------------------------------------------
807 WINBOOL STDCALL FreeConsole(VOID)
809 DbgPrint("FreeConsole() is unimplemented\n");
814 /*--------------------------------------------------------------
815 * GetConsoleScreenBufferInfo
819 GetConsoleScreenBufferInfo(
820 HANDLE hConsoleOutput,
821 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
824 CSRSS_API_REQUEST Request;
825 CSRSS_API_REPLY Reply;
828 Request.Type = CSRSS_SCREEN_BUFFER_INFO;
829 Request.Data.ScreenBufferInfoRequest.ConsoleHandle = hConsoleOutput;
830 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
831 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
833 SetLastErrorByStatus ( Status );
836 *lpConsoleScreenBufferInfo = Reply.Data.ScreenBufferInfoReply.Info;
841 /*--------------------------------------------------------------
842 * SetConsoleCursorPosition
846 SetConsoleCursorPosition(
847 HANDLE hConsoleOutput,
848 COORD dwCursorPosition
851 CSRSS_API_REQUEST Request;
852 CSRSS_API_REPLY Reply;
855 Request.Type = CSRSS_SET_CURSOR;
856 Request.Data.SetCursorRequest.ConsoleHandle = hConsoleOutput;
857 Request.Data.SetCursorRequest.Position = dwCursorPosition;
858 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
859 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
861 SetLastErrorByStatus ( Status );
868 /*--------------------------------------------------------------
869 * FillConsoleOutputCharacterA
872 FillConsoleOutputCharacterA(
873 HANDLE hConsoleOutput,
877 LPDWORD lpNumberOfCharsWritten
880 CSRSS_API_REQUEST Request;
881 CSRSS_API_REPLY Reply;
884 Request.Type = CSRSS_FILL_OUTPUT;
885 Request.Data.FillOutputRequest.ConsoleHandle = hConsoleOutput;
886 Request.Data.FillOutputRequest.Char = cCharacter;
887 Request.Data.FillOutputRequest.Position = dwWriteCoord;
888 Request.Data.FillOutputRequest.Length = nLength;
889 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
890 if ( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
892 SetLastErrorByStatus(Status);
895 if (lpNumberOfCharsWritten != NULL)
896 *lpNumberOfCharsWritten = nLength;
901 /*--------------------------------------------------------------
902 * FillConsoleOutputCharacterW
906 FillConsoleOutputCharacterW(
907 HANDLE hConsoleOutput,
911 LPDWORD lpNumberOfCharsWritten
919 /*--------------------------------------------------------------
926 HANDLE hConsoleInput,
927 PINPUT_RECORD lpBuffer,
929 LPDWORD lpNumberOfEventsRead
932 PCSRSS_API_REQUEST Request;
933 CSRSS_API_REPLY Reply;
936 PVOID BufferTargetBase;
941 SetLastError(ERROR_INVALID_PARAMETER);
945 Size = nLength * sizeof(INPUT_RECORD);
947 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase);
948 if(!NT_SUCCESS(Status))
950 SetLastErrorByStatus(Status);
954 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REQUEST));
957 CsrReleaseParameterBuffer(BufferBase);
958 SetLastError(ERROR_OUTOFMEMORY);
962 Request->Type = CSRSS_PEEK_CONSOLE_INPUT;
963 Request->Data.PeekConsoleInputRequest.ConsoleHandle = hConsoleInput;
964 Request->Data.PeekConsoleInputRequest.Length = nLength;
965 Request->Data.PeekConsoleInputRequest.InputRecord = (INPUT_RECORD*)BufferTargetBase;
967 Status = CsrClientCallServer(Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
969 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
971 RtlFreeHeap(GetProcessHeap(), 0, Request);
972 CsrReleaseParameterBuffer(BufferBase);
976 memcpy(lpBuffer, BufferBase, sizeof(INPUT_RECORD) * Reply.Data.PeekConsoleInputReply.Length);
978 if(lpNumberOfEventsRead != NULL)
979 *lpNumberOfEventsRead = Reply.Data.PeekConsoleInputReply.Length;
981 RtlFreeHeap(GetProcessHeap(), 0, Request);
982 CsrReleaseParameterBuffer(BufferBase);
988 /*--------------------------------------------------------------
995 HANDLE hConsoleInput,
996 PINPUT_RECORD lpBuffer,
998 LPDWORD lpNumberOfEventsRead
1006 /*--------------------------------------------------------------
1009 WINBASEAPI BOOL WINAPI
1010 ReadConsoleInputA(HANDLE hConsoleInput,
1011 PINPUT_RECORD lpBuffer,
1013 LPDWORD lpNumberOfEventsRead)
1015 CSRSS_API_REQUEST Request;
1016 CSRSS_API_REPLY Reply;
1017 DWORD NumEventsRead;
1020 Request.Type = CSRSS_READ_INPUT;
1021 Request.Data.ReadInputRequest.ConsoleHandle = hConsoleInput;
1022 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST),
1023 sizeof(CSRSS_API_REPLY));
1024 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1026 SetLastErrorByStatus(Status);
1030 while (Status == STATUS_PENDING)
1032 Status = NtWaitForSingleObject(Reply.Data.ReadInputReply.Event, FALSE,
1034 if(!NT_SUCCESS(Status))
1036 SetLastErrorByStatus(Status);
1040 Request.Type = CSRSS_READ_INPUT;
1041 Request.Data.ReadInputRequest.ConsoleHandle = hConsoleInput;
1042 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST),
1043 sizeof(CSRSS_API_REPLY));
1044 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1046 SetLastErrorByStatus(Status);
1052 *lpBuffer = Reply.Data.ReadInputReply.Input;
1056 while ((NumEventsRead < nLength) && (Reply.Data.ReadInputReply.MoreEvents))
1058 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST),
1059 sizeof(CSRSS_API_REPLY));
1060 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1062 SetLastErrorByStatus(Status);
1066 if (Status == STATUS_PENDING)
1071 *lpBuffer = Reply.Data.ReadInputReply.Input;
1076 *lpNumberOfEventsRead = NumEventsRead;
1082 /*--------------------------------------------------------------
1089 HANDLE hConsoleInput,
1090 PINPUT_RECORD lpBuffer,
1092 LPDWORD lpNumberOfEventsRead
1100 /*--------------------------------------------------------------
1101 * WriteConsoleInputA
1107 HANDLE hConsoleInput,
1108 CONST INPUT_RECORD *lpBuffer,
1110 LPDWORD lpNumberOfEventsWritten
1113 PCSRSS_API_REQUEST Request;
1114 CSRSS_API_REPLY Reply;
1115 PVOID BufferBase, BufferTargetBase;
1119 if(lpBuffer == NULL)
1121 SetLastError(ERROR_INVALID_PARAMETER);
1125 Size = nLength * sizeof(INPUT_RECORD);
1127 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase);
1128 if(!NT_SUCCESS(Status))
1130 SetLastErrorByStatus(Status);
1134 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REQUEST));
1137 SetLastError(ERROR_OUTOFMEMORY);
1138 CsrReleaseParameterBuffer(BufferBase);
1142 Request->Type = CSRSS_WRITE_CONSOLE_INPUT;
1143 Request->Data.WriteConsoleInputRequest.ConsoleHandle = hConsoleInput;
1144 Request->Data.WriteConsoleInputRequest.Length = nLength;
1145 Request->Data.WriteConsoleInputRequest.InputRecord = (PINPUT_RECORD)BufferTargetBase;
1147 Status = CsrClientCallServer(Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
1148 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1150 RtlFreeHeap(GetProcessHeap(), 0, Request);
1151 CsrReleaseParameterBuffer(BufferBase);
1155 if(lpNumberOfEventsWritten != NULL)
1156 *lpNumberOfEventsWritten = Reply.Data.WriteConsoleInputReply.Length;
1158 RtlFreeHeap(GetProcessHeap(), 0, Request);
1159 CsrReleaseParameterBuffer(BufferBase);
1165 /*--------------------------------------------------------------
1166 * WriteConsoleInputW
1172 HANDLE hConsoleInput,
1173 CONST INPUT_RECORD *lpBuffer,
1175 LPDWORD lpNumberOfEventsWritten
1183 /*--------------------------------------------------------------
1184 * ReadConsoleOutputA
1190 HANDLE hConsoleOutput,
1191 PCHAR_INFO lpBuffer,
1193 COORD dwBufferCoord,
1194 PSMALL_RECT lpReadRegion
1197 PCSRSS_API_REQUEST Request;
1198 CSRSS_API_REPLY Reply;
1200 PVOID BufferTargetBase;
1202 DWORD Size, SizeX, SizeY;
1204 if(lpBuffer == NULL)
1206 SetLastError(ERROR_INVALID_PARAMETER);
1210 Size = dwBufferSize.X * dwBufferSize.Y * sizeof(CHAR_INFO);
1212 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase);
1213 if(!NT_SUCCESS(Status))
1215 SetLastErrorByStatus(Status);
1219 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REQUEST));
1222 SetLastError(ERROR_OUTOFMEMORY);
1223 CsrReleaseParameterBuffer(BufferBase);
1227 Request->Type = CSRSS_READ_CONSOLE_OUTPUT;
1228 Request->Data.ReadConsoleOutputRequest.ConsoleHandle = hConsoleOutput;
1229 Request->Data.ReadConsoleOutputRequest.BufferSize = dwBufferSize;
1230 Request->Data.ReadConsoleOutputRequest.BufferCoord = dwBufferCoord;
1231 Request->Data.ReadConsoleOutputRequest.ReadRegion = *lpReadRegion;
1232 Request->Data.ReadConsoleOutputRequest.CharInfo = (PCHAR_INFO)BufferTargetBase;
1234 Status = CsrClientCallServer(Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
1235 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1237 SetLastErrorByStatus(Status);
1238 RtlFreeHeap(GetProcessHeap(), 0, Request);
1239 CsrReleaseParameterBuffer(BufferBase);
1243 SizeX = Reply.Data.ReadConsoleOutputReply.ReadRegion.Right - Reply.Data.ReadConsoleOutputReply.ReadRegion.Left + 1;
1244 SizeY = Reply.Data.ReadConsoleOutputReply.ReadRegion.Bottom - Reply.Data.ReadConsoleOutputReply.ReadRegion.Top + 1;
1246 memcpy(lpBuffer, BufferBase, sizeof(CHAR_INFO) * SizeX * SizeY);
1247 *lpReadRegion = Reply.Data.ReadConsoleOutputReply.ReadRegion;
1249 RtlFreeHeap(GetProcessHeap(), 0, Request);
1250 CsrReleaseParameterBuffer(BufferBase);
1256 /*--------------------------------------------------------------
1257 * ReadConsoleOutputW
1263 HANDLE hConsoleOutput,
1264 PCHAR_INFO lpBuffer,
1266 COORD dwBufferCoord,
1267 PSMALL_RECT lpReadRegion
1274 /*--------------------------------------------------------------
1275 * WriteConsoleOutputA
1277 WINBASEAPI BOOL WINAPI
1278 WriteConsoleOutputA(HANDLE hConsoleOutput,
1279 CONST CHAR_INFO *lpBuffer,
1281 COORD dwBufferCoord,
1282 PSMALL_RECT lpWriteRegion)
1284 PCSRSS_API_REQUEST Request;
1285 CSRSS_API_REPLY Reply;
1291 PVOID BufferTargetBase;
1293 Size = dwBufferSize.Y * dwBufferSize.X * sizeof(CHAR_INFO);
1295 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer,
1299 if (!NT_SUCCESS(Status))
1301 SetLastErrorByStatus(Status);
1305 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY,
1306 sizeof(CSRSS_API_REQUEST));
1307 if (Request == NULL)
1309 CsrReleaseParameterBuffer(BufferBase);
1310 SetLastError(ERROR_OUTOFMEMORY);
1313 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT;
1314 Request->Data.WriteConsoleOutputRequest.ConsoleHandle = hConsoleOutput;
1315 Request->Data.WriteConsoleOutputRequest.BufferSize = dwBufferSize;
1316 Request->Data.WriteConsoleOutputRequest.BufferCoord = dwBufferCoord;
1317 Request->Data.WriteConsoleOutputRequest.WriteRegion = *lpWriteRegion;
1318 Request->Data.WriteConsoleOutputRequest.CharInfo =
1319 (CHAR_INFO*)BufferTargetBase;
1321 Status = CsrClientCallServer(Request, &Reply,
1322 sizeof(CSRSS_API_REQUEST),
1323 sizeof(CSRSS_API_REPLY));
1324 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1326 CsrReleaseParameterBuffer(BufferBase);
1327 RtlFreeHeap(GetProcessHeap(), 0, Request);
1328 SetLastErrorByStatus(Status);
1332 *lpWriteRegion = Reply.Data.WriteConsoleOutputReply.WriteRegion;
1333 RtlFreeHeap(GetProcessHeap(), 0, Request);
1334 CsrReleaseParameterBuffer(BufferBase);
1339 /*--------------------------------------------------------------
1340 * WriteConsoleOutputW
1345 WriteConsoleOutputW(
1346 HANDLE hConsoleOutput,
1347 CONST CHAR_INFO *lpBuffer,
1349 COORD dwBufferCoord,
1350 PSMALL_RECT lpWriteRegion
1358 /*--------------------------------------------------------------
1359 * ReadConsoleOutputCharacterA
1364 ReadConsoleOutputCharacterA(
1365 HANDLE hConsoleOutput,
1369 LPDWORD lpNumberOfCharsRead
1372 CSRSS_API_REQUEST Request;
1373 PCSRSS_API_REPLY Reply;
1377 Reply = RtlAllocateHeap(GetProcessHeap(),
1379 sizeof(CSRSS_API_REPLY) + CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR);
1382 SetLastError(ERROR_OUTOFMEMORY);
1386 if (lpNumberOfCharsRead != NULL)
1387 *lpNumberOfCharsRead = nLength;
1389 Request.Type = CSRSS_READ_CONSOLE_OUTPUT_CHAR;
1390 Request.Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
1391 Request.Data.ReadConsoleOutputCharRequest.ReadCoord = dwReadCoord;
1393 while (nLength != 0)
1395 if (nLength > CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR)
1396 Size = CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR;
1400 Request.Data.ReadConsoleOutputCharRequest.NumCharsToRead = Size;
1402 Status = CsrClientCallServer(&Request,
1404 sizeof(CSRSS_API_REQUEST),
1405 sizeof(CSRSS_API_REPLY) + Size);
1406 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Reply->Status))
1408 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1409 SetLastErrorByStatus(Status);
1413 memcpy(lpCharacter, &Reply->Data.ReadConsoleOutputCharReply.String[0], Size);
1414 lpCharacter += Size;
1416 Request.Data.ReadConsoleOutputCharRequest.ReadCoord = Reply->Data.ReadConsoleOutputCharReply.EndCoord;
1419 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1425 /*--------------------------------------------------------------
1426 * ReadConsoleOutputCharacterW
1431 ReadConsoleOutputCharacterW(
1432 HANDLE hConsoleOutput,
1436 LPDWORD lpNumberOfCharsRead
1444 /*--------------------------------------------------------------
1445 * ReadConsoleOutputAttribute
1450 ReadConsoleOutputAttribute(
1451 HANDLE hConsoleOutput,
1455 LPDWORD lpNumberOfAttrsRead
1458 CSRSS_API_REQUEST Request;
1459 PCSRSS_API_REPLY Reply;
1463 Reply = RtlAllocateHeap(GetProcessHeap(),
1465 sizeof(CSRSS_API_REPLY) + CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB);
1468 SetLastError(ERROR_OUTOFMEMORY);
1472 if (lpNumberOfAttrsRead != NULL)
1473 *lpNumberOfAttrsRead = nLength;
1475 Request.Type = CSRSS_READ_CONSOLE_OUTPUT_ATTRIB;
1476 Request.Data.ReadConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
1477 Request.Data.ReadConsoleOutputAttribRequest.ReadCoord = dwReadCoord;
1479 while (nLength != 0)
1481 if (nLength > CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB)
1482 Size = CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB;
1486 Request.Data.ReadConsoleOutputAttribRequest.NumAttrsToRead = Size;
1488 Status = CsrClientCallServer(&Request,
1490 sizeof(CSRSS_API_REQUEST),
1491 sizeof(CSRSS_API_REPLY) + Size);
1492 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Reply->Status))
1494 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1495 SetLastErrorByStatus(Status);
1499 // Convert CHARs to WORDs
1500 for(i = 0; i < Size; ++i)
1501 *lpAttribute++ = Reply->Data.ReadConsoleOutputAttribReply.String[i];
1504 Request.Data.ReadConsoleOutputAttribRequest.ReadCoord = Reply->Data.ReadConsoleOutputAttribReply.EndCoord;
1507 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1513 /*--------------------------------------------------------------
1514 * WriteConsoleOutputCharacterA
1516 WINBASEAPI BOOL WINAPI
1517 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput,
1521 LPDWORD lpNumberOfCharsWritten)
1523 PCSRSS_API_REQUEST Request;
1524 CSRSS_API_REPLY Reply;
1528 Request = RtlAllocateHeap(GetProcessHeap(),
1530 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR);
1533 SetLastError( ERROR_OUTOFMEMORY );
1536 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT_CHAR;
1537 Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
1538 Request->Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
1539 if( lpNumberOfCharsWritten )
1540 *lpNumberOfCharsWritten = nLength;
1543 Size = nLength > CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR ? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR : nLength;
1544 Request->Data.WriteConsoleOutputCharRequest.Length = Size;
1545 memcpy( &Request->Data.WriteConsoleOutputCharRequest.String[0],
1548 Status = CsrClientCallServer( Request, &Reply, sizeof( CSRSS_API_REQUEST ) + Size, sizeof( CSRSS_API_REPLY ) );
1549 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1551 RtlFreeHeap( GetProcessHeap(), 0, Request );
1552 SetLastErrorByStatus ( Status );
1556 lpCharacter += Size;
1557 Request->Data.WriteConsoleOutputCharRequest.Coord = Reply.Data.WriteConsoleOutputCharReply.EndCoord;
1560 RtlFreeHeap( GetProcessHeap(), 0, Request );
1565 /*--------------------------------------------------------------
1566 * WriteConsoleOutputCharacterW
1571 WriteConsoleOutputCharacterW(
1572 HANDLE hConsoleOutput,
1573 LPCWSTR lpCharacter,
1576 LPDWORD lpNumberOfCharsWritten
1585 /*--------------------------------------------------------------
1586 * WriteConsoleOutputAttribute
1591 WriteConsoleOutputAttribute(
1592 HANDLE hConsoleOutput,
1593 CONST WORD *lpAttribute,
1596 LPDWORD lpNumberOfAttrsWritten
1599 PCSRSS_API_REQUEST Request;
1600 CSRSS_API_REPLY Reply;
1605 Request = RtlAllocateHeap(GetProcessHeap(),
1607 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB);
1610 SetLastError( ERROR_OUTOFMEMORY );
1613 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB;
1614 Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
1615 Request->Data.WriteConsoleOutputAttribRequest.Coord = dwWriteCoord;
1616 if( lpNumberOfAttrsWritten )
1617 *lpNumberOfAttrsWritten = nLength;
1620 Size = nLength > CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB ? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB : nLength;
1621 Request->Data.WriteConsoleOutputAttribRequest.Length = Size;
1622 for( c = 0; c < ( Size * 2 ); c++ )
1623 Request->Data.WriteConsoleOutputAttribRequest.String[c] = (char)lpAttribute[c];
1624 Status = CsrClientCallServer( Request, &Reply, sizeof( CSRSS_API_REQUEST ) + (Size * 2), sizeof( CSRSS_API_REPLY ) );
1625 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1627 RtlFreeHeap( GetProcessHeap(), 0, Request );
1628 SetLastErrorByStatus ( Status );
1632 lpAttribute += Size;
1633 Request->Data.WriteConsoleOutputAttribRequest.Coord = Reply.Data.WriteConsoleOutputAttribReply.EndCoord;
1636 RtlFreeHeap( GetProcessHeap(), 0, Request );
1641 /*--------------------------------------------------------------
1642 * FillConsoleOutputAttribute
1647 FillConsoleOutputAttribute(
1648 HANDLE hConsoleOutput,
1652 LPDWORD lpNumberOfAttrsWritten
1655 CSRSS_API_REQUEST Request;
1656 CSRSS_API_REPLY Reply;
1659 Request.Type = CSRSS_FILL_OUTPUT_ATTRIB;
1660 Request.Data.FillOutputAttribRequest.ConsoleHandle = hConsoleOutput;
1661 Request.Data.FillOutputAttribRequest.Attribute = wAttribute;
1662 Request.Data.FillOutputAttribRequest.Coord = dwWriteCoord;
1663 Request.Data.FillOutputAttribRequest.Length = nLength;
1664 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1665 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1667 SetLastErrorByStatus ( Status );
1670 if( lpNumberOfAttrsWritten )
1671 *lpNumberOfAttrsWritten = nLength;
1676 /*--------------------------------------------------------------
1683 HANDLE hConsoleHandle,
1687 CSRSS_API_REQUEST Request;
1688 CSRSS_API_REPLY Reply;
1691 Request.Type = CSRSS_GET_MODE;
1692 Request.Data.GetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
1693 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1694 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1696 SetLastErrorByStatus ( Status );
1699 *lpMode = Reply.Data.GetConsoleModeReply.ConsoleMode;
1704 /*--------------------------------------------------------------
1705 * GetNumberOfConsoleInputEvents
1710 GetNumberOfConsoleInputEvents(
1711 HANDLE hConsoleInput,
1712 LPDWORD lpNumberOfEvents
1715 CSRSS_API_REQUEST Request;
1716 CSRSS_API_REPLY Reply;
1719 if(lpNumberOfEvents == NULL)
1721 SetLastError(ERROR_INVALID_PARAMETER);
1725 Request.Type = CSRSS_GET_NUM_INPUT_EVENTS;
1726 Request.Data.GetNumInputEventsRequest.ConsoleHandle = hConsoleInput;
1727 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
1728 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1730 SetLastErrorByStatus(Status);
1734 *lpNumberOfEvents = Reply.Data.GetNumInputEventsReply.NumInputEvents;
1740 /*--------------------------------------------------------------
1741 * GetLargestConsoleWindowSize
1746 GetLargestConsoleWindowSize(
1747 HANDLE hConsoleOutput
1751 COORD Coord = {80,25};
1759 /*--------------------------------------------------------------
1760 * GetConsoleCursorInfo
1765 GetConsoleCursorInfo(
1766 HANDLE hConsoleOutput,
1767 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
1770 CSRSS_API_REQUEST Request;
1771 CSRSS_API_REPLY Reply;
1774 Request.Type = CSRSS_GET_CURSOR_INFO;
1775 Request.Data.GetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
1776 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1778 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1780 SetLastErrorByStatus ( Status );
1783 *lpConsoleCursorInfo = Reply.Data.GetCursorInfoReply.Info;
1788 /*--------------------------------------------------------------
1789 * GetNumberOfConsoleMouseButtons
1794 GetNumberOfConsoleMouseButtons(
1795 LPDWORD lpNumberOfMouseButtons
1803 /*--------------------------------------------------------------
1810 HANDLE hConsoleHandle,
1814 CSRSS_API_REQUEST Request;
1815 CSRSS_API_REPLY Reply;
1818 Request.Type = CSRSS_SET_MODE;
1819 Request.Data.SetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
1820 Request.Data.SetConsoleModeRequest.Mode = dwMode;
1821 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1822 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1824 SetLastErrorByStatus ( Status );
1831 /*--------------------------------------------------------------
1832 * SetConsoleActiveScreenBuffer
1837 SetConsoleActiveScreenBuffer(
1838 HANDLE hConsoleOutput
1841 CSRSS_API_REQUEST Request;
1842 CSRSS_API_REPLY Reply;
1845 Request.Type = CSRSS_SET_SCREEN_BUFFER;
1846 Request.Data.SetActiveScreenBufferRequest.OutputHandle = hConsoleOutput;
1847 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1848 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1850 SetLastErrorByStatus ( Status );
1857 /*--------------------------------------------------------------
1858 * FlushConsoleInputBuffer
1863 FlushConsoleInputBuffer(
1864 HANDLE hConsoleInput
1867 CSRSS_API_REQUEST Request;
1868 CSRSS_API_REPLY Reply;
1871 Request.Type = CSRSS_FLUSH_INPUT_BUFFER;
1872 Request.Data.FlushInputBufferRequest.ConsoleInput = hConsoleInput;
1873 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1874 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1876 SetLastErrorByStatus ( Status );
1883 /*--------------------------------------------------------------
1884 * SetConsoleScreenBufferSize
1889 SetConsoleScreenBufferSize(
1890 HANDLE hConsoleOutput,
1898 /*--------------------------------------------------------------
1899 * SetConsoleCursorInfo
1904 SetConsoleCursorInfo(
1905 HANDLE hConsoleOutput,
1906 CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
1909 CSRSS_API_REQUEST Request;
1910 CSRSS_API_REPLY Reply;
1913 Request.Type = CSRSS_SET_CURSOR_INFO;
1914 Request.Data.SetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
1915 Request.Data.SetCursorInfoRequest.Info = *lpConsoleCursorInfo;
1916 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1918 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1920 SetLastErrorByStatus ( Status );
1927 /*--------------------------------------------------------------
1928 * ScrollConsoleScreenBufferA
1933 ScrollConsoleScreenBufferA(
1934 HANDLE hConsoleOutput,
1935 CONST SMALL_RECT *lpScrollRectangle,
1936 CONST SMALL_RECT *lpClipRectangle,
1937 COORD dwDestinationOrigin,
1938 CONST CHAR_INFO *lpFill
1941 CSRSS_API_REQUEST Request;
1942 CSRSS_API_REPLY Reply;
1945 Request.Type = CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER;
1946 Request.Data.ScrollConsoleScreenBufferRequest.ConsoleHandle = hConsoleOutput;
1947 Request.Data.ScrollConsoleScreenBufferRequest.ScrollRectangle = *lpScrollRectangle;
1949 if (lpClipRectangle != NULL)
1951 Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = TRUE;
1952 Request.Data.ScrollConsoleScreenBufferRequest.ClipRectangle = *lpClipRectangle;
1956 Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = FALSE;
1959 Request.Data.ScrollConsoleScreenBufferRequest.DestinationOrigin = dwDestinationOrigin;
1960 Request.Data.ScrollConsoleScreenBufferRequest.Fill = *lpFill;
1961 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1963 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1965 SetLastErrorByStatus ( Status );
1972 /*--------------------------------------------------------------
1973 * ScrollConsoleScreenBufferW
1978 ScrollConsoleScreenBufferW(
1979 HANDLE hConsoleOutput,
1980 CONST SMALL_RECT *lpScrollRectangle,
1981 CONST SMALL_RECT *lpClipRectangle,
1982 COORD dwDestinationOrigin,
1983 CONST CHAR_INFO *lpFill
1991 /*--------------------------------------------------------------
1992 * SetConsoleWindowInfo
1997 SetConsoleWindowInfo(
1998 HANDLE hConsoleOutput,
2000 CONST SMALL_RECT *lpConsoleWindow
2008 /*--------------------------------------------------------------
2009 * SetConsoleTextAttribute
2014 SetConsoleTextAttribute(
2015 HANDLE hConsoleOutput,
2019 CSRSS_API_REQUEST Request;
2020 CSRSS_API_REPLY Reply;
2023 Request.Type = CSRSS_SET_ATTRIB;
2024 Request.Data.SetAttribRequest.ConsoleHandle = hConsoleOutput;
2025 Request.Data.SetAttribRequest.Attrib = wAttributes;
2026 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2027 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2029 SetLastErrorByStatus ( Status );
2036 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine)
2038 if (HandlerRoutine == NULL)
2040 IgnoreCtrlEvents = TRUE;
2047 RtlReAllocateHeap(RtlGetProcessHeap(),
2049 (PVOID)CtrlHandlers,
2050 NrCtrlHandlers * sizeof(PHANDLER_ROUTINE));
2051 if (CtrlHandlers == NULL)
2053 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
2056 CtrlHandlers[NrCtrlHandlers - 1] = HandlerRoutine;
2062 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine)
2066 if (HandlerRoutine == NULL)
2068 IgnoreCtrlEvents = FALSE;
2073 for (i = 0; i < NrCtrlHandlers; i++)
2075 if (CtrlHandlers[i] == HandlerRoutine)
2077 CtrlHandlers[i] = CtrlHandlers[NrCtrlHandlers - 1];
2080 RtlReAllocateHeap(RtlGetProcessHeap(),
2082 (PVOID)CtrlHandlers,
2083 NrCtrlHandlers * sizeof(PHANDLER_ROUTINE));
2091 WINBASEAPI BOOL WINAPI
2092 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine,
2097 RtlEnterCriticalSection(&DllLock);
2100 Ret = AddConsoleCtrlHandler(HandlerRoutine);
2104 Ret = RemoveConsoleCtrlHandler(HandlerRoutine);
2106 RtlLeaveCriticalSection(&DllLock);
2111 /*--------------------------------------------------------------
2112 * GenerateConsoleCtrlEvent
2114 WINBASEAPI BOOL WINAPI
2115 GenerateConsoleCtrlEvent(
2117 DWORD dwProcessGroupId
2125 /*--------------------------------------------------------------
2128 #define MAX_CONSOLE_TITLE_LENGTH 80
2134 LPWSTR lpConsoleTitle,
2139 CSRSS_API_REQUEST quest;
2140 CSRSS_API_REPLY ply;
2145 Re.quest.Type = CSRSS_GET_TITLE;
2146 Re.quest.Data.GetTitleRequest.ConsoleHandle =
2147 GetStdHandle (STD_INPUT_HANDLE);
2150 Status = CsrClientCallServer (
2153 (sizeof (CSRSS_GET_TITLE_REQUEST) +
2154 sizeof (LPC_MESSAGE) +
2156 sizeof (CSRSS_API_REPLY)
2158 if ( !NT_SUCCESS(Status)
2159 || !NT_SUCCESS (Status = Re.ply.Status)
2162 SetLastErrorByStatus (Status);
2166 /* Convert size in characters to size in bytes */
2167 nSize = sizeof (WCHAR) * nSize;
2169 /* Unmarshall data */
2170 if (nSize < Re.ply.Data.GetTitleReply.Length)
2172 DbgPrint ("%s: ret=%d\n", __FUNCTION__, Re.ply.Data.GetTitleReply.Length);
2173 nSize /= sizeof (WCHAR);
2178 Re.ply.Data.GetTitleReply.Title,
2182 lpConsoleTitle [nSize --] = L'\0';
2187 nSize = Re.ply.Data.GetTitleReply.Length / sizeof (WCHAR);
2188 wcscpy (lpConsoleTitle, Re.ply.Data.GetTitleReply.Title);
2195 /*--------------------------------------------------------------
2204 LPSTR lpConsoleTitle,
2208 wchar_t WideTitle [MAX_CONSOLE_TITLE_LENGTH];
2209 DWORD nWideTitle = sizeof WideTitle;
2212 if (!lpConsoleTitle || !nSize) return 0;
2213 nWideTitle = GetConsoleTitleW( (LPWSTR) WideTitle, nWideTitle );
2214 if (!nWideTitle) return 0;
2216 if ( (nWritten = WideCharToMultiByte(
2217 CP_ACP, // ANSI code page
2218 0, // performance and mapping flags
2219 (LPWSTR) WideTitle, // address of wide-character string
2220 nWideTitle, // number of characters in string
2221 lpConsoleTitle, // address of buffer for new string
2222 nSize, // size of buffer
2227 lpConsoleTitle[nWritten] = '\0';
2235 /*--------------------------------------------------------------
2242 LPCWSTR lpConsoleTitle
2245 PCSRSS_API_REQUEST Request;
2246 CSRSS_API_REPLY Reply;
2250 Request = RtlAllocateHeap(GetProcessHeap(),
2252 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_SET_TITLE_REQUEST);
2253 if (Request == NULL)
2255 SetLastError(ERROR_OUTOFMEMORY);
2259 Request->Type = CSRSS_SET_TITLE;
2260 Request->Data.SetTitleRequest.Console = GetStdHandle( STD_INPUT_HANDLE );
2262 for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
2263 Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
2265 Request->Data.SetTitleRequest.Title[c] = 0;
2266 Request->Data.SetTitleRequest.Length = c;
2267 Status = CsrClientCallServer(Request,
2269 sizeof(CSRSS_SET_TITLE_REQUEST) +
2271 sizeof( LPC_MESSAGE ) +
2273 sizeof(CSRSS_API_REPLY));
2275 if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply.Status ) )
2277 RtlFreeHeap( GetProcessHeap(), 0, Request );
2278 SetLastErrorByStatus (Status);
2281 RtlFreeHeap( GetProcessHeap(), 0, Request );
2286 /*--------------------------------------------------------------
2295 LPCSTR lpConsoleTitle
2298 PCSRSS_API_REQUEST Request;
2299 CSRSS_API_REPLY Reply;
2303 Request = RtlAllocateHeap(GetProcessHeap(),
2305 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_SET_TITLE_REQUEST);
2306 if (Request == NULL)
2308 SetLastError(ERROR_OUTOFMEMORY);
2312 Request->Type = CSRSS_SET_TITLE;
2313 Request->Data.SetTitleRequest.Console = GetStdHandle( STD_INPUT_HANDLE );
2315 for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
2316 Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
2318 Request->Data.SetTitleRequest.Title[c] = 0;
2319 Request->Data.SetTitleRequest.Length = c;
2320 Status = CsrClientCallServer(Request,
2322 sizeof(CSRSS_SET_TITLE_REQUEST) +
2324 sizeof( LPC_MESSAGE ) +
2326 sizeof(CSRSS_API_REPLY));
2328 if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply.Status ) )
2330 RtlFreeHeap( GetProcessHeap(), 0, Request );
2331 SetLastErrorByStatus (Status);
2334 RtlFreeHeap( GetProcessHeap(), 0, Request );
2339 /*--------------------------------------------------------------
2346 HANDLE hConsoleInput,
2348 DWORD nNumberOfCharsToRead,
2349 LPDWORD lpNumberOfCharsRead,
2358 /*--------------------------------------------------------------
2365 HANDLE hConsoleOutput,
2366 CONST VOID *lpBuffer,
2367 DWORD nNumberOfCharsToWrite,
2368 LPDWORD lpNumberOfCharsWritten,
2373 PCSRSS_API_REQUEST Request;
2374 CSRSS_API_REPLY Reply;
2377 Request = RtlAllocateHeap(GetProcessHeap(),
2379 sizeof(CSRSS_API_REQUEST) + nNumberOfCharsToWrite * sizeof(WCHAR));
2380 if (Request == NULL)
2382 SetLastError(ERROR_OUTOFMEMORY);
2386 Request->Type = CSRSS_WRITE_CONSOLE;
2387 Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
2388 Request->Data.WriteConsoleRequest.NrCharactersToWrite =
2389 nNumberOfCharsToWrite;
2390 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
2391 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
2392 memcpy(Request->Data.WriteConsoleRequest.Buffer,
2394 nNumberOfCharsToWrite * sizeof(WCHAR));
2396 Status = CsrClientCallServer(Request,
2398 sizeof(CSRSS_API_REQUEST) + nNumberOfCharsToWrite,
2399 sizeof(CSRSS_API_REPLY));
2401 RtlFreeHeap(GetProcessHeap(),
2405 if (!NT_SUCCESS(Status))
2410 if (lpNumberOfCharsWritten != NULL)
2412 *lpNumberOfCharsWritten =
2413 Reply.Data.WriteConsoleReply.NrCharactersWritten;
2422 /*--------------------------------------------------------------
2423 * CreateConsoleScreenBuffer
2428 CreateConsoleScreenBuffer(
2429 DWORD dwDesiredAccess,
2431 CONST SECURITY_ATTRIBUTES *lpSecurityAttributes,
2433 LPVOID lpScreenBufferData
2436 // FIXME: don't ignore access, share mode, and security
2437 CSRSS_API_REQUEST Request;
2438 CSRSS_API_REPLY Reply;
2441 Request.Type = CSRSS_CREATE_SCREEN_BUFFER;
2442 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2443 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2445 SetLastErrorByStatus ( Status );
2448 return Reply.Data.CreateScreenBufferReply.OutputHandle;
2452 /*--------------------------------------------------------------
2458 GetConsoleCP( VOID )
2461 return CP_OEMCP; /* FIXME */
2465 /*--------------------------------------------------------------
2480 /*--------------------------------------------------------------
2481 * GetConsoleOutputCP
2486 GetConsoleOutputCP( VOID )
2489 return 0; /* FIXME */
2493 /*--------------------------------------------------------------
2494 * SetConsoleOutputCP
2508 /*--------------------------------------------------------------
2509 * GetConsoleProcessList
2512 GetConsoleProcessList(LPDWORD lpdwProcessList,
2513 DWORD dwProcessCount)
2515 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
2521 /*--------------------------------------------------------------
2522 * GetConsoleSelectionInfo
2525 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo)
2527 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
2533 /*--------------------------------------------------------------
2537 AttachConsole(DWORD dwProcessId)
2539 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);