1 /* $Id: console.c,v 1.58 2003/06/19 19:38:26 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 ******************************************************************/
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
,
61 DWORD dwDesiredAccess
,
65 CSRSS_API_REQUEST Request
;
66 CSRSS_API_REPLY Reply
;
69 if (IsConsoleHandle (hConsole
) == FALSE
)
71 SetLastError (ERROR_INVALID_PARAMETER
);
72 return INVALID_HANDLE_VALUE
;
75 Request
.Type
= CSRSS_DUPLICATE_HANDLE
;
76 Request
.Data
.DuplicateHandleRequest
.Handle
= hConsole
;
77 Request
.Data
.DuplicateHandleRequest
.ProcessId
= GetCurrentProcessId();
78 Status
= CsrClientCallServer(&Request
,
80 sizeof(CSRSS_API_REQUEST
),
81 sizeof(CSRSS_API_REPLY
));
82 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
=Reply
.Status
))
84 SetLastErrorByStatus(Status
);
85 return INVALID_HANDLE_VALUE
;
87 return Reply
.Data
.DuplicateHandleReply
.Handle
;
91 ExpungeConsoleCommandHistoryW (DWORD Unknown0
)
96 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
102 ExpungeConsoleCommandHistoryA (DWORD Unknown0
)
107 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
112 GetConsoleAliasW (DWORD Unknown0
,
120 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
126 GetConsoleAliasA (DWORD Unknown0
,
134 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
139 GetConsoleAliasExesW (DWORD Unknown0
,
145 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
152 GetConsoleAliasExesA (DWORD Unknown0
,
158 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
165 GetConsoleAliasExesLengthA (VOID
)
170 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
175 GetConsoleAliasExesLengthW (VOID
)
180 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
185 GetConsoleAliasesW (DWORD Unknown0
,
192 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
197 GetConsoleAliasesA (DWORD Unknown0
,
204 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
209 GetConsoleAliasesLengthW (DWORD Unknown0
)
214 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
219 GetConsoleAliasesLengthA (DWORD Unknown0
)
224 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
229 GetConsoleCommandHistoryW (DWORD Unknown0
,
236 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
241 GetConsoleCommandHistoryA (DWORD Unknown0
,
248 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
253 GetConsoleCommandHistoryLengthW (DWORD Unknown0
)
258 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
263 GetConsoleCommandHistoryLengthA (DWORD Unknown0
)
268 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
273 GetConsoleDisplayMode (LPDWORD lpdwMode
)
275 * FUNCTION: Get the console display mode
277 * lpdwMode - Address of variable that receives the current value
279 * STATUS: Undocumented
282 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
287 GetConsoleFontInfo (DWORD Unknown0
,
295 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
300 GetConsoleFontSize(HANDLE hConsoleOutput
,
303 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
308 GetConsoleHardwareState (HANDLE hConsole
,
315 CSRSS_API_REQUEST Request
;
316 CSRSS_API_REPLY Reply
;
319 Request
.Type
= CSRSS_SETGET_CONSOLE_HW_STATE
;
320 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
321 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
323 Status
= CsrClientCallServer(& Request
,
325 sizeof(CSRSS_API_REQUEST
),
326 sizeof(CSRSS_API_REPLY
));
327 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
329 SetLastErrorByStatus(Status
);
332 *State
= Reply
.Data
.ConsoleHardwareStateReply
.State
;
337 GetConsoleInputWaitHandle (VOID
)
342 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
347 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
349 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
351 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
356 GetNumberOfConsoleFonts (VOID
)
361 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
362 return 1; /* FIXME: call csrss.exe */
366 InvalidateConsoleDIBits (DWORD Unknown0
,
372 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
377 OpenConsoleW (LPWSTR wsName
,
378 DWORD dwDesiredAccess
,
380 DWORD dwCreationDistribution
)
385 CSRSS_API_REQUEST Request
;
386 CSRSS_API_REPLY Reply
;
387 PHANDLE phConsole
= NULL
;
388 NTSTATUS Status
= STATUS_SUCCESS
;
391 if(0 == _wcsicmp(wsName
, L
"CONIN$"))
393 Request
.Type
= CSRSS_GET_INPUT_HANDLE
;
394 phConsole
= & Reply
.Data
.GetInputHandleReply
.InputHandle
;
396 else if (0 == _wcsicmp(wsName
, L
"CONOUT$"))
398 Request
.Type
= CSRSS_GET_OUTPUT_HANDLE
;
399 phConsole
= & Reply
.Data
.GetOutputHandleReply
.OutputHandle
;
403 SetLastError(ERROR_INVALID_PARAMETER
);
404 return(INVALID_HANDLE_VALUE
);
406 if ((GENERIC_READ
|GENERIC_WRITE
) != dwDesiredAccess
)
408 SetLastError(ERROR_INVALID_PARAMETER
);
409 return(INVALID_HANDLE_VALUE
);
411 if (OPEN_EXISTING
!= dwCreationDistribution
)
413 SetLastError(ERROR_INVALID_PARAMETER
);
414 return(INVALID_HANDLE_VALUE
);
416 Status
= CsrClientCallServer(& Request
,
418 sizeof(CSRSS_API_REQUEST
),
419 sizeof(CSRSS_API_REPLY
));
420 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
422 SetLastErrorByStatus(Status
);
423 return INVALID_HANDLE_VALUE
;
429 SetConsoleCommandHistoryMode (DWORD dwMode
)
434 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
439 SetConsoleCursor (DWORD Unknown0
,
445 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
450 SetConsoleDisplayMode (HANDLE hOut
,
454 * FUNCTION: Set the console display mode.
456 * hOut - Standard output handle.
457 * dwNewMode - New mode.
458 * lpdwOldMode - Address of a variable that receives the old mode.
461 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
466 SetConsoleFont (DWORD Unknown0
,
472 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
477 SetConsoleHardwareState (HANDLE hConsole
,
484 CSRSS_API_REQUEST Request
;
485 CSRSS_API_REPLY Reply
;
488 Request
.Type
= CSRSS_SETGET_CONSOLE_HW_STATE
;
489 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
490 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
491 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
493 Status
= CsrClientCallServer(& Request
,
495 sizeof(CSRSS_API_REQUEST
),
496 sizeof(CSRSS_API_REPLY
));
497 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
499 SetLastErrorByStatus(Status
);
506 SetConsoleKeyShortcuts (DWORD Unknown0
,
514 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
519 SetConsoleMaximumWindowSize (DWORD Unknown0
,
525 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
530 SetConsoleMenuClose (DWORD Unknown0
)
535 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
540 SetConsoleNumberOfCommandsA (DWORD Unknown0
,
546 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
551 SetConsoleNumberOfCommandsW (DWORD Unknown0
,
557 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
562 SetConsolePalette (DWORD Unknown0
,
569 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
574 SetLastConsoleEventActive (VOID
)
579 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
584 ShowConsoleCursor (DWORD Unknown0
,
590 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
596 * FUNCTION: Checks whether the given handle is a valid console handle.
598 * Handle - Handle to be checked
600 * TRUE: Handle is a valid console handle
601 * FALSE: Handle is not a valid console handle.
602 * STATUS: Officially undocumented
605 VerifyConsoleIoHandle(HANDLE Handle
)
607 CSRSS_API_REQUEST Request
;
608 CSRSS_API_REPLY Reply
;
611 Request
.Type
= CSRSS_VERIFY_HANDLE
;
612 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
613 Status
= CsrClientCallServer(&Request
,
615 sizeof(CSRSS_API_REQUEST
),
616 sizeof(CSRSS_API_REPLY
));
617 if (!NT_SUCCESS(Status
))
619 SetLastErrorByStatus(Status
);
623 return (BOOL
)NT_SUCCESS(Reply
.Status
);
628 WriteConsoleInputVDMA (DWORD Unknown0
,
633 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
638 WriteConsoleInputVDMW (DWORD Unknown0
,
643 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
648 CloseConsoleHandle(HANDLE Handle
)
653 CSRSS_API_REQUEST Request
;
654 CSRSS_API_REPLY Reply
;
657 if (IsConsoleHandle (Handle
) == FALSE
)
659 SetLastError (ERROR_INVALID_PARAMETER
);
663 Request
.Type
= CSRSS_CLOSE_HANDLE
;
664 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
665 Status
= CsrClientCallServer(&Request
,
667 sizeof(CSRSS_API_REQUEST
),
668 sizeof(CSRSS_API_REPLY
));
669 if (!NT_SUCCESS(Status
))
671 SetLastErrorByStatus(Status
);
680 IsConsoleHandle(HANDLE Handle
)
682 if ((((ULONG
)Handle
) & 0x10000003) == 0x3)
690 GetStdHandle(DWORD nStdHandle
)
692 * FUNCTION: Get a handle for the standard input, standard output
693 * and a standard error device.
695 * nStdHandle - Specifies the device for which to return the handle.
696 * RETURNS: If the function succeeds, the return value is the handle
697 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
700 PRTL_USER_PROCESS_PARAMETERS Ppb
;
702 Ppb
= NtCurrentPeb()->ProcessParameters
;
705 case STD_INPUT_HANDLE
:
706 return Ppb
->hStdInput
;
708 case STD_OUTPUT_HANDLE
:
709 return Ppb
->hStdOutput
;
711 case STD_ERROR_HANDLE
:
712 return Ppb
->hStdError
;
715 SetLastError (ERROR_INVALID_PARAMETER
);
716 return INVALID_HANDLE_VALUE
;
719 WINBASEAPI BOOL WINAPI
720 SetStdHandle(DWORD nStdHandle
,
723 * FUNCTION: Set the handle for the standard input, standard output or
724 * the standard error device.
726 * nStdHandle - Specifies the handle to be set.
727 * hHandle - The handle to set.
728 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
731 PRTL_USER_PROCESS_PARAMETERS Ppb
;
733 Ppb
= NtCurrentPeb()->ProcessParameters
;
735 /* More checking needed? */
736 if (hHandle
== INVALID_HANDLE_VALUE
)
738 SetLastError (ERROR_INVALID_HANDLE
);
742 SetLastError(ERROR_SUCCESS
); /* OK */
746 case STD_INPUT_HANDLE
:
747 Ppb
->hStdInput
= hHandle
;
750 case STD_OUTPUT_HANDLE
:
751 Ppb
->hStdOutput
= hHandle
;
754 case STD_ERROR_HANDLE
:
755 Ppb
->hStdError
= hHandle
;
759 SetLastError (ERROR_INVALID_PARAMETER
);
764 /*--------------------------------------------------------------
768 WriteConsoleA(HANDLE hConsoleOutput
,
769 CONST VOID
*lpBuffer
,
770 DWORD nNumberOfCharsToWrite
,
771 LPDWORD lpNumberOfCharsWritten
,
774 PCSRSS_API_REQUEST Request
;
775 CSRSS_API_REPLY Reply
;
780 Request
= RtlAllocateHeap(GetProcessHeap(),
782 sizeof(CSRSS_API_REQUEST
) +
783 CSRSS_MAX_WRITE_CONSOLE_REQUEST
);
786 SetLastError(ERROR_OUTOFMEMORY
);
790 Request
->Type
= CSRSS_WRITE_CONSOLE
;
791 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
792 if (lpNumberOfCharsWritten
!= NULL
)
793 *lpNumberOfCharsWritten
= nNumberOfCharsToWrite
;
794 while (nNumberOfCharsToWrite
)
796 if (nNumberOfCharsToWrite
> CSRSS_MAX_WRITE_CONSOLE_REQUEST
)
798 Size
= CSRSS_MAX_WRITE_CONSOLE_REQUEST
;
802 Size
= nNumberOfCharsToWrite
;
804 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= Size
;
806 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, Size
);
808 MessageSize
= CSRSS_REQUEST_HEADER_SIZE
+
809 sizeof(CSRSS_WRITE_CONSOLE_REQUEST
) + Size
;
810 Status
= CsrClientCallServer(Request
,
813 sizeof(CSRSS_API_REPLY
));
815 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
817 RtlFreeHeap(GetProcessHeap(), 0, Request
);
818 SetLastErrorByStatus(Status
);
821 nNumberOfCharsToWrite
-= Size
;
825 RtlFreeHeap(GetProcessHeap(), 0, Request
);
831 /*--------------------------------------------------------------
834 WINBOOL STDCALL
ReadConsoleA(HANDLE hConsoleInput
,
836 DWORD nNumberOfCharsToRead
,
837 LPDWORD lpNumberOfCharsRead
,
840 CSRSS_API_REQUEST Request
;
841 PCSRSS_API_REPLY Reply
;
845 Reply
= RtlAllocateHeap(GetProcessHeap(),
847 sizeof(CSRSS_API_REPLY
) + nNumberOfCharsToRead
);
850 SetLastError(ERROR_OUTOFMEMORY
);
854 Request
.Type
= CSRSS_READ_CONSOLE
;
855 Request
.Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
856 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
= nNumberOfCharsToRead
> CSRSS_MAX_READ_CONSOLE_REQUEST
? CSRSS_MAX_READ_CONSOLE_REQUEST
: nNumberOfCharsToRead
;
857 Request
.Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= 0;
858 Status
= CsrClientCallServer(&Request
,
860 sizeof(CSRSS_API_REQUEST
),
861 sizeof(CSRSS_API_REPLY
) +
862 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
);
863 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
->Status
))
865 DbgPrint( "CSR returned error in ReadConsole\n" );
866 SetLastErrorByStatus ( Status
);
867 RtlFreeHeap( GetProcessHeap(), 0, Reply
);
870 if( Reply
->Status
== STATUS_NOTIFY_CLEANUP
)
871 Reply
->Status
= STATUS_PENDING
; // ignore backspace because we have no chars to backspace
872 /* There may not be any chars or lines to read yet, so wait */
873 while( Reply
->Status
== STATUS_PENDING
)
875 /* some chars may have been returned, but not a whole line yet, so recompute buffer and try again */
876 nNumberOfCharsToRead
-= Reply
->Data
.ReadConsoleReply
.NrCharactersRead
;
877 /* don't overflow caller's buffer, even if you still don't have a complete line */
878 if( !nNumberOfCharsToRead
)
880 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
= nNumberOfCharsToRead
> CSRSS_MAX_READ_CONSOLE_REQUEST
? CSRSS_MAX_READ_CONSOLE_REQUEST
: nNumberOfCharsToRead
;
881 /* copy any chars already read to buffer */
882 memcpy( lpBuffer
+ CharsRead
, Reply
->Data
.ReadConsoleReply
.Buffer
, Reply
->Data
.ReadConsoleReply
.NrCharactersRead
);
883 CharsRead
+= Reply
->Data
.ReadConsoleReply
.NrCharactersRead
;
884 /* wait for csrss to signal there is more data to read, but not if we got STATUS_NOTIFY_CLEANUP for backspace */
885 Status
= NtWaitForSingleObject( Reply
->Data
.ReadConsoleReply
.EventHandle
, FALSE
, 0 );
886 if( !NT_SUCCESS( Status
) )
888 DbgPrint( "Wait for console input failed!\n" );
889 RtlFreeHeap( GetProcessHeap(), 0, Reply
);
892 Request
.Data
.ReadConsoleRequest
.nCharsCanBeDeleted
= CharsRead
;
893 Status
= CsrClientCallServer( &Request
, Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) + Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
);
894 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
->Status
) )
896 SetLastErrorByStatus ( Status
);
897 RtlFreeHeap( GetProcessHeap(), 0, Reply
);
900 if( Reply
->Status
== STATUS_NOTIFY_CLEANUP
)
906 nNumberOfCharsToRead
++;
908 Reply
->Status
= STATUS_PENDING
; // retry
911 /* copy data to buffer, count total returned, and return */
912 memcpy( lpBuffer
+ CharsRead
, Reply
->Data
.ReadConsoleReply
.Buffer
, Reply
->Data
.ReadConsoleReply
.NrCharactersRead
);
913 CharsRead
+= Reply
->Data
.ReadConsoleReply
.NrCharactersRead
;
914 if (lpNumberOfCharsRead
!= NULL
)
915 *lpNumberOfCharsRead
= CharsRead
;
916 RtlFreeHeap(GetProcessHeap(),
924 /*--------------------------------------------------------------
927 WINBOOL STDCALL
AllocConsole(VOID
)
929 CSRSS_API_REQUEST Request
;
930 CSRSS_API_REPLY Reply
;
934 Request
.Type
= CSRSS_ALLOC_CONSOLE
;
935 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
936 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
938 SetLastErrorByStatus ( Status
);
941 SetStdHandle( STD_INPUT_HANDLE
, Reply
.Data
.AllocConsoleReply
.InputHandle
);
942 SetStdHandle( STD_OUTPUT_HANDLE
, Reply
.Data
.AllocConsoleReply
.OutputHandle
);
943 hStdError
= DuplicateConsoleHandle(Reply
.Data
.AllocConsoleReply
.OutputHandle
,
946 DUPLICATE_SAME_ACCESS
);
947 SetStdHandle( STD_ERROR_HANDLE
, hStdError
);
952 /*--------------------------------------------------------------
955 WINBOOL STDCALL
FreeConsole(VOID
)
957 DbgPrint("FreeConsole() is unimplemented\n");
962 /*--------------------------------------------------------------
963 * GetConsoleScreenBufferInfo
967 GetConsoleScreenBufferInfo(
968 HANDLE hConsoleOutput
,
969 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
972 CSRSS_API_REQUEST Request
;
973 CSRSS_API_REPLY Reply
;
976 Request
.Type
= CSRSS_SCREEN_BUFFER_INFO
;
977 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
978 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
979 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
981 SetLastErrorByStatus ( Status
);
984 *lpConsoleScreenBufferInfo
= Reply
.Data
.ScreenBufferInfoReply
.Info
;
989 /*--------------------------------------------------------------
990 * SetConsoleCursorPosition
994 SetConsoleCursorPosition(
995 HANDLE hConsoleOutput
,
996 COORD dwCursorPosition
999 CSRSS_API_REQUEST Request
;
1000 CSRSS_API_REPLY Reply
;
1003 Request
.Type
= CSRSS_SET_CURSOR
;
1004 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1005 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1006 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1007 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1009 SetLastErrorByStatus ( Status
);
1016 /*--------------------------------------------------------------
1017 * FillConsoleOutputCharacterA
1020 FillConsoleOutputCharacterA(
1021 HANDLE hConsoleOutput
,
1025 LPDWORD lpNumberOfCharsWritten
1028 CSRSS_API_REQUEST Request
;
1029 CSRSS_API_REPLY Reply
;
1032 Request
.Type
= CSRSS_FILL_OUTPUT
;
1033 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1034 Request
.Data
.FillOutputRequest
.Char
= cCharacter
;
1035 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1036 Request
.Data
.FillOutputRequest
.Length
= nLength
;
1037 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1038 if ( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1040 SetLastErrorByStatus(Status
);
1043 if (lpNumberOfCharsWritten
!= NULL
)
1044 *lpNumberOfCharsWritten
= nLength
;
1049 /*--------------------------------------------------------------
1050 * FillConsoleOutputCharacterW
1054 FillConsoleOutputCharacterW(
1055 HANDLE hConsoleOutput
,
1059 LPDWORD lpNumberOfCharsWritten
1067 /*--------------------------------------------------------------
1074 HANDLE hConsoleInput
,
1075 PINPUT_RECORD lpBuffer
,
1077 LPDWORD lpNumberOfEventsRead
1080 PCSRSS_API_REQUEST Request
;
1081 CSRSS_API_REPLY Reply
;
1084 PVOID BufferTargetBase
;
1087 if(lpBuffer
== NULL
)
1089 SetLastError(ERROR_INVALID_PARAMETER
);
1093 Size
= nLength
* sizeof(INPUT_RECORD
);
1095 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1096 if(!NT_SUCCESS(Status
))
1098 SetLastErrorByStatus(Status
);
1102 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REQUEST
));
1105 CsrReleaseParameterBuffer(BufferBase
);
1106 SetLastError(ERROR_OUTOFMEMORY
);
1110 Request
->Type
= CSRSS_PEEK_CONSOLE_INPUT
;
1111 Request
->Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1112 Request
->Data
.PeekConsoleInputRequest
.Length
= nLength
;
1113 Request
->Data
.PeekConsoleInputRequest
.InputRecord
= (INPUT_RECORD
*)BufferTargetBase
;
1115 Status
= CsrClientCallServer(Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
1117 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1119 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1120 CsrReleaseParameterBuffer(BufferBase
);
1124 memcpy(lpBuffer
, BufferBase
, sizeof(INPUT_RECORD
) * Reply
.Data
.PeekConsoleInputReply
.Length
);
1126 if(lpNumberOfEventsRead
!= NULL
)
1127 *lpNumberOfEventsRead
= Reply
.Data
.PeekConsoleInputReply
.Length
;
1129 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1130 CsrReleaseParameterBuffer(BufferBase
);
1136 /*--------------------------------------------------------------
1143 HANDLE hConsoleInput
,
1144 PINPUT_RECORD lpBuffer
,
1146 LPDWORD lpNumberOfEventsRead
1154 /*--------------------------------------------------------------
1157 WINBASEAPI BOOL WINAPI
1158 ReadConsoleInputA(HANDLE hConsoleInput
,
1159 PINPUT_RECORD lpBuffer
,
1161 LPDWORD lpNumberOfEventsRead
)
1163 CSRSS_API_REQUEST Request
;
1164 CSRSS_API_REPLY Reply
;
1165 DWORD NumEventsRead
;
1168 Request
.Type
= CSRSS_READ_INPUT
;
1169 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1170 Status
= CsrClientCallServer(&Request
, &Reply
, sizeof(CSRSS_API_REQUEST
),
1171 sizeof(CSRSS_API_REPLY
));
1172 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1174 SetLastErrorByStatus(Status
);
1178 while (Status
== STATUS_PENDING
)
1180 Status
= NtWaitForSingleObject(Reply
.Data
.ReadInputReply
.Event
, FALSE
,
1182 if(!NT_SUCCESS(Status
))
1184 SetLastErrorByStatus(Status
);
1188 Request
.Type
= CSRSS_READ_INPUT
;
1189 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1190 Status
= CsrClientCallServer(&Request
, &Reply
, sizeof(CSRSS_API_REQUEST
),
1191 sizeof(CSRSS_API_REPLY
));
1192 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1194 SetLastErrorByStatus(Status
);
1200 *lpBuffer
= Reply
.Data
.ReadInputReply
.Input
;
1204 while ((NumEventsRead
< nLength
) && (Reply
.Data
.ReadInputReply
.MoreEvents
))
1206 Status
= CsrClientCallServer(&Request
, &Reply
, sizeof(CSRSS_API_REQUEST
),
1207 sizeof(CSRSS_API_REPLY
));
1208 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1210 SetLastErrorByStatus(Status
);
1214 if (Status
== STATUS_PENDING
)
1219 *lpBuffer
= Reply
.Data
.ReadInputReply
.Input
;
1224 *lpNumberOfEventsRead
= NumEventsRead
;
1230 /*--------------------------------------------------------------
1237 HANDLE hConsoleInput
,
1238 PINPUT_RECORD lpBuffer
,
1240 LPDWORD lpNumberOfEventsRead
1248 /*--------------------------------------------------------------
1249 * WriteConsoleInputA
1255 HANDLE hConsoleInput
,
1256 CONST INPUT_RECORD
*lpBuffer
,
1258 LPDWORD lpNumberOfEventsWritten
1261 PCSRSS_API_REQUEST Request
;
1262 CSRSS_API_REPLY Reply
;
1263 PVOID BufferBase
, BufferTargetBase
;
1267 if(lpBuffer
== NULL
)
1269 SetLastError(ERROR_INVALID_PARAMETER
);
1273 Size
= nLength
* sizeof(INPUT_RECORD
);
1275 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1276 if(!NT_SUCCESS(Status
))
1278 SetLastErrorByStatus(Status
);
1282 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REQUEST
));
1285 SetLastError(ERROR_OUTOFMEMORY
);
1286 CsrReleaseParameterBuffer(BufferBase
);
1290 Request
->Type
= CSRSS_WRITE_CONSOLE_INPUT
;
1291 Request
->Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1292 Request
->Data
.WriteConsoleInputRequest
.Length
= nLength
;
1293 Request
->Data
.WriteConsoleInputRequest
.InputRecord
= (PINPUT_RECORD
)BufferTargetBase
;
1295 Status
= CsrClientCallServer(Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
1296 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1298 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1299 CsrReleaseParameterBuffer(BufferBase
);
1303 if(lpNumberOfEventsWritten
!= NULL
)
1304 *lpNumberOfEventsWritten
= Reply
.Data
.WriteConsoleInputReply
.Length
;
1306 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1307 CsrReleaseParameterBuffer(BufferBase
);
1313 /*--------------------------------------------------------------
1314 * WriteConsoleInputW
1320 HANDLE hConsoleInput
,
1321 CONST INPUT_RECORD
*lpBuffer
,
1323 LPDWORD lpNumberOfEventsWritten
1331 /*--------------------------------------------------------------
1332 * ReadConsoleOutputA
1338 HANDLE hConsoleOutput
,
1339 PCHAR_INFO lpBuffer
,
1341 COORD dwBufferCoord
,
1342 PSMALL_RECT lpReadRegion
1345 PCSRSS_API_REQUEST Request
;
1346 CSRSS_API_REPLY Reply
;
1348 PVOID BufferTargetBase
;
1350 DWORD Size
, SizeX
, SizeY
;
1352 if(lpBuffer
== NULL
)
1354 SetLastError(ERROR_INVALID_PARAMETER
);
1358 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
1360 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
, Size
, &BufferBase
, &BufferTargetBase
);
1361 if(!NT_SUCCESS(Status
))
1363 SetLastErrorByStatus(Status
);
1367 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REQUEST
));
1370 SetLastError(ERROR_OUTOFMEMORY
);
1371 CsrReleaseParameterBuffer(BufferBase
);
1375 Request
->Type
= CSRSS_READ_CONSOLE_OUTPUT
;
1376 Request
->Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1377 Request
->Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1378 Request
->Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1379 Request
->Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
1380 Request
->Data
.ReadConsoleOutputRequest
.CharInfo
= (PCHAR_INFO
)BufferTargetBase
;
1382 Status
= CsrClientCallServer(Request
, &Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
));
1383 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1385 SetLastErrorByStatus(Status
);
1386 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1387 CsrReleaseParameterBuffer(BufferBase
);
1391 SizeX
= Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Right
- Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Left
+ 1;
1392 SizeY
= Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Bottom
- Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
.Top
+ 1;
1394 memcpy(lpBuffer
, BufferBase
, sizeof(CHAR_INFO
) * SizeX
* SizeY
);
1395 *lpReadRegion
= Reply
.Data
.ReadConsoleOutputReply
.ReadRegion
;
1397 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1398 CsrReleaseParameterBuffer(BufferBase
);
1404 /*--------------------------------------------------------------
1405 * ReadConsoleOutputW
1411 HANDLE hConsoleOutput
,
1412 PCHAR_INFO lpBuffer
,
1414 COORD dwBufferCoord
,
1415 PSMALL_RECT lpReadRegion
1422 /*--------------------------------------------------------------
1423 * WriteConsoleOutputA
1425 WINBASEAPI BOOL WINAPI
1426 WriteConsoleOutputA(HANDLE hConsoleOutput
,
1427 CONST CHAR_INFO
*lpBuffer
,
1429 COORD dwBufferCoord
,
1430 PSMALL_RECT lpWriteRegion
)
1432 PCSRSS_API_REQUEST Request
;
1433 CSRSS_API_REPLY Reply
;
1439 PVOID BufferTargetBase
;
1441 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
1443 Status
= CsrCaptureParameterBuffer((PVOID
)lpBuffer
,
1447 if (!NT_SUCCESS(Status
))
1449 SetLastErrorByStatus(Status
);
1453 Request
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
,
1454 sizeof(CSRSS_API_REQUEST
));
1455 if (Request
== NULL
)
1457 CsrReleaseParameterBuffer(BufferBase
);
1458 SetLastError(ERROR_OUTOFMEMORY
);
1461 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT
;
1462 Request
->Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1463 Request
->Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1464 Request
->Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1465 Request
->Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
1466 Request
->Data
.WriteConsoleOutputRequest
.CharInfo
=
1467 (CHAR_INFO
*)BufferTargetBase
;
1469 Status
= CsrClientCallServer(Request
, &Reply
,
1470 sizeof(CSRSS_API_REQUEST
),
1471 sizeof(CSRSS_API_REPLY
));
1472 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
1474 CsrReleaseParameterBuffer(BufferBase
);
1475 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1476 SetLastErrorByStatus(Status
);
1480 *lpWriteRegion
= Reply
.Data
.WriteConsoleOutputReply
.WriteRegion
;
1481 RtlFreeHeap(GetProcessHeap(), 0, Request
);
1482 CsrReleaseParameterBuffer(BufferBase
);
1487 /*--------------------------------------------------------------
1488 * WriteConsoleOutputW
1493 WriteConsoleOutputW(
1494 HANDLE hConsoleOutput
,
1495 CONST CHAR_INFO
*lpBuffer
,
1497 COORD dwBufferCoord
,
1498 PSMALL_RECT lpWriteRegion
1506 /*--------------------------------------------------------------
1507 * ReadConsoleOutputCharacterA
1512 ReadConsoleOutputCharacterA(
1513 HANDLE hConsoleOutput
,
1517 LPDWORD lpNumberOfCharsRead
1520 CSRSS_API_REQUEST Request
;
1521 PCSRSS_API_REPLY Reply
;
1525 Reply
= RtlAllocateHeap(GetProcessHeap(),
1527 sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
);
1530 SetLastError(ERROR_OUTOFMEMORY
);
1534 if (lpNumberOfCharsRead
!= NULL
)
1535 *lpNumberOfCharsRead
= nLength
;
1537 Request
.Type
= CSRSS_READ_CONSOLE_OUTPUT_CHAR
;
1538 Request
.Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
1539 Request
.Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
1541 while (nLength
!= 0)
1543 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
)
1544 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
;
1548 Request
.Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= Size
;
1550 Status
= CsrClientCallServer(&Request
,
1552 sizeof(CSRSS_API_REQUEST
),
1553 sizeof(CSRSS_API_REPLY
) + Size
);
1554 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Reply
->Status
))
1556 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1557 SetLastErrorByStatus(Status
);
1561 memcpy(lpCharacter
, &Reply
->Data
.ReadConsoleOutputCharReply
.String
[0], Size
);
1562 lpCharacter
+= Size
;
1564 Request
.Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Reply
->Data
.ReadConsoleOutputCharReply
.EndCoord
;
1567 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1573 /*--------------------------------------------------------------
1574 * ReadConsoleOutputCharacterW
1579 ReadConsoleOutputCharacterW(
1580 HANDLE hConsoleOutput
,
1584 LPDWORD lpNumberOfCharsRead
1592 /*--------------------------------------------------------------
1593 * ReadConsoleOutputAttribute
1598 ReadConsoleOutputAttribute(
1599 HANDLE hConsoleOutput
,
1603 LPDWORD lpNumberOfAttrsRead
1606 CSRSS_API_REQUEST Request
;
1607 PCSRSS_API_REPLY Reply
;
1611 Reply
= RtlAllocateHeap(GetProcessHeap(),
1613 sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
);
1616 SetLastError(ERROR_OUTOFMEMORY
);
1620 if (lpNumberOfAttrsRead
!= NULL
)
1621 *lpNumberOfAttrsRead
= nLength
;
1623 Request
.Type
= CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
;
1624 Request
.Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1625 Request
.Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
1627 while (nLength
!= 0)
1629 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
)
1630 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
;
1634 Request
.Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
1636 Status
= CsrClientCallServer(&Request
,
1638 sizeof(CSRSS_API_REQUEST
),
1639 sizeof(CSRSS_API_REPLY
) + Size
);
1640 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Reply
->Status
))
1642 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1643 SetLastErrorByStatus(Status
);
1647 // Convert CHARs to WORDs
1648 for(i
= 0; i
< Size
; ++i
)
1649 *lpAttribute
++ = Reply
->Data
.ReadConsoleOutputAttribReply
.String
[i
];
1652 Request
.Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Reply
->Data
.ReadConsoleOutputAttribReply
.EndCoord
;
1655 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
1661 /*--------------------------------------------------------------
1662 * WriteConsoleOutputCharacterA
1664 WINBASEAPI BOOL WINAPI
1665 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1669 LPDWORD lpNumberOfCharsWritten
)
1671 PCSRSS_API_REQUEST Request
;
1672 CSRSS_API_REPLY Reply
;
1676 Request
= RtlAllocateHeap(GetProcessHeap(),
1678 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
);
1681 SetLastError( ERROR_OUTOFMEMORY
);
1684 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
;
1685 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
1686 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
1687 if( lpNumberOfCharsWritten
)
1688 *lpNumberOfCharsWritten
= nLength
;
1691 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
: nLength
;
1692 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= Size
;
1693 memcpy( &Request
->Data
.WriteConsoleOutputCharRequest
.String
[0],
1696 Status
= CsrClientCallServer( Request
, &Reply
, sizeof( CSRSS_API_REQUEST
) + Size
, sizeof( CSRSS_API_REPLY
) );
1697 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1699 RtlFreeHeap( GetProcessHeap(), 0, Request
);
1700 SetLastErrorByStatus ( Status
);
1704 lpCharacter
+= Size
;
1705 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Reply
.Data
.WriteConsoleOutputCharReply
.EndCoord
;
1708 RtlFreeHeap( GetProcessHeap(), 0, Request
);
1713 /*--------------------------------------------------------------
1714 * WriteConsoleOutputCharacterW
1719 WriteConsoleOutputCharacterW(
1720 HANDLE hConsoleOutput
,
1721 LPCWSTR lpCharacter
,
1724 LPDWORD lpNumberOfCharsWritten
1733 /*--------------------------------------------------------------
1734 * WriteConsoleOutputAttribute
1739 WriteConsoleOutputAttribute(
1740 HANDLE hConsoleOutput
,
1741 CONST WORD
*lpAttribute
,
1744 LPDWORD lpNumberOfAttrsWritten
1747 PCSRSS_API_REQUEST Request
;
1748 CSRSS_API_REPLY Reply
;
1753 Request
= RtlAllocateHeap(GetProcessHeap(),
1755 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
);
1758 SetLastError( ERROR_OUTOFMEMORY
);
1761 Request
->Type
= CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
;
1762 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1763 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
1764 if( lpNumberOfAttrsWritten
)
1765 *lpNumberOfAttrsWritten
= nLength
;
1768 Size
= nLength
> CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
? CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
: nLength
;
1769 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
1770 for( c
= 0; c
< ( Size
* 2 ); c
++ )
1771 Request
->Data
.WriteConsoleOutputAttribRequest
.String
[c
] = (char)lpAttribute
[c
];
1772 Status
= CsrClientCallServer( Request
, &Reply
, sizeof( CSRSS_API_REQUEST
) + (Size
* 2), sizeof( CSRSS_API_REPLY
) );
1773 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1775 RtlFreeHeap( GetProcessHeap(), 0, Request
);
1776 SetLastErrorByStatus ( Status
);
1780 lpAttribute
+= Size
;
1781 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Reply
.Data
.WriteConsoleOutputAttribReply
.EndCoord
;
1784 RtlFreeHeap( GetProcessHeap(), 0, Request
);
1789 /*--------------------------------------------------------------
1790 * FillConsoleOutputAttribute
1795 FillConsoleOutputAttribute(
1796 HANDLE hConsoleOutput
,
1800 LPDWORD lpNumberOfAttrsWritten
1803 CSRSS_API_REQUEST Request
;
1804 CSRSS_API_REPLY Reply
;
1807 Request
.Type
= CSRSS_FILL_OUTPUT_ATTRIB
;
1808 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1809 Request
.Data
.FillOutputAttribRequest
.Attribute
= wAttribute
;
1810 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
1811 Request
.Data
.FillOutputAttribRequest
.Length
= nLength
;
1812 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1813 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1815 SetLastErrorByStatus ( Status
);
1818 if( lpNumberOfAttrsWritten
)
1819 *lpNumberOfAttrsWritten
= nLength
;
1824 /*--------------------------------------------------------------
1831 HANDLE hConsoleHandle
,
1835 CSRSS_API_REQUEST Request
;
1836 CSRSS_API_REPLY Reply
;
1839 Request
.Type
= CSRSS_GET_MODE
;
1840 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
1841 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1842 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1844 SetLastErrorByStatus ( Status
);
1847 *lpMode
= Reply
.Data
.GetConsoleModeReply
.ConsoleMode
;
1852 /*--------------------------------------------------------------
1853 * GetNumberOfConsoleInputEvents
1858 GetNumberOfConsoleInputEvents(
1859 HANDLE hConsoleInput
,
1860 LPDWORD lpNumberOfEvents
1863 CSRSS_API_REQUEST Request
;
1864 CSRSS_API_REPLY Reply
;
1867 if(lpNumberOfEvents
== NULL
)
1869 SetLastError(ERROR_INVALID_PARAMETER
);
1873 Request
.Type
= CSRSS_GET_NUM_INPUT_EVENTS
;
1874 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= 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
);
1882 *lpNumberOfEvents
= Reply
.Data
.GetNumInputEventsReply
.NumInputEvents
;
1888 /*--------------------------------------------------------------
1889 * GetLargestConsoleWindowSize
1894 GetLargestConsoleWindowSize(
1895 HANDLE hConsoleOutput
1899 COORD Coord
= {80,25};
1907 /*--------------------------------------------------------------
1908 * GetConsoleCursorInfo
1913 GetConsoleCursorInfo(
1914 HANDLE hConsoleOutput
,
1915 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
1918 CSRSS_API_REQUEST Request
;
1919 CSRSS_API_REPLY Reply
;
1922 Request
.Type
= CSRSS_GET_CURSOR_INFO
;
1923 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1924 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1926 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1928 SetLastErrorByStatus ( Status
);
1931 *lpConsoleCursorInfo
= Reply
.Data
.GetCursorInfoReply
.Info
;
1936 /*--------------------------------------------------------------
1937 * GetNumberOfConsoleMouseButtons
1942 GetNumberOfConsoleMouseButtons(
1943 LPDWORD lpNumberOfMouseButtons
1951 /*--------------------------------------------------------------
1958 HANDLE hConsoleHandle
,
1962 CSRSS_API_REQUEST Request
;
1963 CSRSS_API_REPLY Reply
;
1966 Request
.Type
= CSRSS_SET_MODE
;
1967 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
1968 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
1969 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1970 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1972 SetLastErrorByStatus ( Status
);
1979 /*--------------------------------------------------------------
1980 * SetConsoleActiveScreenBuffer
1985 SetConsoleActiveScreenBuffer(
1986 HANDLE hConsoleOutput
1989 CSRSS_API_REQUEST Request
;
1990 CSRSS_API_REPLY Reply
;
1993 Request
.Type
= CSRSS_SET_SCREEN_BUFFER
;
1994 Request
.Data
.SetActiveScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
1995 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
1996 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
1998 SetLastErrorByStatus ( Status
);
2005 /*--------------------------------------------------------------
2006 * FlushConsoleInputBuffer
2011 FlushConsoleInputBuffer(
2012 HANDLE hConsoleInput
2015 CSRSS_API_REQUEST Request
;
2016 CSRSS_API_REPLY Reply
;
2019 Request
.Type
= CSRSS_FLUSH_INPUT_BUFFER
;
2020 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
2021 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2022 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2024 SetLastErrorByStatus ( Status
);
2031 /*--------------------------------------------------------------
2032 * SetConsoleScreenBufferSize
2037 SetConsoleScreenBufferSize(
2038 HANDLE hConsoleOutput
,
2046 /*--------------------------------------------------------------
2047 * SetConsoleCursorInfo
2052 SetConsoleCursorInfo(
2053 HANDLE hConsoleOutput
,
2054 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
2057 CSRSS_API_REQUEST Request
;
2058 CSRSS_API_REPLY Reply
;
2061 Request
.Type
= CSRSS_SET_CURSOR_INFO
;
2062 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2063 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
2064 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2066 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2068 SetLastErrorByStatus ( Status
);
2075 /*--------------------------------------------------------------
2076 * ScrollConsoleScreenBufferA
2081 ScrollConsoleScreenBufferA(
2082 HANDLE hConsoleOutput
,
2083 CONST SMALL_RECT
*lpScrollRectangle
,
2084 CONST SMALL_RECT
*lpClipRectangle
,
2085 COORD dwDestinationOrigin
,
2086 CONST CHAR_INFO
*lpFill
2089 CSRSS_API_REQUEST Request
;
2090 CSRSS_API_REPLY Reply
;
2093 Request
.Type
= CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER
;
2094 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
2095 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
2097 if (lpClipRectangle
!= NULL
)
2099 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
2100 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
2104 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
2107 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
2108 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
2109 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2111 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2113 SetLastErrorByStatus ( Status
);
2120 /*--------------------------------------------------------------
2121 * ScrollConsoleScreenBufferW
2126 ScrollConsoleScreenBufferW(
2127 HANDLE hConsoleOutput
,
2128 CONST SMALL_RECT
*lpScrollRectangle
,
2129 CONST SMALL_RECT
*lpClipRectangle
,
2130 COORD dwDestinationOrigin
,
2131 CONST CHAR_INFO
*lpFill
2139 /*--------------------------------------------------------------
2140 * SetConsoleWindowInfo
2145 SetConsoleWindowInfo(
2146 HANDLE hConsoleOutput
,
2148 CONST SMALL_RECT
*lpConsoleWindow
2156 /*--------------------------------------------------------------
2157 * SetConsoleTextAttribute
2162 SetConsoleTextAttribute(
2163 HANDLE hConsoleOutput
,
2167 CSRSS_API_REQUEST Request
;
2168 CSRSS_API_REPLY Reply
;
2171 Request
.Type
= CSRSS_SET_ATTRIB
;
2172 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2173 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
2174 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2175 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2177 SetLastErrorByStatus ( Status
);
2184 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2186 if (HandlerRoutine
== NULL
)
2188 IgnoreCtrlEvents
= TRUE
;
2195 RtlReAllocateHeap(RtlGetProcessHeap(),
2197 (PVOID
)CtrlHandlers
,
2198 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2199 if (CtrlHandlers
== NULL
)
2201 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2204 CtrlHandlers
[NrCtrlHandlers
- 1] = HandlerRoutine
;
2210 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2214 if (HandlerRoutine
== NULL
)
2216 IgnoreCtrlEvents
= FALSE
;
2221 for (i
= 0; i
< NrCtrlHandlers
; i
++)
2223 if ((PHANDLER_ROUTINE
) CtrlHandlers
[i
] == HandlerRoutine
)
2225 CtrlHandlers
[i
] = CtrlHandlers
[NrCtrlHandlers
- 1];
2228 RtlReAllocateHeap(RtlGetProcessHeap(),
2230 (PVOID
)CtrlHandlers
,
2231 NrCtrlHandlers
* sizeof(PHANDLER_ROUTINE
));
2239 WINBASEAPI BOOL WINAPI
2240 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
2245 RtlEnterCriticalSection(&DllLock
);
2248 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
2252 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
2254 RtlLeaveCriticalSection(&DllLock
);
2259 /*--------------------------------------------------------------
2260 * GenerateConsoleCtrlEvent
2262 WINBASEAPI BOOL WINAPI
2263 GenerateConsoleCtrlEvent(
2265 DWORD dwProcessGroupId
2273 /*--------------------------------------------------------------
2281 LPWSTR lpConsoleTitle
,
2285 CSRSS_API_REQUEST Request
;
2286 PCSRSS_API_REPLY Reply
;
2290 hConsole
= CreateFileW(L
"CONIN$", GENERIC_READ
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2291 if (hConsole
== INVALID_HANDLE_VALUE
)
2296 Reply
= RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
2299 CloseHandle(hConsole
);
2300 SetLastError(ERROR_OUTOFMEMORY
);
2304 Request
.Type
= CSRSS_GET_TITLE
;
2305 Request
.Data
.GetTitleRequest
.ConsoleHandle
= hConsole
;
2307 Status
= CsrClientCallServer(&Request
, Reply
, sizeof(CSRSS_API_REQUEST
), sizeof(CSRSS_API_REPLY
) + CSRSS_MAX_TITLE_LENGTH
* sizeof(WCHAR
));
2308 CloseHandle(hConsole
);
2309 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Reply
->Status
)))
2311 SetLastErrorByStatus(Status
);
2312 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
2316 if(nSize
* sizeof(WCHAR
) < Reply
->Data
.GetTitleReply
.Length
)
2318 wcsncpy(lpConsoleTitle
, Reply
->Data
.GetTitleReply
.Title
, nSize
- 1);
2319 lpConsoleTitle
[nSize
--] = L
'\0';
2323 nSize
= Reply
->Data
.GetTitleReply
.Length
/ sizeof (WCHAR
);
2324 wcscpy(lpConsoleTitle
, Reply
->Data
.GetTitleReply
.Title
);
2325 lpConsoleTitle
[nSize
] = L
'\0';
2328 RtlFreeHeap(GetProcessHeap(), 0, Reply
);
2333 /*--------------------------------------------------------------
2342 LPSTR lpConsoleTitle
,
2346 wchar_t WideTitle
[CSRSS_MAX_TITLE_LENGTH
];
2347 DWORD nWideTitle
= sizeof WideTitle
;
2350 if (!lpConsoleTitle
|| !nSize
) return 0;
2351 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
2352 if (!nWideTitle
) return 0;
2354 if ( (nWritten
= WideCharToMultiByte(
2355 CP_ACP
, // ANSI code page
2356 0, // performance and mapping flags
2357 (LPWSTR
) WideTitle
, // address of wide-character string
2358 nWideTitle
, // number of characters in string
2359 lpConsoleTitle
, // address of buffer for new string
2360 nSize
, // size of buffer
2365 lpConsoleTitle
[nWritten
] = '\0';
2373 /*--------------------------------------------------------------
2380 LPCWSTR lpConsoleTitle
2383 PCSRSS_API_REQUEST Request
;
2384 CSRSS_API_REPLY Reply
;
2389 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2390 if (hConsole
== INVALID_HANDLE_VALUE
)
2395 Request
= RtlAllocateHeap(GetProcessHeap(),
2397 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_SET_TITLE_REQUEST
);
2398 if (Request
== NULL
)
2400 CloseHandle(hConsole
);
2401 SetLastError(ERROR_OUTOFMEMORY
);
2405 Request
->Type
= CSRSS_SET_TITLE
;
2406 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
2408 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
2409 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
2411 Request
->Data
.SetTitleRequest
.Title
[c
] = 0;
2412 Request
->Data
.SetTitleRequest
.Length
= c
;
2413 Status
= CsrClientCallServer(Request
,
2415 sizeof(CSRSS_API_REQUEST
) +
2417 sizeof(CSRSS_API_REPLY
));
2418 CloseHandle(hConsole
);
2419 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2421 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2422 SetLastErrorByStatus (Status
);
2425 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2430 /*--------------------------------------------------------------
2439 LPCSTR lpConsoleTitle
2442 PCSRSS_API_REQUEST Request
;
2443 CSRSS_API_REPLY Reply
;
2448 hConsole
= CreateFileW(L
"CONIN$", GENERIC_WRITE
, 0, NULL
, OPEN_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2449 if (hConsole
== INVALID_HANDLE_VALUE
)
2454 Request
= RtlAllocateHeap(GetProcessHeap(),
2456 sizeof(CSRSS_API_REQUEST
) + CSRSS_MAX_SET_TITLE_REQUEST
);
2457 if (Request
== NULL
)
2459 CloseHandle(hConsole
);
2460 SetLastError(ERROR_OUTOFMEMORY
);
2464 Request
->Type
= CSRSS_SET_TITLE
;
2465 Request
->Data
.SetTitleRequest
.Console
= hConsole
;
2467 for( c
= 0; lpConsoleTitle
[c
] && c
< CSRSS_MAX_TITLE_LENGTH
; c
++ )
2468 Request
->Data
.SetTitleRequest
.Title
[c
] = lpConsoleTitle
[c
];
2470 Request
->Data
.SetTitleRequest
.Title
[c
] = 0;
2471 Request
->Data
.SetTitleRequest
.Length
= c
;
2472 Status
= CsrClientCallServer(Request
,
2474 sizeof(CSRSS_API_REQUEST
) +
2476 sizeof(CSRSS_API_REPLY
));
2477 CloseHandle(hConsole
);
2478 if (!NT_SUCCESS(Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2480 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2481 SetLastErrorByStatus (Status
);
2484 RtlFreeHeap( GetProcessHeap(), 0, Request
);
2489 /*--------------------------------------------------------------
2496 HANDLE hConsoleInput
,
2498 DWORD nNumberOfCharsToRead
,
2499 LPDWORD lpNumberOfCharsRead
,
2508 /*--------------------------------------------------------------
2515 HANDLE hConsoleOutput
,
2516 CONST VOID
*lpBuffer
,
2517 DWORD nNumberOfCharsToWrite
,
2518 LPDWORD lpNumberOfCharsWritten
,
2523 PCSRSS_API_REQUEST Request
;
2524 CSRSS_API_REPLY Reply
;
2527 Request
= RtlAllocateHeap(GetProcessHeap(),
2529 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
* sizeof(WCHAR
));
2530 if (Request
== NULL
)
2532 SetLastError(ERROR_OUTOFMEMORY
);
2536 Request
->Type
= CSRSS_WRITE_CONSOLE
;
2537 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
2538 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
=
2539 nNumberOfCharsToWrite
;
2540 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
2541 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
2542 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
,
2544 nNumberOfCharsToWrite
* sizeof(WCHAR
));
2546 Status
= CsrClientCallServer(Request
,
2548 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
,
2549 sizeof(CSRSS_API_REPLY
));
2551 RtlFreeHeap(GetProcessHeap(),
2555 if (!NT_SUCCESS(Status
))
2560 if (lpNumberOfCharsWritten
!= NULL
)
2562 *lpNumberOfCharsWritten
=
2563 Reply
.Data
.WriteConsoleReply
.NrCharactersWritten
;
2572 /*--------------------------------------------------------------
2573 * CreateConsoleScreenBuffer
2578 CreateConsoleScreenBuffer(
2579 DWORD dwDesiredAccess
,
2581 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
2583 LPVOID lpScreenBufferData
2586 // FIXME: don't ignore access, share mode, and security
2587 CSRSS_API_REQUEST Request
;
2588 CSRSS_API_REPLY Reply
;
2591 Request
.Type
= CSRSS_CREATE_SCREEN_BUFFER
;
2592 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2593 if( !NT_SUCCESS( Status
) || !NT_SUCCESS( Status
= Reply
.Status
) )
2595 SetLastErrorByStatus ( Status
);
2598 return Reply
.Data
.CreateScreenBufferReply
.OutputHandle
;
2602 /*--------------------------------------------------------------
2608 GetConsoleCP( VOID
)
2611 return CP_OEMCP
; /* FIXME */
2615 /*--------------------------------------------------------------
2630 /*--------------------------------------------------------------
2631 * GetConsoleOutputCP
2636 GetConsoleOutputCP( VOID
)
2639 return 0; /* FIXME */
2643 /*--------------------------------------------------------------
2644 * SetConsoleOutputCP
2658 /*--------------------------------------------------------------
2659 * GetConsoleProcessList
2662 GetConsoleProcessList(LPDWORD lpdwProcessList
,
2663 DWORD dwProcessCount
)
2665 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2671 /*--------------------------------------------------------------
2672 * GetConsoleSelectionInfo
2675 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
2677 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2683 /*--------------------------------------------------------------
2687 AttachConsole(DWORD dwProcessId
)
2689 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2693 /*--------------------------------------------------------------
2694 * GetConsoleWindow/0
2697 GetConsoleWindow (VOID
)
2699 CSRSS_API_REQUEST Request
;
2700 CSRSS_API_REPLY Reply
;
2703 Request
.Data
.ConsoleWindowRequest
.ConsoleHandle
=
2704 OpenConsoleW (L
"CONOUT$", (GENERIC_READ
|GENERIC_WRITE
), FALSE
, OPEN_EXISTING
);
2705 if (INVALID_HANDLE_VALUE
== Request
.Data
.ConsoleWindowRequest
.ConsoleHandle
)
2709 Request
.Type
= CSRSS_GET_CONSOLE_WINDOW
;
2710 Status
= CsrClientCallServer( &Request
, &Reply
, sizeof( CSRSS_API_REQUEST
), sizeof( CSRSS_API_REPLY
) );
2711 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Reply
.Status
))
2713 SetLastErrorByStatus (Status
);
2716 return Reply
.Data
.ConsoleWindowReply
.WindowHandle
;