2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/misc/console.c
5 * PURPOSE: Win32 server console functions
9 * 19990204 EA SetConsoleTitleA
13 /* INCLUDES ******************************************************************/
15 #include <ddk/ntddk.h>
16 #include <ddk/ntddblue.h>
21 #include <csrss/csrss.h>
22 #include <ntdll/csr.h>
25 #include <kernel32/kernel32.h>
27 /* FUNCTIONS *****************************************************************/
29 WINBOOL STDCALL
CloseConsoleHandle(HANDLE Handle
)
33 BOOLEAN
IsConsoleHandle(HANDLE Handle
)
35 if ((((ULONG
)Handle
) & 0x10000003) == 0x3)
43 /*--------------------------------------------------------------
46 HANDLE STDCALL
GetStdHandle(DWORD nStdHandle
)
48 PRTL_USER_PROCESS_PARAMETERS Ppb
;
50 // DbgPrint("GetStdHandle(nStdHandle %d)\n",nStdHandle);
52 SetLastError(ERROR_SUCCESS
); /* OK */
53 // DbgPrint("NtCurrentPeb() %x\n", NtCurrentPeb());
54 Ppb
= NtCurrentPeb()->ProcessParameters
;
55 // DbgPrint("Ppb %x\n", Ppb);
56 // DbgPrint("Ppb->OutputHandle %x\n", Ppb->OutputHandle);
59 case STD_INPUT_HANDLE
: return Ppb
->InputHandle
;
60 case STD_OUTPUT_HANDLE
: return Ppb
->OutputHandle
;
61 case STD_ERROR_HANDLE
: return Ppb
->ErrorHandle
;
63 SetLastError( ERROR_INVALID_PARAMETER
);
64 return INVALID_HANDLE_VALUE
;
68 /*--------------------------------------------------------------
71 WINBASEAPI BOOL WINAPI
SetStdHandle(DWORD nStdHandle
,
74 PRTL_USER_PROCESS_PARAMETERS Ppb
;
76 Ppb
= NtCurrentPeb()->ProcessParameters
;
78 /* More checking needed? */
79 if (hHandle
== INVALID_HANDLE_VALUE
)
81 SetLastError( ERROR_INVALID_HANDLE
);
85 SetLastError(ERROR_SUCCESS
); /* OK */
88 case STD_INPUT_HANDLE
:
89 Ppb
->InputHandle
= hHandle
;
91 case STD_OUTPUT_HANDLE
:
92 Ppb
->OutputHandle
= hHandle
;
94 case STD_ERROR_HANDLE
:
95 Ppb
->ErrorHandle
= hHandle
;
98 SetLastError( ERROR_INVALID_PARAMETER
);
103 /*--------------------------------------------------------------
106 WINBOOL STDCALL
WriteConsoleA(HANDLE hConsoleOutput
,
107 CONST VOID
*lpBuffer
,
108 DWORD nNumberOfCharsToWrite
,
109 LPDWORD lpNumberOfCharsWritten
,
112 PCSRSS_API_REQUEST Request
;
113 CSRSS_API_REPLY Reply
;
116 Request
= HeapAlloc(GetProcessHeap(),
118 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
);
124 Request
->Type
= CSRSS_WRITE_CONSOLE
;
125 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
126 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
=
127 nNumberOfCharsToWrite
;
129 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
130 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
132 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
,
134 nNumberOfCharsToWrite
);
136 Status
= CsrClientCallServer(Request
,
138 sizeof(CSRSS_API_REQUEST
) +
139 nNumberOfCharsToWrite
,
140 sizeof(CSRSS_API_REPLY
));
142 HeapFree(GetProcessHeap(),
146 if (!NT_SUCCESS(Status
))
151 if (lpNumberOfCharsWritten
!= NULL
)
153 *lpNumberOfCharsWritten
=
154 Reply
.Data
.WriteConsoleReply
.NrCharactersWritten
;
161 /*--------------------------------------------------------------
164 WINBOOL STDCALL
ReadConsoleA(HANDLE hConsoleInput
,
166 DWORD nNumberOfCharsToRead
,
167 LPDWORD lpNumberOfCharsRead
,
170 CSRSS_API_REQUEST Request
;
171 PCSRSS_API_REPLY Reply
;
174 Reply
= HeapAlloc(GetProcessHeap(),
176 sizeof(CSRSS_API_REPLY
) + nNumberOfCharsToRead
);
182 Request
.Type
= CSRSS_READ_CONSOLE
;
183 Request
.Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
184 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
=
185 nNumberOfCharsToRead
;
187 Status
= CsrClientCallServer(&Request
,
189 sizeof(CSRSS_API_REQUEST
),
190 sizeof(CSRSS_API_REPLY
) +
191 nNumberOfCharsToRead
);
192 // DbgPrint( "Csrss Returned\n" );
193 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Reply
->Status
))
195 DbgPrint( "CSR returned error in ReadConsole\n" );
196 HeapFree( GetProcessHeap(), 0, Reply
);
199 if( Reply
->Status
== STATUS_PENDING
)
201 //DbgPrint( "Read pending, waiting on object %x\n", Reply->Data.ReadConsoleReply.EventHandle );
202 Status
= NtWaitForSingleObject( Reply
->Data
.ReadConsoleReply
.EventHandle
, FALSE
, 0 );
203 if( !NT_SUCCESS( Status
) )
205 DbgPrint( "Wait for console input failed!\n" );
206 HeapFree( GetProcessHeap(), 0, Reply
);
209 Status
= CsrClientCallServer( &Request
, Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) + nNumberOfCharsToRead
);
210 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Reply
->Status
) )
212 SetLastError( RtlNtStatusToDosError( Reply
->Status
) );
213 HeapFree( GetProcessHeap(), 0, Reply
);
217 if (lpNumberOfCharsRead
!= NULL
)
219 *lpNumberOfCharsRead
=
220 Reply
->Data
.ReadConsoleReply
.NrCharactersRead
;
223 Reply
->Data
.ReadConsoleReply
.Buffer
,
224 Reply
->Data
.ReadConsoleReply
.NrCharactersRead
);
225 HeapFree(GetProcessHeap(),
233 /*--------------------------------------------------------------
236 WINBOOL STDCALL
AllocConsole(VOID
)
238 CSRSS_API_REQUEST Request
;
239 CSRSS_API_REPLY Reply
;
242 Request
.Type
= CSRSS_ALLOC_CONSOLE
;
243 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
244 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Reply
.Status
) )
246 SetStdHandle( STD_INPUT_HANDLE
, Reply
.Data
.AllocConsoleReply
.ConsoleHandle
);
247 SetStdHandle( STD_OUTPUT_HANDLE
, Reply
.Data
.AllocConsoleReply
.ConsoleHandle
);
248 SetStdHandle( STD_ERROR_HANDLE
, Reply
.Data
.AllocConsoleReply
.ConsoleHandle
);
253 /*--------------------------------------------------------------
256 WINBOOL STDCALL
FreeConsole(VOID
)
258 DbgPrint("FreeConsole() is unimplemented");
262 /*--------------------------------------------------------------
263 * GetConsoleScreenBufferInfo
267 GetConsoleScreenBufferInfo(
268 HANDLE hConsoleOutput
,
269 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
272 DWORD dwBytesReturned
;
274 if ( !DeviceIoControl(
276 IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
,
279 lpConsoleScreenBufferInfo
,
280 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
286 SetLastError(0); /* FIXME: What error code? */
289 SetLastError(ERROR_SUCCESS
); /* OK */
294 /*--------------------------------------------------------------
295 * SetConsoleCursorPosition
299 SetConsoleCursorPosition(
300 HANDLE hConsoleOutput
,
301 COORD dwCursorPosition
304 DWORD dwBytesReturned
;
305 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
307 if( !GetConsoleScreenBufferInfo(hConsoleOutput
,&ConsoleScreenBufferInfo
) )
309 SetLastError(0); /* FIXME: What error code? */
312 ConsoleScreenBufferInfo
.dwCursorPosition
.X
= dwCursorPosition
.X
;
313 ConsoleScreenBufferInfo
.dwCursorPosition
.Y
= dwCursorPosition
.Y
;
315 if( !DeviceIoControl(
317 IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
,
318 &ConsoleScreenBufferInfo
,
319 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
330 /*--------------------------------------------------------------
331 * FillConsoleOutputCharacterA
335 FillConsoleOutputCharacterA(
336 HANDLE hConsoleOutput
,
340 LPDWORD lpNumberOfCharsWritten
343 DWORD dwBytesReturned
;
344 OUTPUT_CHARACTER Buffer
;
346 Buffer
.cCharacter
= cCharacter
;
347 Buffer
.nLength
= nLength
;
348 Buffer
.dwCoord
= dwWriteCoord
;
350 if (DeviceIoControl (hConsoleOutput
,
351 IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER
,
353 sizeof(OUTPUT_CHARACTER
),
355 sizeof(OUTPUT_CHARACTER
),
359 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
363 *lpNumberOfCharsWritten
= 0;
368 /*--------------------------------------------------------------
369 * FillConsoleOutputCharacterW
373 FillConsoleOutputCharacterW(
374 HANDLE hConsoleOutput
,
378 LPDWORD lpNumberOfCharsWritten
386 /*--------------------------------------------------------------
393 HANDLE hConsoleInput
,
394 PINPUT_RECORD lpBuffer
,
396 LPDWORD lpNumberOfEventsRead
404 /*--------------------------------------------------------------
411 HANDLE hConsoleInput
,
412 PINPUT_RECORD lpBuffer
,
414 LPDWORD lpNumberOfEventsRead
422 /*--------------------------------------------------------------
429 HANDLE hConsoleInput
,
430 PINPUT_RECORD lpBuffer
,
432 LPDWORD lpNumberOfEventsRead
439 for (i
=0; (stat
&& i
< nLength
);)
441 stat
= ReadFile(hConsoleInput
,
442 &lpBuffer
[i
].Event
.KeyEvent
,
443 sizeof(KEY_EVENT_RECORD
),
448 lpBuffer
[i
].EventType
= KEY_EVENT
;
452 if (lpNumberOfEventsRead
!= NULL
)
454 *lpNumberOfEventsRead
= i
;
460 /*--------------------------------------------------------------
467 HANDLE hConsoleInput
,
468 PINPUT_RECORD lpBuffer
,
470 LPDWORD lpNumberOfEventsRead
478 /*--------------------------------------------------------------
485 HANDLE hConsoleInput
,
486 CONST INPUT_RECORD
*lpBuffer
,
488 LPDWORD lpNumberOfEventsWritten
496 /*--------------------------------------------------------------
503 HANDLE hConsoleInput
,
504 CONST INPUT_RECORD
*lpBuffer
,
506 LPDWORD lpNumberOfEventsWritten
514 /*--------------------------------------------------------------
521 HANDLE hConsoleOutput
,
525 PSMALL_RECT lpReadRegion
533 /*--------------------------------------------------------------
540 HANDLE hConsoleOutput
,
544 PSMALL_RECT lpReadRegion
551 /*--------------------------------------------------------------
552 * WriteConsoleOutputA
558 HANDLE hConsoleOutput
,
559 CONST CHAR_INFO
*lpBuffer
,
562 PSMALL_RECT lpWriteRegion
570 /*--------------------------------------------------------------
571 * WriteConsoleOutputW
577 HANDLE hConsoleOutput
,
578 CONST CHAR_INFO
*lpBuffer
,
581 PSMALL_RECT lpWriteRegion
589 /*--------------------------------------------------------------
590 * ReadConsoleOutputCharacterA
595 ReadConsoleOutputCharacterA(
596 HANDLE hConsoleOutput
,
600 LPDWORD lpNumberOfCharsRead
603 DWORD dwBytesReturned
;
604 OUTPUT_CHARACTER Buffer
;
606 Buffer
.dwCoord
= dwReadCoord
;
608 if (DeviceIoControl (hConsoleOutput
,
609 IOCTL_CONSOLE_READ_OUTPUT_CHARACTER
,
611 sizeof(OUTPUT_CHARACTER
),
617 *lpNumberOfCharsRead
= Buffer
.dwTransfered
;
621 *lpNumberOfCharsRead
= 0;
626 /*--------------------------------------------------------------
627 * ReadConsoleOutputCharacterW
632 ReadConsoleOutputCharacterW(
633 HANDLE hConsoleOutput
,
637 LPDWORD lpNumberOfCharsRead
645 /*--------------------------------------------------------------
646 * ReadConsoleOutputAttribute
651 ReadConsoleOutputAttribute(
652 HANDLE hConsoleOutput
,
656 LPDWORD lpNumberOfAttrsRead
659 DWORD dwBytesReturned
;
660 OUTPUT_ATTRIBUTE Buffer
;
662 Buffer
.dwCoord
= dwReadCoord
;
664 if (DeviceIoControl (hConsoleOutput
,
665 IOCTL_CONSOLE_READ_OUTPUT_ATTRIBUTE
,
667 sizeof(OUTPUT_ATTRIBUTE
),
673 *lpNumberOfAttrsRead
= Buffer
.dwTransfered
;
677 *lpNumberOfAttrsRead
= 0;
683 /*--------------------------------------------------------------
684 * WriteConsoleOutputCharacterA
689 WriteConsoleOutputCharacterA(
690 HANDLE hConsoleOutput
,
694 LPDWORD lpNumberOfCharsWritten
697 DWORD dwBytesReturned
;
698 OUTPUT_CHARACTER Buffer
;
700 Buffer
.dwCoord
= dwWriteCoord
;
702 if (DeviceIoControl (hConsoleOutput
,
703 IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
,
705 sizeof(OUTPUT_CHARACTER
),
711 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
715 *lpNumberOfCharsWritten
= 0;
720 /*--------------------------------------------------------------
721 * WriteConsoleOutputCharacterW
726 WriteConsoleOutputCharacterW(
727 HANDLE hConsoleOutput
,
731 LPDWORD lpNumberOfCharsWritten
740 /*--------------------------------------------------------------
741 * WriteConsoleOutputAttribute
746 WriteConsoleOutputAttribute(
747 HANDLE hConsoleOutput
,
748 CONST WORD
*lpAttribute
,
751 LPDWORD lpNumberOfAttrsWritten
754 DWORD dwBytesReturned
;
755 OUTPUT_ATTRIBUTE Buffer
;
757 Buffer
.dwCoord
= dwWriteCoord
;
759 if (DeviceIoControl (hConsoleOutput
,
760 IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE
,
762 sizeof(OUTPUT_ATTRIBUTE
),
768 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
772 *lpNumberOfAttrsWritten
= 0;
778 /*--------------------------------------------------------------
779 * FillConsoleOutputAttribute
784 FillConsoleOutputAttribute(
785 HANDLE hConsoleOutput
,
789 LPDWORD lpNumberOfAttrsWritten
792 DWORD dwBytesReturned
;
793 OUTPUT_ATTRIBUTE Buffer
;
795 Buffer
.wAttribute
= wAttribute
;
796 Buffer
.nLength
= nLength
;
797 Buffer
.dwCoord
= dwWriteCoord
;
799 if (DeviceIoControl (hConsoleOutput
,
800 IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE
,
802 sizeof(OUTPUT_ATTRIBUTE
),
804 sizeof(OUTPUT_ATTRIBUTE
),
808 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
812 *lpNumberOfAttrsWritten
= 0;
818 /*--------------------------------------------------------------
825 HANDLE hConsoleHandle
,
830 DWORD dwBytesReturned
;
832 if (DeviceIoControl (hConsoleHandle
,
833 IOCTL_CONSOLE_GET_MODE
,
837 sizeof(CONSOLE_MODE
),
841 *lpMode
= Buffer
.dwMode
;
842 SetLastError (ERROR_SUCCESS
);
846 SetLastError(0); /* FIXME: What error code? */
851 /*--------------------------------------------------------------
852 * GetNumberOfConsoleInputEvents
857 GetNumberOfConsoleInputEvents(
858 HANDLE hConsoleInput
,
859 LPDWORD lpNumberOfEvents
867 /*--------------------------------------------------------------
868 * GetLargestConsoleWindowSize
873 GetLargestConsoleWindowSize(
874 HANDLE hConsoleOutput
878 COORD Coord
= {80,25};
886 /*--------------------------------------------------------------
887 * GetConsoleCursorInfo
892 GetConsoleCursorInfo(
893 HANDLE hConsoleOutput
,
894 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
897 DWORD dwBytesReturned
;
899 if (DeviceIoControl (hConsoleOutput
,
900 IOCTL_CONSOLE_GET_CURSOR_INFO
,
904 sizeof(CONSOLE_CURSOR_INFO
),
913 /*--------------------------------------------------------------
914 * GetNumberOfConsoleMouseButtons
919 GetNumberOfConsoleMouseButtons(
920 LPDWORD lpNumberOfMouseButtons
928 /*--------------------------------------------------------------
935 HANDLE hConsoleHandle
,
940 DWORD dwBytesReturned
;
942 Buffer
.dwMode
= dwMode
;
944 if (DeviceIoControl (hConsoleHandle
,
945 IOCTL_CONSOLE_SET_MODE
,
947 sizeof(CONSOLE_MODE
),
953 SetLastError (ERROR_SUCCESS
);
957 SetLastError(0); /* FIXME: What error code? */
962 /*--------------------------------------------------------------
963 * SetConsoleActiveScreenBuffer
968 SetConsoleActiveScreenBuffer(
969 HANDLE hConsoleOutput
977 /*--------------------------------------------------------------
978 * FlushConsoleInputBuffer
983 FlushConsoleInputBuffer(
992 /*--------------------------------------------------------------
993 * SetConsoleScreenBufferSize
998 SetConsoleScreenBufferSize(
999 HANDLE hConsoleOutput
,
1007 /*--------------------------------------------------------------
1008 * SetConsoleCursorInfo
1013 SetConsoleCursorInfo(
1014 HANDLE hConsoleOutput
,
1015 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
1018 DWORD dwBytesReturned
;
1020 if (DeviceIoControl (hConsoleOutput
,
1021 IOCTL_CONSOLE_SET_CURSOR_INFO
,
1022 (PCONSOLE_CURSOR_INFO
)lpConsoleCursorInfo
,
1023 sizeof(CONSOLE_CURSOR_INFO
),
1034 /*--------------------------------------------------------------
1035 * ScrollConsoleScreenBufferA
1040 ScrollConsoleScreenBufferA(
1041 HANDLE hConsoleOutput
,
1042 CONST SMALL_RECT
*lpScrollRectangle
,
1043 CONST SMALL_RECT
*lpClipRectangle
,
1044 COORD dwDestinationOrigin
,
1045 CONST CHAR_INFO
*lpFill
1053 /*--------------------------------------------------------------
1054 * ScrollConsoleScreenBufferW
1059 ScrollConsoleScreenBufferW(
1060 HANDLE hConsoleOutput
,
1061 CONST SMALL_RECT
*lpScrollRectangle
,
1062 CONST SMALL_RECT
*lpClipRectangle
,
1063 COORD dwDestinationOrigin
,
1064 CONST CHAR_INFO
*lpFill
1072 /*--------------------------------------------------------------
1073 * SetConsoleWindowInfo
1078 SetConsoleWindowInfo(
1079 HANDLE hConsoleOutput
,
1081 CONST SMALL_RECT
*lpConsoleWindow
1089 /*--------------------------------------------------------------
1090 * SetConsoleTextAttribute
1095 SetConsoleTextAttribute(
1096 HANDLE hConsoleOutput
,
1100 DWORD dwBytesReturned
;
1102 if (!DeviceIoControl (hConsoleOutput
,
1103 IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
,
1115 /*--------------------------------------------------------------
1116 * SetConsoleCtrlHandler
1121 SetConsoleCtrlHandler(
1122 PHANDLER_ROUTINE HandlerRoutine
,
1131 /*--------------------------------------------------------------
1132 * GenerateConsoleCtrlEvent
1137 GenerateConsoleCtrlEvent(
1139 DWORD dwProcessGroupId
1147 /*--------------------------------------------------------------
1150 #define MAX_CONSOLE_TITLE_LENGTH 80
1156 LPWSTR lpConsoleTitle
,
1165 /*--------------------------------------------------------------
1174 LPSTR lpConsoleTitle
,
1178 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1179 DWORD nWideTitle
= sizeof WideTitle
;
1182 if (!lpConsoleTitle
|| !nSize
) return 0;
1183 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
1184 if (!nWideTitle
) return 0;
1186 if ( (nWritten
= WideCharToMultiByte(
1187 CP_ACP
, // ANSI code page
1188 0, // performance and mapping flags
1189 (LPWSTR
) WideTitle
, // address of wide-character string
1190 nWideTitle
, // number of characters in string
1191 lpConsoleTitle
, // address of buffer for new string
1192 nSize
, // size of buffer
1197 lpConsoleTitle
[nWritten
] = '\0';
1205 /*--------------------------------------------------------------
1212 LPCWSTR lpConsoleTitle
1220 /*--------------------------------------------------------------
1229 LPCSTR lpConsoleTitle
1232 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1233 char AnsiTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1236 if (!lpConsoleTitle
) return FALSE
;
1237 ZeroMemory( WideTitle
, sizeof WideTitle
);
1238 nWideTitle
= lstrlenA(lpConsoleTitle
);
1247 AnsiTitle
[nWideTitle
] = '\0';
1249 if ( MultiByteToWideChar(
1250 CP_ACP
, // ANSI code page
1251 MB_PRECOMPOSED
, // character-type options
1252 AnsiTitle
, // address of string to map
1253 nWideTitle
, // number of characters in string
1254 (LPWSTR
) WideTitle
, // address of wide-character buffer
1255 (-1) // size of buffer: -1=...\0
1258 return SetConsoleTitleW( (LPWSTR
) WideTitle
);
1265 /*--------------------------------------------------------------
1272 HANDLE hConsoleInput
,
1274 DWORD nNumberOfCharsToRead
,
1275 LPDWORD lpNumberOfCharsRead
,
1284 /*--------------------------------------------------------------
1291 HANDLE hConsoleOutput
,
1292 CONST VOID
*lpBuffer
,
1293 DWORD nNumberOfCharsToWrite
,
1294 LPDWORD lpNumberOfCharsWritten
,
1299 PCSRSS_API_REQUEST Request
;
1300 CSRSS_API_REPLY Reply
;
1303 Request
= HeapAlloc(GetProcessHeap(),
1305 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
* sizeof(WCHAR
));
1306 if (Request
== NULL
)
1311 Request
->Type
= CSRSS_WRITE_CONSOLE
;
1312 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1313 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
=
1314 nNumberOfCharsToWrite
;
1315 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
1316 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
1317 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
,
1319 nNumberOfCharsToWrite
* sizeof(WCHAR
));
1321 Status
= CsrClientCallServer(Request
,
1323 sizeof(CSRSS_API_REQUEST
) +
1324 nNumberOfCharsToWrite
,
1325 sizeof(CSRSS_API_REPLY
));
1327 HeapFree(GetProcessHeap(),
1331 if (!NT_SUCCESS(Status
))
1336 if (lpNumberOfCharsWritten
!= NULL
)
1338 *lpNumberOfCharsWritten
=
1339 Reply
.Data
.WriteConsoleReply
.NrCharactersWritten
;
1348 /*--------------------------------------------------------------
1349 * CreateConsoleScreenBuffer
1354 CreateConsoleScreenBuffer(
1355 DWORD dwDesiredAccess
,
1357 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1359 LPVOID lpScreenBufferData
1367 /*--------------------------------------------------------------
1373 GetConsoleCP( VOID
)
1376 return CP_OEMCP
; /* FIXME */
1380 /*--------------------------------------------------------------
1395 /*--------------------------------------------------------------
1396 * GetConsoleOutputCP
1401 GetConsoleOutputCP( VOID
)
1404 return 0; /* FIXME */
1408 /*--------------------------------------------------------------
1409 * SetConsoleOutputCP