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 ******************************************************************/
16 #include <ddk/ntddk.h>
17 #include <ddk/ntddblue.h>
22 #include <csrss/csrss.h>
23 #include <ntdll/csr.h>
26 #include <kernel32/kernel32.h>
27 #include <kernel32/error.h>
29 /* GLOBALS *******************************************************************/
31 static BOOL IgnoreCtrlEvents = FALSE;
32 static ULONG NrCtrlHandlers = 0;
33 static PHANDLER_ROUTINE* CtrlHandlers = NULL;
35 /* FUNCTIONS *****************************************************************/
38 AddConsoleAliasA (LPSTR Source,
42 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
47 AddConsoleAliasW (LPWSTR Source,
51 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
56 ConsoleMenuControl (HANDLE hConsole,
63 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
68 DuplicateConsoleHandle (HANDLE hConsole,
76 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
81 ExpungeConsoleCommandHistoryW (DWORD Unknown0)
86 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
92 ExpungeConsoleCommandHistoryA (DWORD Unknown0)
97 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
102 GetConsoleAliasW (DWORD Unknown0,
110 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
116 GetConsoleAliasA (DWORD Unknown0,
124 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
129 GetConsoleAliasExesW (DWORD Unknown0,
135 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
142 GetConsoleAliasExesA (DWORD Unknown0,
148 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
155 GetConsoleAliasExesLengthA (VOID)
160 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
165 GetConsoleAliasExesLengthW (VOID)
170 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
175 GetConsoleAliasesW (DWORD Unknown0,
182 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
187 GetConsoleAliasesA (DWORD Unknown0,
194 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
199 GetConsoleAliasesLengthW (DWORD Unknown0)
204 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
209 GetConsoleAliasesLengthA (DWORD Unknown0)
214 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
219 GetConsoleCommandHistoryW (DWORD Unknown0,
226 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
231 GetConsoleCommandHistoryA (DWORD Unknown0,
238 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
243 GetConsoleCommandHistoryLengthW (DWORD Unknown0)
248 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
253 GetConsoleCommandHistoryLengthA (DWORD Unknown0)
258 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
263 GetConsoleDisplayMode (LPDWORD lpdwMode)
265 * FUNCTION: Get the console display mode
267 * lpdwMode - Address of variable that receives the current value
269 * STATUS: Undocumented
272 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
277 GetConsoleFontInfo (DWORD Unknown0,
285 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
290 GetConsoleFontSize(HANDLE hConsoleOutput,
293 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
298 GetConsoleHardwareState (DWORD Unknown0,
305 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
310 GetConsoleInputWaitHandle (VOID)
315 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
320 GetCurrentConsoleFont(HANDLE hConsoleOutput,
322 PCONSOLE_FONT_INFO lpConsoleCurrentFont)
324 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
329 GetNumberOfConsoleFonts (VOID)
334 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
335 return 1; /* FIXME: call csrss.exe */
339 InvalidateConsoleDIBits (DWORD Unknown0,
345 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
350 OpenConsoleW (DWORD Unknown0,
358 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
363 SetConsoleCommandHistoryMode (DWORD dwMode)
368 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
373 SetConsoleCursor (DWORD Unknown0,
379 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
384 SetConsoleDisplayMode (HANDLE hOut,
388 * FUNCTION: Set the console display mode.
390 * hOut - Standard output handle.
391 * dwNewMode - New mode.
392 * lpdwOldMode - Address of a variable that receives the old mode.
395 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
400 SetConsoleFont (DWORD Unknown0,
406 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
411 SetConsoleHardwareState (DWORD Unknown0,
418 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
423 SetConsoleKeyShortcuts (DWORD Unknown0,
431 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
436 SetConsoleMaximumWindowSize (DWORD Unknown0,
442 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
447 SetConsoleMenuClose (DWORD Unknown0)
452 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
457 SetConsoleNumberOfCommandsA (DWORD Unknown0,
463 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
468 SetConsoleNumberOfCommandsW (DWORD Unknown0,
474 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
479 SetConsolePalette (DWORD Unknown0,
486 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
491 SetLastConsoleEventActive (VOID)
496 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
501 ShowConsoleCursor (DWORD Unknown0,
507 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
512 VerifyConsoleIoHandle (DWORD Unknown0)
517 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
522 WriteConsoleInputVDMA (DWORD Unknown0,
527 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
532 WriteConsoleInputVDMW (DWORD Unknown0,
537 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
542 CloseConsoleHandle(HANDLE Handle)
547 if (IsConsoleHandle (Handle) == FALSE)
549 SetLastError (ERROR_INVALID_PARAMETER);
552 /* FIXME: call CSRSS */
553 return TRUE/*FALSE*/;
557 IsConsoleHandle(HANDLE Handle)
559 if ((((ULONG)Handle) & 0x10000003) == 0x3)
567 GetStdHandle(DWORD nStdHandle)
569 * FUNCTION: Get a handle for the standard input, standard output
570 * and a standard error device.
572 * nStdHandle - Specifies the device for which to return the handle.
573 * RETURNS: If the function succeeds, the return value is the handle
574 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
577 PRTL_USER_PROCESS_PARAMETERS Ppb;
579 Ppb = NtCurrentPeb()->ProcessParameters;
582 case STD_INPUT_HANDLE: return Ppb->hStdInput;
583 case STD_OUTPUT_HANDLE: return Ppb->hStdOutput;
584 case STD_ERROR_HANDLE: return Ppb->hStdError;
586 SetLastError (ERROR_INVALID_PARAMETER);
587 return INVALID_HANDLE_VALUE;
590 WINBASEAPI BOOL WINAPI
591 SetStdHandle(DWORD nStdHandle,
594 * FUNCTION: Set the handle for the standard input, standard output or
595 * the standard error device.
597 * nStdHandle - Specifies the handle to be set.
598 * hHandle - The handle to set.
599 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
602 PRTL_USER_PROCESS_PARAMETERS Ppb;
604 Ppb = NtCurrentPeb()->ProcessParameters;
606 /* More checking needed? */
607 if (hHandle == INVALID_HANDLE_VALUE)
609 SetLastError (ERROR_INVALID_HANDLE);
613 SetLastError(ERROR_SUCCESS); /* OK */
616 case STD_INPUT_HANDLE:
617 Ppb->hStdInput = hHandle;
619 case STD_OUTPUT_HANDLE:
620 Ppb->hStdOutput = hHandle;
622 case STD_ERROR_HANDLE:
623 Ppb->hStdError = hHandle;
626 SetLastError (ERROR_INVALID_PARAMETER);
631 /*--------------------------------------------------------------
635 WriteConsoleA(HANDLE hConsoleOutput,
636 CONST VOID *lpBuffer,
637 DWORD nNumberOfCharsToWrite,
638 LPDWORD lpNumberOfCharsWritten,
641 PCSRSS_API_REQUEST Request;
642 CSRSS_API_REPLY Reply;
647 Request = RtlAllocateHeap(GetProcessHeap(),
649 sizeof(CSRSS_API_REQUEST) +
650 CSRSS_MAX_WRITE_CONSOLE_REQUEST);
653 SetLastError(ERROR_OUTOFMEMORY);
657 Request->Type = CSRSS_WRITE_CONSOLE;
658 Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
659 if (lpNumberOfCharsWritten != NULL)
660 *lpNumberOfCharsWritten = nNumberOfCharsToWrite;
661 while (nNumberOfCharsToWrite)
663 if (nNumberOfCharsToWrite > CSRSS_MAX_WRITE_CONSOLE_REQUEST)
665 Size = CSRSS_MAX_WRITE_CONSOLE_REQUEST;
669 Size = nNumberOfCharsToWrite;
671 Request->Data.WriteConsoleRequest.NrCharactersToWrite = Size;
673 memcpy(Request->Data.WriteConsoleRequest.Buffer, lpBuffer, Size);
675 MessageSize = CSRSS_REQUEST_HEADER_SIZE +
676 sizeof(CSRSS_WRITE_CONSOLE_REQUEST) + Size;
677 Status = CsrClientCallServer(Request,
680 sizeof(CSRSS_API_REPLY));
682 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
684 RtlFreeHeap(GetProcessHeap(), 0, Request);
685 SetLastErrorByStatus(Status);
688 nNumberOfCharsToWrite -= Size;
691 RtlFreeHeap(GetProcessHeap(), 0, Request);
696 /*--------------------------------------------------------------
699 WINBOOL STDCALL ReadConsoleA(HANDLE hConsoleInput,
701 DWORD nNumberOfCharsToRead,
702 LPDWORD lpNumberOfCharsRead,
705 CSRSS_API_REQUEST Request;
706 PCSRSS_API_REPLY Reply;
710 Reply = RtlAllocateHeap(GetProcessHeap(),
712 sizeof(CSRSS_API_REPLY) + nNumberOfCharsToRead);
715 SetLastError(ERROR_OUTOFMEMORY);
719 Request.Type = CSRSS_READ_CONSOLE;
720 Request.Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
721 Request.Data.ReadConsoleRequest.NrCharactersToRead = nNumberOfCharsToRead > CSRSS_MAX_READ_CONSOLE_REQUEST ? CSRSS_MAX_READ_CONSOLE_REQUEST : nNumberOfCharsToRead;
722 Request.Data.ReadConsoleRequest.nCharsCanBeDeleted = 0;
723 Status = CsrClientCallServer(&Request,
725 sizeof(CSRSS_API_REQUEST),
726 sizeof(CSRSS_API_REPLY) +
727 Request.Data.ReadConsoleRequest.NrCharactersToRead);
728 if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply->Status ))
730 DbgPrint( "CSR returned error in ReadConsole\n" );
731 SetLastErrorByStatus ( Status );
732 RtlFreeHeap( GetProcessHeap(), 0, Reply );
735 if( Reply->Status == STATUS_NOTIFY_CLEANUP )
736 Reply->Status = STATUS_PENDING; // ignore backspace because we have no chars to backspace
737 /* There may not be any chars or lines to read yet, so wait */
738 while( Reply->Status == STATUS_PENDING )
740 /* some chars may have been returned, but not a whole line yet, so recompute buffer and try again */
741 nNumberOfCharsToRead -= Reply->Data.ReadConsoleReply.NrCharactersRead;
742 /* don't overflow caller's buffer, even if you still don't have a complete line */
743 if( !nNumberOfCharsToRead )
745 Request.Data.ReadConsoleRequest.NrCharactersToRead = nNumberOfCharsToRead > CSRSS_MAX_READ_CONSOLE_REQUEST ? CSRSS_MAX_READ_CONSOLE_REQUEST : nNumberOfCharsToRead;
746 /* copy any chars already read to buffer */
747 memcpy( lpBuffer + CharsRead, Reply->Data.ReadConsoleReply.Buffer, Reply->Data.ReadConsoleReply.NrCharactersRead );
748 CharsRead += Reply->Data.ReadConsoleReply.NrCharactersRead;
749 /* wait for csrss to signal there is more data to read, but not if we got STATUS_NOTIFY_CLEANUP for backspace */
750 Status = NtWaitForSingleObject( Reply->Data.ReadConsoleReply.EventHandle, FALSE, 0 );
751 if( !NT_SUCCESS( Status ) )
753 DbgPrint( "Wait for console input failed!\n" );
754 RtlFreeHeap( GetProcessHeap(), 0, Reply );
757 Request.Data.ReadConsoleRequest.nCharsCanBeDeleted = CharsRead;
758 Status = CsrClientCallServer( &Request, Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) + Request.Data.ReadConsoleRequest.NrCharactersToRead );
759 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply->Status ) )
761 SetLastErrorByStatus ( Status );
762 RtlFreeHeap( GetProcessHeap(), 0, Reply );
765 if( Reply->Status == STATUS_NOTIFY_CLEANUP )
771 nNumberOfCharsToRead++;
773 Reply->Status = STATUS_PENDING; // retry
776 /* copy data to buffer, count total returned, and return */
777 memcpy( lpBuffer + CharsRead, Reply->Data.ReadConsoleReply.Buffer, Reply->Data.ReadConsoleReply.NrCharactersRead );
778 CharsRead += Reply->Data.ReadConsoleReply.NrCharactersRead;
779 if (lpNumberOfCharsRead != NULL)
780 *lpNumberOfCharsRead = CharsRead;
781 RtlFreeHeap(GetProcessHeap(),
789 /*--------------------------------------------------------------
792 WINBOOL STDCALL AllocConsole(VOID)
794 CSRSS_API_REQUEST Request;
795 CSRSS_API_REPLY Reply;
798 Request.Type = CSRSS_ALLOC_CONSOLE;
799 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
800 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
802 SetLastErrorByStatus ( Status );
805 SetStdHandle( STD_INPUT_HANDLE, Reply.Data.AllocConsoleReply.InputHandle );
806 SetStdHandle( STD_OUTPUT_HANDLE, Reply.Data.AllocConsoleReply.OutputHandle );
807 SetStdHandle( STD_ERROR_HANDLE, Reply.Data.AllocConsoleReply.OutputHandle );
812 /*--------------------------------------------------------------
815 WINBOOL STDCALL FreeConsole(VOID)
817 DbgPrint("FreeConsole() is unimplemented\n");
822 /*--------------------------------------------------------------
823 * GetConsoleScreenBufferInfo
827 GetConsoleScreenBufferInfo(
828 HANDLE hConsoleOutput,
829 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
832 CSRSS_API_REQUEST Request;
833 CSRSS_API_REPLY Reply;
836 Request.Type = CSRSS_SCREEN_BUFFER_INFO;
837 Request.Data.ScreenBufferInfoRequest.ConsoleHandle = hConsoleOutput;
838 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
839 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
841 SetLastErrorByStatus ( Status );
844 *lpConsoleScreenBufferInfo = Reply.Data.ScreenBufferInfoReply.Info;
849 /*--------------------------------------------------------------
850 * SetConsoleCursorPosition
854 SetConsoleCursorPosition(
855 HANDLE hConsoleOutput,
856 COORD dwCursorPosition
859 CSRSS_API_REQUEST Request;
860 CSRSS_API_REPLY Reply;
863 Request.Type = CSRSS_SET_CURSOR;
864 Request.Data.SetCursorRequest.ConsoleHandle = hConsoleOutput;
865 Request.Data.SetCursorRequest.Position = dwCursorPosition;
866 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
867 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
869 SetLastErrorByStatus ( Status );
876 /*--------------------------------------------------------------
877 * FillConsoleOutputCharacterA
880 FillConsoleOutputCharacterA(
881 HANDLE hConsoleOutput,
885 LPDWORD lpNumberOfCharsWritten
888 CSRSS_API_REQUEST Request;
889 CSRSS_API_REPLY Reply;
892 Request.Type = CSRSS_FILL_OUTPUT;
893 Request.Data.FillOutputRequest.ConsoleHandle = hConsoleOutput;
894 Request.Data.FillOutputRequest.Char = cCharacter;
895 Request.Data.FillOutputRequest.Position = dwWriteCoord;
896 Request.Data.FillOutputRequest.Length = nLength;
897 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
898 if ( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
900 SetLastErrorByStatus(Status);
903 if (lpNumberOfCharsWritten != NULL)
904 *lpNumberOfCharsWritten = nLength;
909 /*--------------------------------------------------------------
910 * FillConsoleOutputCharacterW
914 FillConsoleOutputCharacterW(
915 HANDLE hConsoleOutput,
919 LPDWORD lpNumberOfCharsWritten
927 /*--------------------------------------------------------------
934 HANDLE hConsoleInput,
935 PINPUT_RECORD lpBuffer,
937 LPDWORD lpNumberOfEventsRead
940 PCSRSS_API_REQUEST Request;
941 CSRSS_API_REPLY Reply;
944 PVOID BufferTargetBase;
949 SetLastError(ERROR_INVALID_PARAMETER);
953 Size = nLength * sizeof(INPUT_RECORD);
955 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer, Size, &BufferBase, &BufferTargetBase);
956 if(!NT_SUCCESS(Status))
958 SetLastErrorByStatus(Status);
962 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CSRSS_API_REQUEST));
965 CsrReleaseParameterBuffer(BufferBase);
966 SetLastError(ERROR_OUTOFMEMORY);
970 Request->Type = CSRSS_PEEK_CONSOLE_INPUT;
971 Request->Data.PeekConsoleInputRequest.ConsoleHandle = hConsoleInput;
972 Request->Data.PeekConsoleInputRequest.Length = nLength;
973 Request->Data.PeekConsoleInputRequest.InputRecord = (INPUT_RECORD*)BufferTargetBase;
975 Status = CsrClientCallServer(Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
977 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
979 RtlFreeHeap(GetProcessHeap(), 0, Request);
980 CsrReleaseParameterBuffer(BufferBase);
984 memcpy(lpBuffer, BufferBase, sizeof(INPUT_RECORD) * Reply.Data.PeekConsoleInputReply.Length);
986 if(lpNumberOfEventsRead != NULL)
987 *lpNumberOfEventsRead = Reply.Data.PeekConsoleInputReply.Length;
989 RtlFreeHeap(GetProcessHeap(), 0, Request);
990 CsrReleaseParameterBuffer(BufferBase);
996 /*--------------------------------------------------------------
1003 HANDLE hConsoleInput,
1004 PINPUT_RECORD lpBuffer,
1006 LPDWORD lpNumberOfEventsRead
1014 /*--------------------------------------------------------------
1017 WINBASEAPI BOOL WINAPI
1018 ReadConsoleInputA(HANDLE hConsoleInput,
1019 PINPUT_RECORD lpBuffer,
1021 LPDWORD lpNumberOfEventsRead)
1023 CSRSS_API_REQUEST Request;
1024 CSRSS_API_REPLY Reply;
1025 DWORD NumEventsRead;
1028 Request.Type = CSRSS_READ_INPUT;
1029 Request.Data.ReadInputRequest.ConsoleHandle = hConsoleInput;
1030 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST),
1031 sizeof(CSRSS_API_REPLY));
1032 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1034 SetLastErrorByStatus(Status);
1038 while (Status == STATUS_PENDING)
1040 Status = NtWaitForSingleObject(Reply.Data.ReadInputReply.Event, FALSE,
1042 if(!NT_SUCCESS(Status))
1044 SetLastErrorByStatus(Status);
1048 Request.Type = CSRSS_READ_INPUT;
1049 Request.Data.ReadInputRequest.ConsoleHandle = hConsoleInput;
1050 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST),
1051 sizeof(CSRSS_API_REPLY));
1052 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1054 SetLastErrorByStatus(Status);
1060 *lpBuffer = Reply.Data.ReadInputReply.Input;
1064 while ((NumEventsRead < nLength) && (Reply.Data.ReadInputReply.MoreEvents))
1066 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST),
1067 sizeof(CSRSS_API_REPLY));
1068 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1070 SetLastErrorByStatus(Status);
1074 if (Status == STATUS_PENDING)
1079 *lpBuffer = Reply.Data.ReadInputReply.Input;
1084 *lpNumberOfEventsRead = NumEventsRead;
1090 /*--------------------------------------------------------------
1097 HANDLE hConsoleInput,
1098 PINPUT_RECORD lpBuffer,
1100 LPDWORD lpNumberOfEventsRead
1108 /*--------------------------------------------------------------
1109 * WriteConsoleInputA
1115 HANDLE hConsoleInput,
1116 CONST INPUT_RECORD *lpBuffer,
1118 LPDWORD lpNumberOfEventsWritten
1126 /*--------------------------------------------------------------
1127 * WriteConsoleInputW
1133 HANDLE hConsoleInput,
1134 CONST INPUT_RECORD *lpBuffer,
1136 LPDWORD lpNumberOfEventsWritten
1144 /*--------------------------------------------------------------
1145 * ReadConsoleOutputA
1151 HANDLE hConsoleOutput,
1152 PCHAR_INFO lpBuffer,
1154 COORD dwBufferCoord,
1155 PSMALL_RECT lpReadRegion
1163 /*--------------------------------------------------------------
1164 * ReadConsoleOutputW
1170 HANDLE hConsoleOutput,
1171 PCHAR_INFO lpBuffer,
1173 COORD dwBufferCoord,
1174 PSMALL_RECT lpReadRegion
1181 /*--------------------------------------------------------------
1182 * WriteConsoleOutputA
1184 WINBASEAPI BOOL WINAPI
1185 WriteConsoleOutputA(HANDLE hConsoleOutput,
1186 CONST CHAR_INFO *lpBuffer,
1188 COORD dwBufferCoord,
1189 PSMALL_RECT lpWriteRegion)
1191 PCSRSS_API_REQUEST Request;
1192 CSRSS_API_REPLY Reply;
1198 PVOID BufferTargetBase;
1200 Size = dwBufferSize.Y * dwBufferSize.X * sizeof(CHAR_INFO);
1202 Status = CsrCaptureParameterBuffer((PVOID)lpBuffer,
1206 if (!NT_SUCCESS(Status))
1208 SetLastErrorByStatus(Status);
1212 Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY,
1213 sizeof(CSRSS_API_REQUEST));
1214 if (Request == NULL)
1216 SetLastError(ERROR_OUTOFMEMORY);
1219 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT;
1220 Request->Data.WriteConsoleOutputRequest.ConsoleHandle = hConsoleOutput;
1221 Request->Data.WriteConsoleOutputRequest.BufferSize = dwBufferSize;
1222 Request->Data.WriteConsoleOutputRequest.BufferCoord = dwBufferCoord;
1223 Request->Data.WriteConsoleOutputRequest.WriteRegion = *lpWriteRegion;
1224 Request->Data.WriteConsoleOutputRequest.CharInfo =
1225 (CHAR_INFO*)BufferTargetBase;
1227 Status = CsrClientCallServer(Request, &Reply,
1228 sizeof(CSRSS_API_REQUEST),
1229 sizeof(CSRSS_API_REPLY));
1230 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
1232 RtlFreeHeap(GetProcessHeap(), 0, Request);
1233 SetLastErrorByStatus(Status);
1237 *lpWriteRegion = Reply.Data.WriteConsoleOutputReply.WriteRegion;
1238 RtlFreeHeap(GetProcessHeap(), 0, Request);
1239 CsrReleaseParameterBuffer(BufferBase);
1244 /*--------------------------------------------------------------
1245 * WriteConsoleOutputW
1250 WriteConsoleOutputW(
1251 HANDLE hConsoleOutput,
1252 CONST CHAR_INFO *lpBuffer,
1254 COORD dwBufferCoord,
1255 PSMALL_RECT lpWriteRegion
1263 /*--------------------------------------------------------------
1264 * ReadConsoleOutputCharacterA
1269 ReadConsoleOutputCharacterA(
1270 HANDLE hConsoleOutput,
1274 LPDWORD lpNumberOfCharsRead
1277 CSRSS_API_REQUEST Request;
1278 PCSRSS_API_REPLY Reply;
1282 Reply = RtlAllocateHeap(GetProcessHeap(),
1284 sizeof(CSRSS_API_REPLY) + CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR);
1287 SetLastError(ERROR_OUTOFMEMORY);
1291 if (lpNumberOfCharsRead != NULL)
1292 *lpNumberOfCharsRead = nLength;
1294 Request.Type = CSRSS_READ_CONSOLE_OUTPUT_CHAR;
1295 Request.Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
1296 Request.Data.ReadConsoleOutputCharRequest.ReadCoord = dwReadCoord;
1298 while (nLength != 0)
1300 if (nLength > CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR)
1301 Size = CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR;
1305 Request.Data.ReadConsoleOutputCharRequest.NumCharsToRead = Size;
1307 Status = CsrClientCallServer(&Request,
1309 sizeof(CSRSS_API_REQUEST),
1310 sizeof(CSRSS_API_REPLY) + Size);
1311 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Reply->Status))
1313 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1314 SetLastErrorByStatus(Status);
1318 memcpy(lpCharacter, &Reply->Data.ReadConsoleOutputCharReply.String[0], Size);
1319 lpCharacter += Size;
1321 Request.Data.ReadConsoleOutputCharRequest.ReadCoord = Reply->Data.ReadConsoleOutputCharReply.EndCoord;
1324 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1330 /*--------------------------------------------------------------
1331 * ReadConsoleOutputCharacterW
1336 ReadConsoleOutputCharacterW(
1337 HANDLE hConsoleOutput,
1341 LPDWORD lpNumberOfCharsRead
1349 /*--------------------------------------------------------------
1350 * ReadConsoleOutputAttribute
1355 ReadConsoleOutputAttribute(
1356 HANDLE hConsoleOutput,
1360 LPDWORD lpNumberOfAttrsRead
1363 CSRSS_API_REQUEST Request;
1364 PCSRSS_API_REPLY Reply;
1368 Reply = RtlAllocateHeap(GetProcessHeap(),
1370 sizeof(CSRSS_API_REPLY) + CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB);
1373 SetLastError(ERROR_OUTOFMEMORY);
1377 if (lpNumberOfAttrsRead != NULL)
1378 *lpNumberOfAttrsRead = nLength;
1380 Request.Type = CSRSS_READ_CONSOLE_OUTPUT_ATTRIB;
1381 Request.Data.ReadConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
1382 Request.Data.ReadConsoleOutputAttribRequest.ReadCoord = dwReadCoord;
1384 while (nLength != 0)
1386 if (nLength > CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB)
1387 Size = CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB;
1391 Request.Data.ReadConsoleOutputAttribRequest.NumAttrsToRead = Size;
1393 Status = CsrClientCallServer(&Request,
1395 sizeof(CSRSS_API_REQUEST),
1396 sizeof(CSRSS_API_REPLY) + Size);
1397 if (!NT_SUCCESS(Status) || !NT_SUCCESS(Reply->Status))
1399 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1400 SetLastErrorByStatus(Status);
1404 // Convert CHARs to WORDs
1405 for(i = 0; i < Size; ++i)
1406 *lpAttribute++ = Reply->Data.ReadConsoleOutputAttribReply.String[i];
1409 Request.Data.ReadConsoleOutputAttribRequest.ReadCoord = Reply->Data.ReadConsoleOutputAttribReply.EndCoord;
1412 RtlFreeHeap(GetProcessHeap(), 0, Reply);
1418 /*--------------------------------------------------------------
1419 * WriteConsoleOutputCharacterA
1421 WINBASEAPI BOOL WINAPI
1422 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput,
1426 LPDWORD lpNumberOfCharsWritten)
1428 PCSRSS_API_REQUEST Request;
1429 CSRSS_API_REPLY Reply;
1433 Request = RtlAllocateHeap(GetProcessHeap(),
1435 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR);
1438 SetLastError( ERROR_OUTOFMEMORY );
1441 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT_CHAR;
1442 Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
1443 Request->Data.WriteConsoleOutputCharRequest.Coord = dwWriteCoord;
1444 if( lpNumberOfCharsWritten )
1445 *lpNumberOfCharsWritten = nLength;
1448 Size = nLength > CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR ? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR : nLength;
1449 Request->Data.WriteConsoleOutputCharRequest.Length = Size;
1450 memcpy( &Request->Data.WriteConsoleOutputCharRequest.String[0],
1453 Status = CsrClientCallServer( Request, &Reply, sizeof( CSRSS_API_REQUEST ) + Size, sizeof( CSRSS_API_REPLY ) );
1454 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1456 RtlFreeHeap( GetProcessHeap(), 0, Request );
1457 SetLastErrorByStatus ( Status );
1461 lpCharacter += Size;
1462 Request->Data.WriteConsoleOutputCharRequest.Coord = Reply.Data.WriteConsoleOutputCharReply.EndCoord;
1468 /*--------------------------------------------------------------
1469 * WriteConsoleOutputCharacterW
1474 WriteConsoleOutputCharacterW(
1475 HANDLE hConsoleOutput,
1476 LPCWSTR lpCharacter,
1479 LPDWORD lpNumberOfCharsWritten
1488 /*--------------------------------------------------------------
1489 * WriteConsoleOutputAttribute
1494 WriteConsoleOutputAttribute(
1495 HANDLE hConsoleOutput,
1496 CONST WORD *lpAttribute,
1499 LPDWORD lpNumberOfAttrsWritten
1502 PCSRSS_API_REQUEST Request;
1503 CSRSS_API_REPLY Reply;
1508 Request = RtlAllocateHeap(GetProcessHeap(),
1510 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB);
1513 SetLastError( ERROR_OUTOFMEMORY );
1516 Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB;
1517 Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
1518 Request->Data.WriteConsoleOutputAttribRequest.Coord = dwWriteCoord;
1519 if( lpNumberOfAttrsWritten )
1520 *lpNumberOfAttrsWritten = nLength;
1523 Size = nLength > CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB ? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB : nLength;
1524 Request->Data.WriteConsoleOutputAttribRequest.Length = Size;
1525 for( c = 0; c < ( Size * 2 ); c++ )
1526 Request->Data.WriteConsoleOutputAttribRequest.String[c] = (char)lpAttribute[c];
1527 Status = CsrClientCallServer( Request, &Reply, sizeof( CSRSS_API_REQUEST ) + (Size * 2), sizeof( CSRSS_API_REPLY ) );
1528 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1530 RtlFreeHeap( GetProcessHeap(), 0, Request );
1531 SetLastErrorByStatus ( Status );
1535 lpAttribute += Size;
1536 Request->Data.WriteConsoleOutputAttribRequest.Coord = Reply.Data.WriteConsoleOutputAttribReply.EndCoord;
1542 /*--------------------------------------------------------------
1543 * FillConsoleOutputAttribute
1548 FillConsoleOutputAttribute(
1549 HANDLE hConsoleOutput,
1553 LPDWORD lpNumberOfAttrsWritten
1556 CSRSS_API_REQUEST Request;
1557 CSRSS_API_REPLY Reply;
1560 Request.Type = CSRSS_FILL_OUTPUT_ATTRIB;
1561 Request.Data.FillOutputAttribRequest.ConsoleHandle = hConsoleOutput;
1562 Request.Data.FillOutputAttribRequest.Attribute = wAttribute;
1563 Request.Data.FillOutputAttribRequest.Coord = dwWriteCoord;
1564 Request.Data.FillOutputAttribRequest.Length = nLength;
1565 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1566 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1568 SetLastErrorByStatus ( Status );
1571 if( lpNumberOfAttrsWritten )
1572 *lpNumberOfAttrsWritten = nLength;
1577 /*--------------------------------------------------------------
1584 HANDLE hConsoleHandle,
1588 CSRSS_API_REQUEST Request;
1589 CSRSS_API_REPLY Reply;
1592 Request.Type = CSRSS_GET_MODE;
1593 Request.Data.GetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
1594 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1595 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1597 SetLastErrorByStatus ( Status );
1600 *lpMode = Reply.Data.GetConsoleModeReply.ConsoleMode;
1605 /*--------------------------------------------------------------
1606 * GetNumberOfConsoleInputEvents
1611 GetNumberOfConsoleInputEvents(
1612 HANDLE hConsoleInput,
1613 LPDWORD lpNumberOfEvents
1616 CSRSS_API_REQUEST Request;
1617 CSRSS_API_REPLY Reply;
1620 if(lpNumberOfEvents == NULL)
1622 SetLastError(ERROR_INVALID_PARAMETER);
1626 Request.Type = CSRSS_GET_NUM_INPUT_EVENTS;
1627 Request.Data.GetNumInputEventsRequest.ConsoleHandle = hConsoleInput;
1628 Status = CsrClientCallServer(&Request, &Reply, sizeof(CSRSS_API_REQUEST), sizeof(CSRSS_API_REPLY));
1629 if(!NT_SUCCESS(Status) || !NT_SUCCESS(Reply.Status))
1631 SetLastErrorByStatus(Reply.Status);
1635 *lpNumberOfEvents = Reply.Data.GetNumInputEventsReply.NumInputEvents;
1641 /*--------------------------------------------------------------
1642 * GetLargestConsoleWindowSize
1647 GetLargestConsoleWindowSize(
1648 HANDLE hConsoleOutput
1652 COORD Coord = {80,25};
1660 /*--------------------------------------------------------------
1661 * GetConsoleCursorInfo
1666 GetConsoleCursorInfo(
1667 HANDLE hConsoleOutput,
1668 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
1671 CSRSS_API_REQUEST Request;
1672 CSRSS_API_REPLY Reply;
1675 Request.Type = CSRSS_GET_CURSOR_INFO;
1676 Request.Data.GetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
1677 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1679 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1681 SetLastErrorByStatus ( Status );
1684 *lpConsoleCursorInfo = Reply.Data.GetCursorInfoReply.Info;
1689 /*--------------------------------------------------------------
1690 * GetNumberOfConsoleMouseButtons
1695 GetNumberOfConsoleMouseButtons(
1696 LPDWORD lpNumberOfMouseButtons
1704 /*--------------------------------------------------------------
1711 HANDLE hConsoleHandle,
1715 CSRSS_API_REQUEST Request;
1716 CSRSS_API_REPLY Reply;
1719 Request.Type = CSRSS_SET_MODE;
1720 Request.Data.SetConsoleModeRequest.ConsoleHandle = hConsoleHandle;
1721 Request.Data.SetConsoleModeRequest.Mode = dwMode;
1722 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1723 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1725 SetLastErrorByStatus ( Status );
1732 /*--------------------------------------------------------------
1733 * SetConsoleActiveScreenBuffer
1738 SetConsoleActiveScreenBuffer(
1739 HANDLE hConsoleOutput
1742 CSRSS_API_REQUEST Request;
1743 CSRSS_API_REPLY Reply;
1746 Request.Type = CSRSS_SET_SCREEN_BUFFER;
1747 Request.Data.SetActiveScreenBufferRequest.OutputHandle = hConsoleOutput;
1748 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1749 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1751 SetLastErrorByStatus ( Status );
1758 /*--------------------------------------------------------------
1759 * FlushConsoleInputBuffer
1764 FlushConsoleInputBuffer(
1765 HANDLE hConsoleInput
1768 CSRSS_API_REQUEST Request;
1769 CSRSS_API_REPLY Reply;
1772 Request.Type = CSRSS_FLUSH_INPUT_BUFFER;
1773 Request.Data.FlushInputBufferRequest.ConsoleInput = hConsoleInput;
1774 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1775 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1777 SetLastErrorByStatus ( Status );
1784 /*--------------------------------------------------------------
1785 * SetConsoleScreenBufferSize
1790 SetConsoleScreenBufferSize(
1791 HANDLE hConsoleOutput,
1799 /*--------------------------------------------------------------
1800 * SetConsoleCursorInfo
1805 SetConsoleCursorInfo(
1806 HANDLE hConsoleOutput,
1807 CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
1810 CSRSS_API_REQUEST Request;
1811 CSRSS_API_REPLY Reply;
1814 Request.Type = CSRSS_SET_CURSOR_INFO;
1815 Request.Data.SetCursorInfoRequest.ConsoleHandle = hConsoleOutput;
1816 Request.Data.SetCursorInfoRequest.Info = *lpConsoleCursorInfo;
1817 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1819 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1821 SetLastErrorByStatus ( Status );
1828 /*--------------------------------------------------------------
1829 * ScrollConsoleScreenBufferA
1834 ScrollConsoleScreenBufferA(
1835 HANDLE hConsoleOutput,
1836 CONST SMALL_RECT *lpScrollRectangle,
1837 CONST SMALL_RECT *lpClipRectangle,
1838 COORD dwDestinationOrigin,
1839 CONST CHAR_INFO *lpFill
1842 CSRSS_API_REQUEST Request;
1843 CSRSS_API_REPLY Reply;
1846 Request.Type = CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER;
1847 Request.Data.ScrollConsoleScreenBufferRequest.ConsoleHandle = hConsoleOutput;
1848 Request.Data.ScrollConsoleScreenBufferRequest.ScrollRectangle = *lpScrollRectangle;
1850 if (lpClipRectangle != NULL)
1852 Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = TRUE;
1853 Request.Data.ScrollConsoleScreenBufferRequest.ClipRectangle = *lpClipRectangle;
1857 Request.Data.ScrollConsoleScreenBufferRequest.UseClipRectangle = FALSE;
1860 Request.Data.ScrollConsoleScreenBufferRequest.DestinationOrigin = dwDestinationOrigin;
1861 Request.Data.ScrollConsoleScreenBufferRequest.Fill = *lpFill;
1862 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1864 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1866 SetLastErrorByStatus ( Status );
1873 /*--------------------------------------------------------------
1874 * ScrollConsoleScreenBufferW
1879 ScrollConsoleScreenBufferW(
1880 HANDLE hConsoleOutput,
1881 CONST SMALL_RECT *lpScrollRectangle,
1882 CONST SMALL_RECT *lpClipRectangle,
1883 COORD dwDestinationOrigin,
1884 CONST CHAR_INFO *lpFill
1892 /*--------------------------------------------------------------
1893 * SetConsoleWindowInfo
1898 SetConsoleWindowInfo(
1899 HANDLE hConsoleOutput,
1901 CONST SMALL_RECT *lpConsoleWindow
1909 /*--------------------------------------------------------------
1910 * SetConsoleTextAttribute
1915 SetConsoleTextAttribute(
1916 HANDLE hConsoleOutput,
1920 CSRSS_API_REQUEST Request;
1921 CSRSS_API_REPLY Reply;
1924 Request.Type = CSRSS_SET_ATTRIB;
1925 Request.Data.SetAttribRequest.ConsoleHandle = hConsoleOutput;
1926 Request.Data.SetAttribRequest.Attrib = wAttributes;
1927 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
1928 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
1930 SetLastErrorByStatus ( Status );
1937 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine)
1939 if (HandlerRoutine == NULL)
1941 IgnoreCtrlEvents = TRUE;
1948 RtlReAllocateHeap(RtlGetProcessHeap(),
1950 (PVOID)CtrlHandlers,
1951 NrCtrlHandlers * sizeof(PHANDLER_ROUTINE));
1952 if (CtrlHandlers == NULL)
1954 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
1957 CtrlHandlers[NrCtrlHandlers - 1] = HandlerRoutine;
1963 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine)
1967 if (HandlerRoutine == NULL)
1969 IgnoreCtrlEvents = FALSE;
1974 for (i = 0; i < NrCtrlHandlers; i++)
1976 if (CtrlHandlers[i] == HandlerRoutine)
1978 CtrlHandlers[i] = CtrlHandlers[NrCtrlHandlers - 1];
1981 RtlReAllocateHeap(RtlGetProcessHeap(),
1983 (PVOID)CtrlHandlers,
1984 NrCtrlHandlers * sizeof(PHANDLER_ROUTINE));
1992 WINBASEAPI BOOL WINAPI
1993 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine,
1998 RtlEnterCriticalSection(&DllLock);
2001 Ret = AddConsoleCtrlHandler(HandlerRoutine);
2005 Ret = RemoveConsoleCtrlHandler(HandlerRoutine);
2007 RtlLeaveCriticalSection(&DllLock);
2012 /*--------------------------------------------------------------
2013 * GenerateConsoleCtrlEvent
2015 WINBASEAPI BOOL WINAPI
2016 GenerateConsoleCtrlEvent(
2018 DWORD dwProcessGroupId
2026 /*--------------------------------------------------------------
2029 #define MAX_CONSOLE_TITLE_LENGTH 80
2035 LPWSTR lpConsoleTitle,
2040 CSRSS_API_REQUEST quest;
2041 CSRSS_API_REPLY ply;
2046 Re.quest.Type = CSRSS_GET_TITLE;
2047 Re.quest.Data.GetTitleRequest.ConsoleHandle =
2048 GetStdHandle (STD_INPUT_HANDLE);
2051 Status = CsrClientCallServer (
2054 (sizeof (CSRSS_GET_TITLE_REQUEST) +
2055 sizeof (LPC_MESSAGE_HEADER) +
2057 sizeof (CSRSS_API_REPLY)
2059 if ( !NT_SUCCESS(Status)
2060 || !NT_SUCCESS (Status = Re.ply.Status)
2063 SetLastErrorByStatus (Status);
2067 /* Convert size in characters to size in bytes */
2068 nSize = sizeof (WCHAR) * nSize;
2070 /* Unmarshall data */
2071 if (nSize < Re.ply.Data.GetTitleReply.Length)
2073 DbgPrint ("%s: ret=%d\n", __FUNCTION__, Re.ply.Data.GetTitleReply.Length);
2074 nSize /= sizeof (WCHAR);
2079 Re.ply.Data.GetTitleReply.Title,
2083 lpConsoleTitle [nSize --] = L'\0';
2088 nSize = Re.ply.Data.GetTitleReply.Length / sizeof (WCHAR);
2089 wcscpy (lpConsoleTitle, Re.ply.Data.GetTitleReply.Title);
2096 /*--------------------------------------------------------------
2105 LPSTR lpConsoleTitle,
2109 wchar_t WideTitle [MAX_CONSOLE_TITLE_LENGTH];
2110 DWORD nWideTitle = sizeof WideTitle;
2113 if (!lpConsoleTitle || !nSize) return 0;
2114 nWideTitle = GetConsoleTitleW( (LPWSTR) WideTitle, nWideTitle );
2115 if (!nWideTitle) return 0;
2117 if ( (nWritten = WideCharToMultiByte(
2118 CP_ACP, // ANSI code page
2119 0, // performance and mapping flags
2120 (LPWSTR) WideTitle, // address of wide-character string
2121 nWideTitle, // number of characters in string
2122 lpConsoleTitle, // address of buffer for new string
2123 nSize, // size of buffer
2128 lpConsoleTitle[nWritten] = '\0';
2136 /*--------------------------------------------------------------
2143 LPCWSTR lpConsoleTitle
2146 PCSRSS_API_REQUEST Request;
2147 CSRSS_API_REPLY Reply;
2151 Request = RtlAllocateHeap(GetProcessHeap(),
2153 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_SET_TITLE_REQUEST);
2154 if (Request == NULL)
2156 SetLastError(ERROR_OUTOFMEMORY);
2160 Request->Type = CSRSS_SET_TITLE;
2161 Request->Data.SetTitleRequest.Console = GetStdHandle( STD_INPUT_HANDLE );
2163 for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
2164 Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
2166 Request->Data.SetTitleRequest.Title[c] = 0;
2167 Request->Data.SetTitleRequest.Length = c;
2168 Status = CsrClientCallServer(Request,
2170 sizeof(CSRSS_SET_TITLE_REQUEST) +
2172 sizeof( LPC_MESSAGE_HEADER ) +
2174 sizeof(CSRSS_API_REPLY));
2176 if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply.Status ) )
2178 RtlFreeHeap( GetProcessHeap(), 0, Request );
2179 SetLastErrorByStatus (Status);
2182 RtlFreeHeap( GetProcessHeap(), 0, Request );
2187 /*--------------------------------------------------------------
2196 LPCSTR lpConsoleTitle
2199 PCSRSS_API_REQUEST Request;
2200 CSRSS_API_REPLY Reply;
2204 Request = RtlAllocateHeap(GetProcessHeap(),
2206 sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_SET_TITLE_REQUEST);
2207 if (Request == NULL)
2209 SetLastError(ERROR_OUTOFMEMORY);
2213 Request->Type = CSRSS_SET_TITLE;
2214 Request->Data.SetTitleRequest.Console = GetStdHandle( STD_INPUT_HANDLE );
2216 for( c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++ )
2217 Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
2219 Request->Data.SetTitleRequest.Title[c] = 0;
2220 Request->Data.SetTitleRequest.Length = c;
2221 Status = CsrClientCallServer(Request,
2223 sizeof(CSRSS_SET_TITLE_REQUEST) +
2225 sizeof( LPC_MESSAGE_HEADER ) +
2227 sizeof(CSRSS_API_REPLY));
2229 if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply.Status ) )
2231 RtlFreeHeap( GetProcessHeap(), 0, Request );
2232 SetLastErrorByStatus (Status);
2235 RtlFreeHeap( GetProcessHeap(), 0, Request );
2240 /*--------------------------------------------------------------
2247 HANDLE hConsoleInput,
2249 DWORD nNumberOfCharsToRead,
2250 LPDWORD lpNumberOfCharsRead,
2259 /*--------------------------------------------------------------
2266 HANDLE hConsoleOutput,
2267 CONST VOID *lpBuffer,
2268 DWORD nNumberOfCharsToWrite,
2269 LPDWORD lpNumberOfCharsWritten,
2274 PCSRSS_API_REQUEST Request;
2275 CSRSS_API_REPLY Reply;
2278 Request = RtlAllocateHeap(GetProcessHeap(),
2280 sizeof(CSRSS_API_REQUEST) + nNumberOfCharsToWrite * sizeof(WCHAR));
2281 if (Request == NULL)
2283 SetLastError(ERROR_OUTOFMEMORY);
2287 Request->Type = CSRSS_WRITE_CONSOLE;
2288 Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
2289 Request->Data.WriteConsoleRequest.NrCharactersToWrite =
2290 nNumberOfCharsToWrite;
2291 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
2292 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
2293 memcpy(Request->Data.WriteConsoleRequest.Buffer,
2295 nNumberOfCharsToWrite * sizeof(WCHAR));
2297 Status = CsrClientCallServer(Request,
2299 sizeof(CSRSS_API_REQUEST) + nNumberOfCharsToWrite,
2300 sizeof(CSRSS_API_REPLY));
2302 RtlFreeHeap(GetProcessHeap(),
2306 if (!NT_SUCCESS(Status))
2311 if (lpNumberOfCharsWritten != NULL)
2313 *lpNumberOfCharsWritten =
2314 Reply.Data.WriteConsoleReply.NrCharactersWritten;
2323 /*--------------------------------------------------------------
2324 * CreateConsoleScreenBuffer
2329 CreateConsoleScreenBuffer(
2330 DWORD dwDesiredAccess,
2332 CONST SECURITY_ATTRIBUTES *lpSecurityAttributes,
2334 LPVOID lpScreenBufferData
2337 // FIXME: don't ignore access, share mode, and security
2338 CSRSS_API_REQUEST Request;
2339 CSRSS_API_REPLY Reply;
2342 Request.Type = CSRSS_CREATE_SCREEN_BUFFER;
2343 Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) );
2344 if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) )
2346 SetLastErrorByStatus ( Status );
2349 return Reply.Data.CreateScreenBufferReply.OutputHandle;
2353 /*--------------------------------------------------------------
2359 GetConsoleCP( VOID )
2362 return CP_OEMCP; /* FIXME */
2366 /*--------------------------------------------------------------
2381 /*--------------------------------------------------------------
2382 * GetConsoleOutputCP
2387 GetConsoleOutputCP( VOID )
2390 return 0; /* FIXME */
2394 /*--------------------------------------------------------------
2395 * SetConsoleOutputCP
2409 /*--------------------------------------------------------------
2410 * GetConsoleProcessList
2413 GetConsoleProcessList(LPDWORD lpdwProcessList,
2414 DWORD dwProcessCount)
2416 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
2422 /*--------------------------------------------------------------
2423 * GetConsoleSelectionInfo
2426 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo)
2428 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
2434 /*--------------------------------------------------------------
2438 AttachConsole(DWORD dwProcessId)
2440 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);