1 /* $Id: console.c,v 1.24 2000/07/01 17:07:00 ea 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 /* FUNCTIONS *****************************************************************/
31 /*--------------------------------------------------------------
34 WINBOOL STDCALL
CloseConsoleHandle(HANDLE Handle
)
36 if (FALSE
== IsConsoleHandle (Handle
))
38 SetLastError (ERROR_INVALID_PARAMETER
);
41 /* FIXME: call CSRSS */
45 /*--------------------------------------------------------------
48 BOOLEAN STDCALL
IsConsoleHandle(HANDLE Handle
)
50 if ((((ULONG
)Handle
) & 0x10000003) == 0x3)
58 /*--------------------------------------------------------------
61 HANDLE STDCALL
GetStdHandle(DWORD nStdHandle
)
63 PRTL_USER_PROCESS_PARAMETERS Ppb
;
65 // DbgPrint("GetStdHandle(nStdHandle %d)\n",nStdHandle);
67 SetLastError(ERROR_SUCCESS
); /* OK */
68 // DbgPrint("NtCurrentPeb() %x\n", NtCurrentPeb());
69 Ppb
= NtCurrentPeb()->ProcessParameters
;
70 // DbgPrint("Ppb %x\n", Ppb);
71 // DbgPrint("Ppb->OutputHandle %x\n", Ppb->OutputHandle);
74 case STD_INPUT_HANDLE
: return Ppb
->InputHandle
;
75 case STD_OUTPUT_HANDLE
: return Ppb
->OutputHandle
;
76 case STD_ERROR_HANDLE
: return Ppb
->ErrorHandle
;
78 SetLastError( ERROR_INVALID_PARAMETER
);
79 return INVALID_HANDLE_VALUE
;
83 /*--------------------------------------------------------------
86 WINBASEAPI BOOL WINAPI
SetStdHandle(DWORD nStdHandle
,
89 PRTL_USER_PROCESS_PARAMETERS Ppb
;
91 Ppb
= NtCurrentPeb()->ProcessParameters
;
93 /* More checking needed? */
94 if (hHandle
== INVALID_HANDLE_VALUE
)
96 SetLastError( ERROR_INVALID_HANDLE
);
100 SetLastError(ERROR_SUCCESS
); /* OK */
103 case STD_INPUT_HANDLE
:
104 Ppb
->InputHandle
= hHandle
;
106 case STD_OUTPUT_HANDLE
:
107 Ppb
->OutputHandle
= hHandle
;
109 case STD_ERROR_HANDLE
:
110 Ppb
->ErrorHandle
= hHandle
;
113 SetLastError( ERROR_INVALID_PARAMETER
);
118 /*--------------------------------------------------------------
121 WINBOOL STDCALL
WriteConsoleA(HANDLE hConsoleOutput
,
122 CONST VOID
*lpBuffer
,
123 DWORD nNumberOfCharsToWrite
,
124 LPDWORD lpNumberOfCharsWritten
,
127 PCSRSS_API_REQUEST Request
;
128 CSRSS_API_REPLY Reply
;
132 Request
= HeapAlloc(GetProcessHeap(),
134 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_WRITE_CONSOLE_REQUEST
);
140 Request
->Type
= CSRSS_WRITE_CONSOLE
;
141 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
142 if (lpNumberOfCharsWritten
!= NULL
)
143 *lpNumberOfCharsWritten
= nNumberOfCharsToWrite
;
144 while( nNumberOfCharsToWrite
)
146 Size
= nNumberOfCharsToWrite
> CSRSS_MAX_WRITE_CONSOLE_REQUEST
? CSRSS_MAX_WRITE_CONSOLE_REQUEST
: nNumberOfCharsToWrite
;
148 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= Size
;
150 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
151 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
153 memcpy( Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, Size
);
155 Status
= CsrClientCallServer(Request
,
157 sizeof(CSRSS_WRITE_CONSOLE_REQUEST
) +
159 sizeof(CSRSS_API_REPLY
));
161 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
163 HeapFree( GetProcessHeap(), 0, Request
);
164 SetLastErrorByStatus (Status
);
167 nNumberOfCharsToWrite
-= Size
;
170 HeapFree( GetProcessHeap(), 0, Request
);
175 /*--------------------------------------------------------------
178 WINBOOL STDCALL
ReadConsoleA(HANDLE hConsoleInput
,
180 DWORD nNumberOfCharsToRead
,
181 LPDWORD lpNumberOfCharsRead
,
184 CSRSS_API_REQUEST Request
;
185 PCSRSS_API_REPLY Reply
;
188 Reply
= HeapAlloc(GetProcessHeap(),
190 sizeof(CSRSS_API_REPLY
) + nNumberOfCharsToRead
);
196 Request
.Type
= CSRSS_READ_CONSOLE
;
197 Request
.Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
198 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
= nNumberOfCharsToRead
> CSRSS_MAX_READ_CONSOLE_REQUEST
? CSRSS_MAX_READ_CONSOLE_REQUEST
: nNumberOfCharsToRead
;
200 Status
= CsrClientCallServer(&Request
,
202 sizeof(CSRSS_API_REQUEST
),
203 sizeof(CSRSS_API_REPLY
) +
204 nNumberOfCharsToRead
);
205 // DbgPrint( "Csrss Returned\n" );
206 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
->Status
))
208 DbgPrint( "CSR returned error in ReadConsole\n" );
209 SetLastErrorByStatus ( Status
);
210 HeapFree( GetProcessHeap(), 0, Reply
);
213 while( Reply
->Status
== STATUS_PENDING
)
215 //DbgPrint( "Read pending, waiting on object %x\n", Reply->Data.ReadConsoleReply.EventHandle );
216 Status
= NtWaitForSingleObject( Reply
->Data
.ReadConsoleReply
.EventHandle
, FALSE
, 0 );
217 if( !NT_SUCCESS( Status
) )
219 DbgPrint( "Wait for console input failed!\n" );
220 HeapFree( GetProcessHeap(), 0, Reply
);
223 Status
= CsrClientCallServer( &Request
, Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) + nNumberOfCharsToRead
);
224 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
->Status
) )
226 SetLastErrorByStatus ( Status
);
227 HeapFree( GetProcessHeap(), 0, Reply
);
231 if (lpNumberOfCharsRead
!= NULL
)
232 *lpNumberOfCharsRead
= Reply
->Data
.ReadConsoleReply
.NrCharactersRead
;
234 Reply
->Data
.ReadConsoleReply
.Buffer
,
235 Reply
->Data
.ReadConsoleReply
.NrCharactersRead
);
236 HeapFree(GetProcessHeap(),
244 /*--------------------------------------------------------------
247 WINBOOL STDCALL
AllocConsole(VOID
)
249 CSRSS_API_REQUEST Request
;
250 CSRSS_API_REPLY Reply
;
253 Request
.Type
= CSRSS_ALLOC_CONSOLE
;
254 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
255 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
257 SetLastErrorByStatus ( Status
);
260 SetStdHandle( STD_INPUT_HANDLE
, Reply
.Data
.AllocConsoleReply
.ConsoleHandle
);
261 SetStdHandle( STD_OUTPUT_HANDLE
, Reply
.Data
.AllocConsoleReply
.ConsoleHandle
);
262 SetStdHandle( STD_ERROR_HANDLE
, Reply
.Data
.AllocConsoleReply
.ConsoleHandle
);
267 /*--------------------------------------------------------------
270 WINBOOL STDCALL
FreeConsole(VOID
)
272 DbgPrint("FreeConsole() is unimplemented");
277 /*--------------------------------------------------------------
278 * GetConsoleScreenBufferInfo
282 GetConsoleScreenBufferInfo(
283 HANDLE hConsoleOutput
,
284 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
287 CSRSS_API_REQUEST Request
;
288 CSRSS_API_REPLY Reply
;
291 Request
.Type
= CSRSS_SCREEN_BUFFER_INFO
;
292 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
293 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
294 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
296 SetLastErrorByStatus ( Status
);
299 *lpConsoleScreenBufferInfo
= Reply
.Data
.ScreenBufferInfoReply
.Info
;
304 /*--------------------------------------------------------------
305 * SetConsoleCursorPosition
309 SetConsoleCursorPosition(
310 HANDLE hConsoleOutput
,
311 COORD dwCursorPosition
314 CSRSS_API_REQUEST Request
;
315 CSRSS_API_REPLY Reply
;
318 Request
.Type
= CSRSS_SET_CURSOR
;
319 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
320 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
321 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
322 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
324 SetLastErrorByStatus ( Status
);
331 /*--------------------------------------------------------------
332 * FillConsoleOutputCharacterA
336 FillConsoleOutputCharacterA(
337 HANDLE hConsoleOutput
,
341 LPDWORD lpNumberOfCharsWritten
344 CSRSS_API_REQUEST Request
;
345 CSRSS_API_REPLY Reply
;
348 Request
.Type
= CSRSS_FILL_OUTPUT
;
349 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
350 Request
.Data
.FillOutputRequest
.Char
= cCharacter
;
351 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
352 Request
.Data
.FillOutputRequest
.Length
= nLength
;
353 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
354 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
356 SetLastErrorByStatus ( Status
);
359 *lpNumberOfCharsWritten
= nLength
;
364 /*--------------------------------------------------------------
365 * FillConsoleOutputCharacterW
369 FillConsoleOutputCharacterW(
370 HANDLE hConsoleOutput
,
374 LPDWORD lpNumberOfCharsWritten
382 /*--------------------------------------------------------------
389 HANDLE hConsoleInput
,
390 PINPUT_RECORD lpBuffer
,
392 LPDWORD lpNumberOfEventsRead
400 /*--------------------------------------------------------------
407 HANDLE hConsoleInput
,
408 PINPUT_RECORD lpBuffer
,
410 LPDWORD lpNumberOfEventsRead
418 /*--------------------------------------------------------------
425 HANDLE hConsoleInput
,
426 PINPUT_RECORD lpBuffer
,
428 LPDWORD lpNumberOfEventsRead
431 CSRSS_API_REQUEST Request
;
432 CSRSS_API_REPLY Reply
;
435 Request
.Type
= CSRSS_READ_INPUT
;
436 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
437 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
438 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
440 SetLastErrorByStatus ( Status
);
443 while( Status
== STATUS_PENDING
)
445 Status
= NtWaitForSingleObject( Reply
.Data
.ReadInputReply
.Event
, FALSE
, 0 );
446 if( !NT_SUCCESS( Status
) )
448 SetLastErrorByStatus ( Status
);
451 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
452 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
454 SetLastErrorByStatus ( Status
);
458 *lpNumberOfEventsRead
= 1;
459 *lpBuffer
= Reply
.Data
.ReadInputReply
.Input
;
464 /*--------------------------------------------------------------
471 HANDLE hConsoleInput
,
472 PINPUT_RECORD lpBuffer
,
474 LPDWORD lpNumberOfEventsRead
482 /*--------------------------------------------------------------
489 HANDLE hConsoleInput
,
490 CONST INPUT_RECORD
*lpBuffer
,
492 LPDWORD lpNumberOfEventsWritten
500 /*--------------------------------------------------------------
507 HANDLE hConsoleInput
,
508 CONST INPUT_RECORD
*lpBuffer
,
510 LPDWORD lpNumberOfEventsWritten
518 /*--------------------------------------------------------------
525 HANDLE hConsoleOutput
,
529 PSMALL_RECT lpReadRegion
537 /*--------------------------------------------------------------
544 HANDLE hConsoleOutput
,
548 PSMALL_RECT lpReadRegion
555 /*--------------------------------------------------------------
556 * WriteConsoleOutputA
562 HANDLE hConsoleOutput
,
563 CONST CHAR_INFO
*lpBuffer
,
566 PSMALL_RECT lpWriteRegion
574 /*--------------------------------------------------------------
575 * WriteConsoleOutputW
581 HANDLE hConsoleOutput
,
582 CONST CHAR_INFO
*lpBuffer
,
585 PSMALL_RECT lpWriteRegion
593 /*--------------------------------------------------------------
594 * ReadConsoleOutputCharacterA
599 ReadConsoleOutputCharacterA(
600 HANDLE hConsoleOutput
,
604 LPDWORD lpNumberOfCharsRead
607 SetLastError( ERROR_CALL_NOT_IMPLEMENTED
);
612 /*--------------------------------------------------------------
613 * ReadConsoleOutputCharacterW
618 ReadConsoleOutputCharacterW(
619 HANDLE hConsoleOutput
,
623 LPDWORD lpNumberOfCharsRead
631 /*--------------------------------------------------------------
632 * ReadConsoleOutputAttribute
637 ReadConsoleOutputAttribute(
638 HANDLE hConsoleOutput
,
642 LPDWORD lpNumberOfAttrsRead
645 SetLastError( ERROR_CALL_NOT_IMPLEMENTED
);
650 /*--------------------------------------------------------------
651 * WriteConsoleOutputCharacterA
656 WriteConsoleOutputCharacterA(
657 HANDLE hConsoleOutput
,
661 LPDWORD lpNumberOfCharsWritten
664 CSRSS_API_REQUEST Request
;
665 CSRSS_API_REPLY Reply
;
669 Request
.Type
= CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
;
670 Request
.Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
671 Request
.Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
672 if( lpNumberOfCharsWritten
)
673 *lpNumberOfCharsWritten
= nLength
;
676 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
: nLength
;
677 Request
.Data
.WriteConsoleOutputCharRequest
.Length
= Size
;
679 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
680 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
682 SetLastErrorByStatus ( Status
);
687 Request
.Data
.WriteConsoleOutputCharRequest
.Coord
= Reply
.Data
.WriteConsoleOutputCharReply
.EndCoord
;
693 /*--------------------------------------------------------------
694 * WriteConsoleOutputCharacterW
699 WriteConsoleOutputCharacterW(
700 HANDLE hConsoleOutput
,
704 LPDWORD lpNumberOfCharsWritten
713 /*--------------------------------------------------------------
714 * WriteConsoleOutputAttribute
719 WriteConsoleOutputAttribute(
720 HANDLE hConsoleOutput
,
721 CONST WORD
*lpAttribute
,
724 LPDWORD lpNumberOfAttrsWritten
727 CSRSS_API_REQUEST Request
;
728 CSRSS_API_REPLY Reply
;
733 Request
.Type
= CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
;
734 Request
.Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
735 Request
.Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
736 if( lpNumberOfAttrsWritten
)
737 *lpNumberOfAttrsWritten
= nLength
;
740 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
: nLength
;
741 Request
.Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
742 for( c
= 0; c
< Size
; c
++ )
743 Request
.Data
.WriteConsoleOutputAttribRequest
.String
[c
] = lpAttribute
[c
];
744 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
745 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
747 SetLastErrorByStatus ( Status
);
752 Request
.Data
.WriteConsoleOutputAttribRequest
.Coord
= Reply
.Data
.WriteConsoleOutputAttribReply
.EndCoord
;
758 /*--------------------------------------------------------------
759 * FillConsoleOutputAttribute
764 FillConsoleOutputAttribute(
765 HANDLE hConsoleOutput
,
769 LPDWORD lpNumberOfAttrsWritten
772 CSRSS_API_REQUEST Request
;
773 CSRSS_API_REPLY Reply
;
776 Request
.Type
= CSRSS_FILL_OUTPUT_ATTRIB
;
777 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
778 Request
.Data
.FillOutputAttribRequest
.Attribute
= wAttribute
;
779 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
780 Request
.Data
.FillOutputAttribRequest
.Length
= nLength
;
781 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
782 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
784 SetLastErrorByStatus ( Status
);
787 if( lpNumberOfAttrsWritten
)
788 *lpNumberOfAttrsWritten
= nLength
;
793 /*--------------------------------------------------------------
800 HANDLE hConsoleHandle
,
804 SetLastError( ERROR_CALL_NOT_IMPLEMENTED
);
809 /*--------------------------------------------------------------
810 * GetNumberOfConsoleInputEvents
815 GetNumberOfConsoleInputEvents(
816 HANDLE hConsoleInput
,
817 LPDWORD lpNumberOfEvents
825 /*--------------------------------------------------------------
826 * GetLargestConsoleWindowSize
831 GetLargestConsoleWindowSize(
832 HANDLE hConsoleOutput
836 COORD Coord
= {80,25};
844 /*--------------------------------------------------------------
845 * GetConsoleCursorInfo
850 GetConsoleCursorInfo(
851 HANDLE hConsoleOutput
,
852 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
855 CSRSS_API_REQUEST Request
;
856 CSRSS_API_REPLY Reply
;
859 Request
.Type
= CSRSS_GET_CURSOR_INFO
;
860 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
861 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
862 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
864 SetLastErrorByStatus ( Status
);
867 *lpConsoleCursorInfo
= Reply
.Data
.GetCursorInfoReply
.Info
;
872 /*--------------------------------------------------------------
873 * GetNumberOfConsoleMouseButtons
878 GetNumberOfConsoleMouseButtons(
879 LPDWORD lpNumberOfMouseButtons
887 /*--------------------------------------------------------------
894 HANDLE hConsoleHandle
,
898 SetLastError( ERROR_CALL_NOT_IMPLEMENTED
);
903 /*--------------------------------------------------------------
904 * SetConsoleActiveScreenBuffer
909 SetConsoleActiveScreenBuffer(
910 HANDLE hConsoleOutput
918 /*--------------------------------------------------------------
919 * FlushConsoleInputBuffer
924 FlushConsoleInputBuffer(
933 /*--------------------------------------------------------------
934 * SetConsoleScreenBufferSize
939 SetConsoleScreenBufferSize(
940 HANDLE hConsoleOutput
,
948 /*--------------------------------------------------------------
949 * SetConsoleCursorInfo
954 SetConsoleCursorInfo(
955 HANDLE hConsoleOutput
,
956 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
959 CSRSS_API_REQUEST Request
;
960 CSRSS_API_REPLY Reply
;
963 Request
.Type
= CSRSS_SET_CURSOR_INFO
;
964 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
965 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
966 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
967 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
969 SetLastErrorByStatus ( Status
);
976 /*--------------------------------------------------------------
977 * ScrollConsoleScreenBufferA
982 ScrollConsoleScreenBufferA(
983 HANDLE hConsoleOutput
,
984 CONST SMALL_RECT
*lpScrollRectangle
,
985 CONST SMALL_RECT
*lpClipRectangle
,
986 COORD dwDestinationOrigin
,
987 CONST CHAR_INFO
*lpFill
995 /*--------------------------------------------------------------
996 * ScrollConsoleScreenBufferW
1001 ScrollConsoleScreenBufferW(
1002 HANDLE hConsoleOutput
,
1003 CONST SMALL_RECT
*lpScrollRectangle
,
1004 CONST SMALL_RECT
*lpClipRectangle
,
1005 COORD dwDestinationOrigin
,
1006 CONST CHAR_INFO
*lpFill
1014 /*--------------------------------------------------------------
1015 * SetConsoleWindowInfo
1020 SetConsoleWindowInfo(
1021 HANDLE hConsoleOutput
,
1023 CONST SMALL_RECT
*lpConsoleWindow
1031 /*--------------------------------------------------------------
1032 * SetConsoleTextAttribute
1037 SetConsoleTextAttribute(
1038 HANDLE hConsoleOutput
,
1042 CSRSS_API_REQUEST Request
;
1043 CSRSS_API_REPLY Reply
;
1046 Request
.Type
= CSRSS_SET_ATTRIB
;
1047 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1048 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
1049 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1050 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1052 SetLastErrorByStatus ( Status
);
1059 /*--------------------------------------------------------------
1060 * SetConsoleCtrlHandler
1065 SetConsoleCtrlHandler(
1066 PHANDLER_ROUTINE HandlerRoutine
,
1075 /*--------------------------------------------------------------
1076 * GenerateConsoleCtrlEvent
1081 GenerateConsoleCtrlEvent(
1083 DWORD dwProcessGroupId
1091 /*--------------------------------------------------------------
1094 #define MAX_CONSOLE_TITLE_LENGTH 80
1100 LPWSTR lpConsoleTitle
,
1109 /*--------------------------------------------------------------
1118 LPSTR lpConsoleTitle
,
1122 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1123 DWORD nWideTitle
= sizeof WideTitle
;
1126 if (!lpConsoleTitle
|| !nSize
) return 0;
1127 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
1128 if (!nWideTitle
) return 0;
1130 if ( (nWritten
= WideCharToMultiByte(
1131 CP_ACP
, // ANSI code page
1132 0, // performance and mapping flags
1133 (LPWSTR
) WideTitle
, // address of wide-character string
1134 nWideTitle
, // number of characters in string
1135 lpConsoleTitle
, // address of buffer for new string
1136 nSize
, // size of buffer
1141 lpConsoleTitle
[nWritten
] = '\0';
1149 /*--------------------------------------------------------------
1156 LPCWSTR lpConsoleTitle
1164 /*--------------------------------------------------------------
1173 LPCSTR lpConsoleTitle
1176 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1177 char AnsiTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1180 if (!lpConsoleTitle
) return FALSE
;
1181 ZeroMemory( WideTitle
, sizeof WideTitle
);
1182 nWideTitle
= lstrlenA(lpConsoleTitle
);
1191 AnsiTitle
[nWideTitle
] = '\0';
1193 if ( MultiByteToWideChar(
1194 CP_ACP
, // ANSI code page
1195 MB_PRECOMPOSED
, // character-type options
1196 AnsiTitle
, // address of string to map
1197 nWideTitle
, // number of characters in string
1198 (LPWSTR
) WideTitle
, // address of wide-character buffer
1199 (-1) // size of buffer: -1=...\0
1202 return SetConsoleTitleW( (LPWSTR
) WideTitle
);
1209 /*--------------------------------------------------------------
1216 HANDLE hConsoleInput
,
1218 DWORD nNumberOfCharsToRead
,
1219 LPDWORD lpNumberOfCharsRead
,
1228 /*--------------------------------------------------------------
1235 HANDLE hConsoleOutput
,
1236 CONST VOID
*lpBuffer
,
1237 DWORD nNumberOfCharsToWrite
,
1238 LPDWORD lpNumberOfCharsWritten
,
1243 PCSRSS_API_REQUEST Request
;
1244 CSRSS_API_REPLY Reply
;
1247 Request
= HeapAlloc(GetProcessHeap(),
1249 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
* sizeof(WCHAR
));
1250 if (Request
== NULL
)
1255 Request
->Type
= CSRSS_WRITE_CONSOLE
;
1256 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1257 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
=
1258 nNumberOfCharsToWrite
;
1259 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
1260 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
1261 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
,
1263 nNumberOfCharsToWrite
* sizeof(WCHAR
));
1265 Status
= CsrClientCallServer(Request
,
1267 sizeof(CSRSS_API_REQUEST
) +
1268 nNumberOfCharsToWrite
,
1269 sizeof(CSRSS_API_REPLY
));
1271 HeapFree(GetProcessHeap(),
1275 if (!NT_SUCCESS(Status
))
1280 if (lpNumberOfCharsWritten
!= NULL
)
1282 *lpNumberOfCharsWritten
=
1283 Reply
.Data
.WriteConsoleReply
.NrCharactersWritten
;
1292 /*--------------------------------------------------------------
1293 * CreateConsoleScreenBuffer
1298 CreateConsoleScreenBuffer(
1299 DWORD dwDesiredAccess
,
1301 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1303 LPVOID lpScreenBufferData
1311 /*--------------------------------------------------------------
1317 GetConsoleCP( VOID
)
1320 return CP_OEMCP
; /* FIXME */
1324 /*--------------------------------------------------------------
1339 /*--------------------------------------------------------------
1340 * GetConsoleOutputCP
1345 GetConsoleOutputCP( VOID
)
1348 return 0; /* FIXME */
1352 /*--------------------------------------------------------------
1353 * SetConsoleOutputCP