1 /* $Id: console.c,v 1.51 2003/01/18 00:10:59 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 ******************************************************************/
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
);