1 /* $Id: console.c,v 1.48 2002/11/12 00:48:25 mdill Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/misc/console.c
6 * PURPOSE: Win32 server console functions
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
1121 PCSRSS_API_REQUEST Request
;
1122 CSRSS_API_REPLY Reply
;
1123 PVOID BufferBase
, BufferTargetBase
;
1127 if(lpBuffer
== NULL
)
1129 SetLastError(ERROR_INVALID_PARAMETER
);
1133 Size
= nLength
* sizeof(INPUT_RECORD
);
1135 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1136 if(!NT_SUCCESS(Status
))
1138 SetLastErrorByStatus(Status
);
1142 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REQUEST
));
1145 SetLastError(ERROR_OUTOFMEMORY
);
1146 CsrReleaseParameterBuffer(BufferBase
);
1150 Request
->Type
= CSRSS_WRITE_CONSOLE_INPUT
;
1151 Request
->Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1152 Request
->Data
.WriteConsoleInputRequest
.Length
= nLength
;
1153 Request
->Data
.WriteConsoleInputRequest
.InputRecord
= (PINPUT_RECORD
)BufferTargetBase
;
1155 Status
= CsrClientCallServer(Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
1156 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1158 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1159 CsrReleaseParameterBuffer(BufferBase
);
1163 if(lpNumberOfEventsWritten
!= NULL
)
1164 lpNumberOfEventsWritten
= Reply
.Data
.WriteConsoleInputReply
.Length
;
1166 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1167 CsrReleaseParameterBuffer(BufferBase
);
1173 /*--------------------------------------------------------------
1174 * WriteConsoleInputW
1180 HANDLE hConsoleInput
,
1181 CONST INPUT_RECORD
*lpBuffer
,
1183 LPDWORD lpNumberOfEventsWritten
1191 /*--------------------------------------------------------------
1192 * ReadConsoleOutputA
1198 HANDLE hConsoleOutput
,
1199 PCHAR_INFO lpBuffer
,
1201 COORD dwBufferCoord
,
1202 PSMALL_RECT lpReadRegion
1205 PCSRSS_API_REQUEST Request
;
1206 CSRSS_API_REPLY Reply
;
1208 PVOID BufferTargetBase
;
1210 DWORD Size
, SizeX
, SizeY
;
1212 if(lpBuffer
== NULL
)
1214 SetLastError(ERROR_INVALID_PARAMETER
);
1218 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
1220 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1221 if(!NT_SUCCESS(Status
))
1223 SetLastErrorByStatus(Status
);
1227 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REQUEST
));
1230 SetLastError(ERROR_OUTOFMEMORY
);
1231 CsrReleaseParameterBuffer(BufferBase
);
1235 Request
->Type
= CSRSS_READ_CONSOLE_OUTPUT
;
1236 Request
->Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1237 Request
->Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1238 Request
->Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1239 Request
->Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
1240 Request
->Data
.ReadConsoleOutputRequest
.CharInfo
= (PCHAR_INFO
)BufferTargetBase
;
1242 Status
= CsrClientCallServer(Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
1243 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1245 SetLastErrorByStatus(Status
);
1246 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1247 CsrReleaseParameterBuffer(BufferBase
);
1251 SizeX
= Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Right
- Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Left
+ 1;
1252 SizeY
= Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Bottom
- Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Top
+ 1;
1254 memcpy(lpBuffer
, BufferBase
, sizeof(CHAR_INFO
) * SizeX
* SizeY
);
1255 *lpReadRegion
= Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
;
1257 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1258 CsrReleaseParameterBuffer(BufferBase
);
1264 /*--------------------------------------------------------------
1265 * ReadConsoleOutputW
1271 HANDLE hConsoleOutput
,
1272 PCHAR_INFO lpBuffer
,
1274 COORD dwBufferCoord
,
1275 PSMALL_RECT lpReadRegion
1282 /*--------------------------------------------------------------
1283 * WriteConsoleOutputA
1285 WINBASEAPI BOOL WINAPI
1286 WriteConsoleOutputA(HANDLE hConsoleOutput
,
1287 CONST CHAR_INFO
*lpBuffer
,
1289 COORD dwBufferCoord
,
1290 PSMALL_RECT lpWriteRegion
)
1292 PCSRSS_API_REQUEST Request
;
1293 CSRSS_API_REPLY Reply
;
1299 PVOID BufferTargetBase
;
1301 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
1303 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
,
1307 if (!NT_SUCCESS(Status
))
1309 SetLastErrorByStatus(Status
);
1313 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
,
1314 sizeof(CSRSS_API_REQUEST
));
1315 if (Request
== NULL
)
1317 SetLastError(ERROR_OUTOFMEMORY
);
1320 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT
;
1321 Request
->Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1322 Request
->Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1323 Request
->Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1324 Request
->Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
1325 Request
->Data
.WriteConsoleOutputRequest
.CharInfo
=
1326 (CHAR_INFO
*)BufferTargetBase
;
1328 Status
= CsrClientCallServer(Request
, &Reply
,
1329 sizeof(CSRSS_API_REQUEST
),
1330 sizeof(CSRSS_API_REPLY
));
1331 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1333 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1334 SetLastErrorByStatus(Status
);
1338 *lpWriteRegion
= Reply
.Data
.WriteConsoleOutputReply
.WriteRegion
;
1339 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1340 CsrReleaseParameterBuffer(BufferBase
);
1345 /*--------------------------------------------------------------
1346 * WriteConsoleOutputW
1351 WriteConsoleOutputW(
1352 HANDLE hConsoleOutput
,
1353 CONST CHAR_INFO
*lpBuffer
,
1355 COORD dwBufferCoord
,
1356 PSMALL_RECT lpWriteRegion
1364 /*--------------------------------------------------------------
1365 * ReadConsoleOutputCharacterA
1370 ReadConsoleOutputCharacterA(
1371 HANDLE hConsoleOutput
,
1375 LPDWORD lpNumberOfCharsRead
1378 CSRSS_API_REQUEST Request
;
1379 PCSRSS_API_REPLY Reply
;
1383 Reply
= RtlAllocateHeap(GetProcessHeap(),
1385 sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
);
1388 SetLastError(ERROR_OUTOFMEMORY
);
1392 if (lpNumberOfCharsRead
!= NULL
)
1393 *lpNumberOfCharsRead
= nLength
;
1395 Request
.Type
= CSRSS_READ_CONSOLE_OUTPUT_CHAR
;
1396 Request
.Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
1397 Request
.Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
1399 while (nLength
!= 0)
1401 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
)
1402 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
;
1406 Request
.Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= Size
;
1408 Status
= CsrClientCallServer(&Request
,
1410 sizeof(CSRSS_API_REQUEST
),
1411 sizeof(CSRSS_API_REPLY
) + Size
);
1412 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Reply
->Status
))
1414 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1415 SetLastErrorByStatus(Status
);
1419 memcpy(lpCharacter
, &Reply
->Data
.ReadConsoleOutputCharReply
.String
[0], Size
);
1420 lpCharacter
+= Size
;
1422 Request
.Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Reply
->Data
.ReadConsoleOutputCharReply
.EndCoord
;
1425 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1431 /*--------------------------------------------------------------
1432 * ReadConsoleOutputCharacterW
1437 ReadConsoleOutputCharacterW(
1438 HANDLE hConsoleOutput
,
1442 LPDWORD lpNumberOfCharsRead
1450 /*--------------------------------------------------------------
1451 * ReadConsoleOutputAttribute
1456 ReadConsoleOutputAttribute(
1457 HANDLE hConsoleOutput
,
1461 LPDWORD lpNumberOfAttrsRead
1464 CSRSS_API_REQUEST Request
;
1465 PCSRSS_API_REPLY Reply
;
1469 Reply
= RtlAllocateHeap(GetProcessHeap(),
1471 sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
);
1474 SetLastError(ERROR_OUTOFMEMORY
);
1478 if (lpNumberOfAttrsRead
!= NULL
)
1479 *lpNumberOfAttrsRead
= nLength
;
1481 Request
.Type
= CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
;
1482 Request
.Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1483 Request
.Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
1485 while (nLength
!= 0)
1487 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
)
1488 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
;
1492 Request
.Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
1494 Status
= CsrClientCallServer(&Request
,
1496 sizeof(CSRSS_API_REQUEST
),
1497 sizeof(CSRSS_API_REPLY
) + Size
);
1498 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Reply
->Status
))
1500 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1501 SetLastErrorByStatus(Status
);
1505 // Convert CHARs to WORDs
1506 for(i
= 0; i
< Size
; ++i
)
1507 *lpAttribute
++ = Reply
->Data
.ReadConsoleOutputAttribReply
.String
[i
];
1510 Request
.Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Reply
->Data
.ReadConsoleOutputAttribReply
.EndCoord
;
1513 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1519 /*--------------------------------------------------------------
1520 * WriteConsoleOutputCharacterA
1522 WINBASEAPI BOOL WINAPI
1523 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1527 LPDWORD lpNumberOfCharsWritten
)
1529 PCSRSS_API_REQUEST Request
;
1530 CSRSS_API_REPLY Reply
;
1534 Request
= RtlAllocateHeap(GetProcessHeap(),
1536 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
);
1539 SetLastError( ERROR_OUTOFMEMORY
);
1542 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
;
1543 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
1544 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
1545 if( lpNumberOfCharsWritten
)
1546 *lpNumberOfCharsWritten
= nLength
;
1549 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
: nLength
;
1550 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= Size
;
1551 memcpy( &Request
->Data
.WriteConsoleOutputCharRequest
.String
[0],
1554 Status
= CsrClientCallServer( Request
, &Reply
, sizeof( CSRSS_API_REQUEST
) + Size
, sizeof( CSRSS_API_REPLY
) );
1555 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1557 RtlFreeHeap( GetProcessHeap(), 0, Request
);
1558 SetLastErrorByStatus ( Status
);
1562 lpCharacter
+= Size
;
1563 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Reply
.Data
.WriteConsoleOutputCharReply
.EndCoord
;
1569 /*--------------------------------------------------------------
1570 * WriteConsoleOutputCharacterW
1575 WriteConsoleOutputCharacterW(
1576 HANDLE hConsoleOutput
,
1577 LPCWSTR lpCharacter
,
1580 LPDWORD lpNumberOfCharsWritten
1589 /*--------------------------------------------------------------
1590 * WriteConsoleOutputAttribute
1595 WriteConsoleOutputAttribute(
1596 HANDLE hConsoleOutput
,
1597 CONST WORD
*lpAttribute
,
1600 LPDWORD lpNumberOfAttrsWritten
1603 PCSRSS_API_REQUEST Request
;
1604 CSRSS_API_REPLY Reply
;
1609 Request
= RtlAllocateHeap(GetProcessHeap(),
1611 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
);
1614 SetLastError( ERROR_OUTOFMEMORY
);
1617 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
;
1618 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1619 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
1620 if( lpNumberOfAttrsWritten
)
1621 *lpNumberOfAttrsWritten
= nLength
;
1624 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
: nLength
;
1625 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
1626 for( c
= 0; c
< ( Size
* 2 ); c
++ )
1627 Request
->Data
.WriteConsoleOutputAttribRequest
.String
[c
] = (char)lpAttribute
[c
];
1628 Status
= CsrClientCallServer( Request
, &Reply
, sizeof( CSRSS_API_REQUEST
) + (Size
* 2), sizeof( CSRSS_API_REPLY
) );
1629 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1631 RtlFreeHeap( GetProcessHeap(), 0, Request
);
1632 SetLastErrorByStatus ( Status
);
1636 lpAttribute
+= Size
;
1637 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Reply
.Data
.WriteConsoleOutputAttribReply
.EndCoord
;
1643 /*--------------------------------------------------------------
1644 * FillConsoleOutputAttribute
1649 FillConsoleOutputAttribute(
1650 HANDLE hConsoleOutput
,
1654 LPDWORD lpNumberOfAttrsWritten
1657 CSRSS_API_REQUEST Request
;
1658 CSRSS_API_REPLY Reply
;
1661 Request
.Type
= CSRSS_FILL_OUTPUT_ATTRIB
;
1662 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1663 Request
.Data
.FillOutputAttribRequest
.Attribute
= wAttribute
;
1664 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
1665 Request
.Data
.FillOutputAttribRequest
.Length
= nLength
;
1666 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1667 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1669 SetLastErrorByStatus ( Status
);
1672 if( lpNumberOfAttrsWritten
)
1673 *lpNumberOfAttrsWritten
= nLength
;
1678 /*--------------------------------------------------------------
1685 HANDLE hConsoleHandle
,
1689 CSRSS_API_REQUEST Request
;
1690 CSRSS_API_REPLY Reply
;
1693 Request
.Type
= CSRSS_GET_MODE
;
1694 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
1695 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1696 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1698 SetLastErrorByStatus ( Status
);
1701 *lpMode
= Reply
.Data
.GetConsoleModeReply
.ConsoleMode
;
1706 /*--------------------------------------------------------------
1707 * GetNumberOfConsoleInputEvents
1712 GetNumberOfConsoleInputEvents(
1713 HANDLE hConsoleInput
,
1714 LPDWORD lpNumberOfEvents
1717 CSRSS_API_REQUEST Request
;
1718 CSRSS_API_REPLY Reply
;
1721 if(lpNumberOfEvents
== NULL
)
1723 SetLastError(ERROR_INVALID_PARAMETER
);
1727 Request
.Type
= CSRSS_GET_NUM_INPUT_EVENTS
;
1728 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
1729 Status
= CsrClientCallServer(&Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
1730 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Reply
.Status
))
1732 SetLastErrorByStatus(Reply
.Status
);
1736 *lpNumberOfEvents
= Reply
.Data
.GetNumInputEventsReply
.NumInputEvents
;
1742 /*--------------------------------------------------------------
1743 * GetLargestConsoleWindowSize
1748 GetLargestConsoleWindowSize(
1749 HANDLE hConsoleOutput
1753 COORD Coord
= {80,25};
1761 /*--------------------------------------------------------------
1762 * GetConsoleCursorInfo
1767 GetConsoleCursorInfo(
1768 HANDLE hConsoleOutput
,
1769 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
1772 CSRSS_API_REQUEST Request
;
1773 CSRSS_API_REPLY Reply
;
1776 Request
.Type
= CSRSS_GET_CURSOR_INFO
;
1777 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1778 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1780 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1782 SetLastErrorByStatus ( Status
);
1785 *lpConsoleCursorInfo
= Reply
.Data
.GetCursorInfoReply
.Info
;
1790 /*--------------------------------------------------------------
1791 * GetNumberOfConsoleMouseButtons
1796 GetNumberOfConsoleMouseButtons(
1797 LPDWORD lpNumberOfMouseButtons
1805 /*--------------------------------------------------------------
1812 HANDLE hConsoleHandle
,
1816 CSRSS_API_REQUEST Request
;
1817 CSRSS_API_REPLY Reply
;
1820 Request
.Type
= CSRSS_SET_MODE
;
1821 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
1822 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
1823 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1824 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1826 SetLastErrorByStatus ( Status
);
1833 /*--------------------------------------------------------------
1834 * SetConsoleActiveScreenBuffer
1839 SetConsoleActiveScreenBuffer(
1840 HANDLE hConsoleOutput
1843 CSRSS_API_REQUEST Request
;
1844 CSRSS_API_REPLY Reply
;
1847 Request
.Type
= CSRSS_SET_SCREEN_BUFFER
;
1848 Request
.Data
.SetActiveScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
1849 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1850 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1852 SetLastErrorByStatus ( Status
);
1859 /*--------------------------------------------------------------
1860 * FlushConsoleInputBuffer
1865 FlushConsoleInputBuffer(
1866 HANDLE hConsoleInput
1869 CSRSS_API_REQUEST Request
;
1870 CSRSS_API_REPLY Reply
;
1873 Request
.Type
= CSRSS_FLUSH_INPUT_BUFFER
;
1874 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
1875 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1876 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1878 SetLastErrorByStatus ( Status
);
1885 /*--------------------------------------------------------------
1886 * SetConsoleScreenBufferSize
1891 SetConsoleScreenBufferSize(
1892 HANDLE hConsoleOutput
,
1900 /*--------------------------------------------------------------
1901 * SetConsoleCursorInfo
1906 SetConsoleCursorInfo(
1907 HANDLE hConsoleOutput
,
1908 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
1911 CSRSS_API_REQUEST Request
;
1912 CSRSS_API_REPLY Reply
;
1915 Request
.Type
= CSRSS_SET_CURSOR_INFO
;
1916 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1917 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
1918 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1920 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1922 SetLastErrorByStatus ( Status
);
1929 /*--------------------------------------------------------------
1930 * ScrollConsoleScreenBufferA
1935 ScrollConsoleScreenBufferA(
1936 HANDLE hConsoleOutput
,
1937 CONST SMALL_RECT
*lpScrollRectangle
,
1938 CONST SMALL_RECT
*lpClipRectangle
,
1939 COORD dwDestinationOrigin
,
1940 CONST CHAR_INFO
*lpFill
1943 CSRSS_API_REQUEST Request
;
1944 CSRSS_API_REPLY Reply
;
1947 Request
.Type
= CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER
;
1948 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
1949 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
1951 if (lpClipRectangle
!= NULL
)
1953 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
1954 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
1958 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
1961 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
1962 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
1963 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1965 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1967 SetLastErrorByStatus ( Status
);
1974 /*--------------------------------------------------------------
1975 * ScrollConsoleScreenBufferW
1980 ScrollConsoleScreenBufferW(
1981 HANDLE hConsoleOutput
,
1982 CONST SMALL_RECT
*lpScrollRectangle
,
1983 CONST SMALL_RECT
*lpClipRectangle
,
1984 COORD dwDestinationOrigin
,
1985 CONST CHAR_INFO
*lpFill
1993 /*--------------------------------------------------------------
1994 * SetConsoleWindowInfo
1999 SetConsoleWindowInfo(
2000 HANDLE hConsoleOutput
,
2002 CONST SMALL_RECT
*lpConsoleWindow
2010 /*--------------------------------------------------------------
2011 * SetConsoleTextAttribute
2016 SetConsoleTextAttribute(
2017 HANDLE hConsoleOutput
,
2021 CSRSS_API_REQUEST Request
;
2022 CSRSS_API_REPLY Reply
;
2025 Request
.Type
= CSRSS_SET_ATTRIB
;
2026 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2027 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
2028 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2029 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2031 SetLastErrorByStatus ( Status
);
2038 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2040 if (HandlerRoutine
== NULL
)
2042 IgnoreCtrlEvents
= TRUE
;
2049 RtlReAllocateHeap(RtlGetProcessHeap(),
2051 (PVOID
)CtrlHandlers
,
2052 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2053 if (CtrlHandlers
== NULL
)
2055 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2058 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
2064 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2068 if (HandlerRoutine
== NULL
)
2070 IgnoreCtrlEvents
= FALSE
;
2075 for (i
= 0; i
< NrCtrlHandlers
; i
++)
2077 if (CtrlHandlers
[i
] == HandlerRoutine
)
2079 CtrlHandlers
[i
] = CtrlHandlers
[NrCtrlHandlers
- 1];
2082 RtlReAllocateHeap(RtlGetProcessHeap(),
2084 (PVOID
)CtrlHandlers
,
2085 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2093 WINBASEAPI BOOL WINAPI
2094 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
2099 RtlEnterCriticalSection(&DllLock
);
2102 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
2106 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
2108 RtlLeaveCriticalSection(&DllLock
);
2113 /*--------------------------------------------------------------
2114 * GenerateConsoleCtrlEvent
2116 WINBASEAPI BOOL WINAPI
2117 GenerateConsoleCtrlEvent(
2119 DWORD dwProcessGroupId
2127 /*--------------------------------------------------------------
2130 #define MAX_CONSOLE_TITLE_LENGTH 80
2136 LPWSTR lpConsoleTitle
,
2141 CSRSS_API_REQUEST quest
;
2142 CSRSS_API_REPLY ply
;
2147 Re
.quest
.Type
= CSRSS_GET_TITLE
;
2148 Re
.quest
.Data
.GetTitleRequest
.ConsoleHandle
=
2149 GetStdHandle (STD_INPUT_HANDLE
);
2152 Status
= CsrClientCallServer (
2155 (sizeof (CSRSS_GET_TITLE_REQUEST
) +
2156 sizeof (LPC_MESSAGE
) +
2158 sizeof (CSRSS_API_REPLY
)
2160 if ( !NT_SUCCESS(Status
)
2161 || !NT_SUCCESS (Status
= Re
.ply
.Status
)
2164 SetLastErrorByStatus (Status
);
2168 /* Convert size in characters to size in bytes */
2169 nSize
= sizeof (WCHAR
) * nSize
;
2171 /* Unmarshall data */
2172 if (nSize
< Re
.ply
.Data
.GetTitleReply
.Length
)
2174 DbgPrint ("%s: ret=%d\n", __FUNCTION__
, Re
.ply
.Data
.GetTitleReply
.Length
);
2175 nSize
/= sizeof (WCHAR
);
2180 Re
.ply
.Data
.GetTitleReply
.Title
,
2184 lpConsoleTitle
[nSize
--] = L
'\0';
2189 nSize
= Re
.ply
.Data
.GetTitleReply
.Length
/ sizeof (WCHAR
);
2190 wcscpy (lpConsoleTitle
, Re
.ply
.Data
.GetTitleReply
.Title
);
2197 /*--------------------------------------------------------------
2206 LPSTR lpConsoleTitle
,
2210 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
2211 DWORD nWideTitle
= sizeof WideTitle
;
2214 if (!lpConsoleTitle
|| !nSize
) return 0;
2215 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
2216 if (!nWideTitle
) return 0;
2218 if ( (nWritten
= WideCharToMultiByte(
2219 CP_ACP
, // ANSI code page
2220 0, // performance and mapping flags
2221 (LPWSTR
) WideTitle
, // address of wide-character string
2222 nWideTitle
, // number of characters in string
2223 lpConsoleTitle
, // address of buffer for new string
2224 nSize
, // size of buffer
2229 lpConsoleTitle
[nWritten
] = '\0';
2237 /*--------------------------------------------------------------
2244 LPCWSTR lpConsoleTitle
2247 PCSRSS_API_REQUEST Request
;
2248 CSRSS_API_REPLY Reply
;
2252 Request
= RtlAllocateHeap(GetProcessHeap(),
2254 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_SET_TITLE_REQUEST
);
2255 if (Request
== NULL
)
2257 SetLastError(ERROR_OUTOFMEMORY
);
2261 Request
->Type
= CSRSS_SET_TITLE
;
2262 Request
->Data
.SetTitleRequest
.Console
= GetStdHandle( STD_INPUT_HANDLE
);
2264 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
2265 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
2267 Request
->Data
.SetTitleRequest
.Title
[c
] = 0;
2268 Request
->Data
.SetTitleRequest
.Length
= c
;
2269 Status
= CsrClientCallServer(Request
,
2271 sizeof(CSRSS_SET_TITLE_REQUEST
) +
2273 sizeof( LPC_MESSAGE
) +
2275 sizeof(CSRSS_API_REPLY
));
2277 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2279 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2280 SetLastErrorByStatus (Status
);
2283 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2288 /*--------------------------------------------------------------
2297 LPCSTR lpConsoleTitle
2300 PCSRSS_API_REQUEST Request
;
2301 CSRSS_API_REPLY Reply
;
2305 Request
= RtlAllocateHeap(GetProcessHeap(),
2307 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_SET_TITLE_REQUEST
);
2308 if (Request
== NULL
)
2310 SetLastError(ERROR_OUTOFMEMORY
);
2314 Request
->Type
= CSRSS_SET_TITLE
;
2315 Request
->Data
.SetTitleRequest
.Console
= GetStdHandle( STD_INPUT_HANDLE
);
2317 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
2318 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
2320 Request
->Data
.SetTitleRequest
.Title
[c
] = 0;
2321 Request
->Data
.SetTitleRequest
.Length
= c
;
2322 Status
= CsrClientCallServer(Request
,
2324 sizeof(CSRSS_SET_TITLE_REQUEST
) +
2326 sizeof( LPC_MESSAGE
) +
2328 sizeof(CSRSS_API_REPLY
));
2330 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2332 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2333 SetLastErrorByStatus (Status
);
2336 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2341 /*--------------------------------------------------------------
2348 HANDLE hConsoleInput
,
2350 DWORD nNumberOfCharsToRead
,
2351 LPDWORD lpNumberOfCharsRead
,
2360 /*--------------------------------------------------------------
2367 HANDLE hConsoleOutput
,
2368 CONST VOID
*lpBuffer
,
2369 DWORD nNumberOfCharsToWrite
,
2370 LPDWORD lpNumberOfCharsWritten
,
2375 PCSRSS_API_REQUEST Request
;
2376 CSRSS_API_REPLY Reply
;
2379 Request
= RtlAllocateHeap(GetProcessHeap(),
2381 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
* sizeof(WCHAR
));
2382 if (Request
== NULL
)
2384 SetLastError(ERROR_OUTOFMEMORY
);
2388 Request
->Type
= CSRSS_WRITE_CONSOLE
;
2389 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
2390 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
=
2391 nNumberOfCharsToWrite
;
2392 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
2393 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
2394 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
,
2396 nNumberOfCharsToWrite
* sizeof(WCHAR
));
2398 Status
= CsrClientCallServer(Request
,
2400 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
,
2401 sizeof(CSRSS_API_REPLY
));
2403 RtlFreeHeap(GetProcessHeap(),
2407 if (!NT_SUCCESS(Status
))
2412 if (lpNumberOfCharsWritten
!= NULL
)
2414 *lpNumberOfCharsWritten
=
2415 Reply
.Data
.WriteConsoleReply
.NrCharactersWritten
;
2424 /*--------------------------------------------------------------
2425 * CreateConsoleScreenBuffer
2430 CreateConsoleScreenBuffer(
2431 DWORD dwDesiredAccess
,
2433 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
2435 LPVOID lpScreenBufferData
2438 // FIXME: don't ignore access, share mode, and security
2439 CSRSS_API_REQUEST Request
;
2440 CSRSS_API_REPLY Reply
;
2443 Request
.Type
= CSRSS_CREATE_SCREEN_BUFFER
;
2444 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2445 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2447 SetLastErrorByStatus ( Status
);
2450 return Reply
.Data
.CreateScreenBufferReply
.OutputHandle
;
2454 /*--------------------------------------------------------------
2460 GetConsoleCP( VOID
)
2463 return CP_OEMCP
; /* FIXME */
2467 /*--------------------------------------------------------------
2482 /*--------------------------------------------------------------
2483 * GetConsoleOutputCP
2488 GetConsoleOutputCP( VOID
)
2491 return 0; /* FIXME */
2495 /*--------------------------------------------------------------
2496 * SetConsoleOutputCP
2510 /*--------------------------------------------------------------
2511 * GetConsoleProcessList
2514 GetConsoleProcessList(LPDWORD lpdwProcessList
,
2515 DWORD dwProcessCount
)
2517 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2523 /*--------------------------------------------------------------
2524 * GetConsoleSelectionInfo
2527 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
2529 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2535 /*--------------------------------------------------------------
2539 AttachConsole(DWORD dwProcessId
)
2541 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);