2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/kernel32/client/console/console.c
5 * PURPOSE: Win32 server console functions
6 * PROGRAMMER: James Tabor
7 * <jimtabor@adsl-64-217-116-74.dsl.hstntx.swbell.net>
10 * 19990204 EA SetConsoleTitleA
14 /* INCLUDES *******************************************************************/
21 extern RTL_CRITICAL_SECTION ConsoleLock
;
22 extern BOOL ConsoleInitialized
;
23 extern BOOL WINAPI
IsDebuggerPresent(VOID
);
25 /* GLOBALS ********************************************************************/
27 PHANDLER_ROUTINE InitialHandler
[1];
28 PHANDLER_ROUTINE
* CtrlHandlers
;
30 ULONG NrAllocatedHandlers
;
32 #define INPUTEXENAME_BUFLEN 256
33 static WCHAR InputExeName
[INPUTEXENAME_BUFLEN
];
35 /* Default Console Control Handler ********************************************/
39 DefaultConsoleCtrlHandler(DWORD Event
)
41 DPRINT("Default handler called: %lx\n", Event
);
45 DPRINT("Ctrl-C Event\n");
48 case CTRL_BREAK_EVENT
:
49 DPRINT("Ctrl-Break Event\n");
52 case CTRL_SHUTDOWN_EVENT
:
53 DPRINT("Ctrl Shutdown Event\n");
56 case CTRL_CLOSE_EVENT
:
57 DPRINT("Ctrl Close Event\n");
60 case CTRL_LOGOFF_EVENT
:
61 DPRINT("Ctrl Logoff Event\n");
65 ExitProcess(CONTROL_C_EXIT
);
72 ConsoleControlDispatcher(DWORD CodeAndFlag
)
75 DWORD nCode
= CodeAndFlag
& MAXLONG
;
77 EXCEPTION_RECORD erException
;
79 DPRINT("Console Dispatcher Active: %lx %lx\n", CodeAndFlag
, nCode
);
80 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST
);
85 case CTRL_BREAK_EVENT
:
87 if (IsDebuggerPresent())
89 erException
.ExceptionCode
= (nCode
== CTRL_C_EVENT
?
90 DBG_CONTROL_C
: DBG_CONTROL_BREAK
);
91 erException
.ExceptionFlags
= 0;
92 erException
.ExceptionRecord
= NULL
;
93 erException
.ExceptionAddress
= DefaultConsoleCtrlHandler
;
94 erException
.NumberParameters
= 0;
98 RtlRaiseException(&erException
);
100 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
102 RtlEnterCriticalSection(&ConsoleLock
);
104 if ((nCode
!= CTRL_C_EVENT
) ||
105 (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
107 for (i
= NrCtrlHandlers
; i
> 0; i
--)
109 if (CtrlHandlers
[i
- 1](nCode
)) break;
113 RtlLeaveCriticalSection(&ConsoleLock
);
123 case CTRL_CLOSE_EVENT
:
124 case CTRL_LOGOFF_EVENT
:
125 case CTRL_SHUTDOWN_EVENT
:
135 ExitProcess(CONTROL_C_EXIT
);
144 ASSERT(ConsoleInitialized
);
146 RtlEnterCriticalSection(&ConsoleLock
);
148 if ((nCode
!= CTRL_C_EVENT
) || (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
150 for (i
= NrCtrlHandlers
; i
> 0; i
--)
153 (CodeAndFlag
& MINLONG
) &&
154 ((nCode
== CTRL_LOGOFF_EVENT
) || (nCode
== CTRL_SHUTDOWN_EVENT
)))
156 DPRINT("Skipping system/service apps\n");
160 if (CtrlHandlers
[i
- 1](nCode
))
164 case CTRL_CLOSE_EVENT
:
165 case CTRL_LOGOFF_EVENT
:
166 case CTRL_SHUTDOWN_EVENT
:
168 nExitCode
= CodeAndFlag
;
176 RtlLeaveCriticalSection(&ConsoleLock
);
177 ExitThread(nExitCode
);
180 /* Get the size needed to copy a string to a capture buffer, including alignment */
182 IntStringSize(LPCVOID String
,
185 ULONG Size
= (Unicode
? wcslen(String
) : strlen(String
)) * sizeof(WCHAR
);
186 return (Size
+ 3) & -4;
189 /* Copy a string to a capture buffer */
191 IntCaptureMessageString(PCSR_CAPTURE_BUFFER CaptureBuffer
,
194 PUNICODE_STRING RequestString
)
199 Size
= wcslen(String
) * sizeof(WCHAR
);
200 CsrCaptureMessageBuffer(CaptureBuffer
, (PVOID
)String
, Size
, (PVOID
*)&RequestString
->Buffer
);
204 Size
= strlen(String
);
205 CsrAllocateMessagePointer(CaptureBuffer
, Size
* sizeof(WCHAR
), (PVOID
*)&RequestString
->Buffer
);
206 Size
= MultiByteToWideChar(CP_ACP
, 0, String
, Size
, RequestString
->Buffer
, Size
* sizeof(WCHAR
))
209 RequestString
->Length
= RequestString
->MaximumLength
= Size
;
212 /* FUNCTIONS ******************************************************************/
215 * @unimplemented (Undocumented)
219 ConsoleMenuControl(HANDLE hConsole
,
223 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
224 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
234 DuplicateConsoleHandle(HANDLE hConsole
,
235 DWORD dwDesiredAccess
,
239 CSR_API_MESSAGE Request
;
242 if (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)
243 || (!(dwOptions
& DUPLICATE_SAME_ACCESS
)
244 && dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)))
246 SetLastError (ERROR_INVALID_PARAMETER
);
247 return INVALID_HANDLE_VALUE
;
250 Request
.Data
.DuplicateHandleRequest
.Handle
= hConsole
;
251 Request
.Data
.DuplicateHandleRequest
.Access
= dwDesiredAccess
;
252 Request
.Data
.DuplicateHandleRequest
.Inheritable
= bInheritHandle
;
253 Request
.Data
.DuplicateHandleRequest
.Options
= dwOptions
;
255 Status
= CsrClientCallServer(&Request
,
257 CSR_CREATE_API_NUMBER(CSR_NATIVE
, DUPLICATE_HANDLE
),
258 sizeof(CSR_API_MESSAGE
));
259 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
=Request
.Status
))
261 BaseSetLastNTError(Status
);
262 return INVALID_HANDLE_VALUE
;
265 return Request
.Data
.DuplicateHandleRequest
.Handle
;
270 IntExpungeConsoleCommandHistory(LPCVOID lpExeName
, BOOL bUnicode
)
272 CSR_API_MESSAGE Request
;
273 PCSR_CAPTURE_BUFFER CaptureBuffer
;
276 if (lpExeName
== NULL
|| !(bUnicode
? *(PWCHAR
)lpExeName
: *(PCHAR
)lpExeName
))
278 SetLastError(ERROR_INVALID_PARAMETER
);
282 CaptureBuffer
= CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName
, bUnicode
));
285 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
286 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
290 IntCaptureMessageString(CaptureBuffer
, lpExeName
, bUnicode
,
291 &Request
.Data
.ExpungeCommandHistory
.ExeName
);
293 Status
= CsrClientCallServer(&Request
,
295 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, EXPUNGE_COMMAND_HISTORY
),
296 sizeof(CSR_API_MESSAGE
));
298 CsrFreeCaptureBuffer(CaptureBuffer
);
300 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
302 BaseSetLastNTError(Status
);
310 * @implemented (Undocumented)
314 ExpungeConsoleCommandHistoryW(LPCWSTR lpExeName
)
316 return IntExpungeConsoleCommandHistory(lpExeName
, TRUE
);
320 * @implemented (Undocumented)
324 ExpungeConsoleCommandHistoryA(LPCSTR lpExeName
)
326 return IntExpungeConsoleCommandHistory(lpExeName
, FALSE
);
331 IntGetConsoleCommandHistory(LPVOID lpHistory
, DWORD cbHistory
, LPCVOID lpExeName
, BOOL bUnicode
)
333 CSR_API_MESSAGE Request
;
334 PCSR_CAPTURE_BUFFER CaptureBuffer
;
336 DWORD HistoryLength
= cbHistory
* (bUnicode
? 1 : sizeof(WCHAR
));
338 if (lpExeName
== NULL
|| !(bUnicode
? *(PWCHAR
)lpExeName
: *(PCHAR
)lpExeName
))
340 SetLastError(ERROR_INVALID_PARAMETER
);
344 CaptureBuffer
= CsrAllocateCaptureBuffer(2, IntStringSize(lpExeName
, bUnicode
) +
348 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
349 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
353 IntCaptureMessageString(CaptureBuffer
, lpExeName
, bUnicode
,
354 &Request
.Data
.GetCommandHistory
.ExeName
);
355 Request
.Data
.GetCommandHistory
.Length
= HistoryLength
;
356 CsrAllocateMessagePointer(CaptureBuffer
, HistoryLength
,
357 (PVOID
*)&Request
.Data
.GetCommandHistory
.History
);
359 Status
= CsrClientCallServer(&Request
,
361 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_COMMAND_HISTORY
),
362 sizeof(CSR_API_MESSAGE
));
363 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
365 CsrFreeCaptureBuffer(CaptureBuffer
);
366 BaseSetLastNTError(Status
);
373 Request
.Data
.GetCommandHistory
.History
,
374 Request
.Data
.GetCommandHistory
.Length
);
378 WideCharToMultiByte(CP_ACP
, 0,
379 Request
.Data
.GetCommandHistory
.History
,
380 Request
.Data
.GetCommandHistory
.Length
/ sizeof(WCHAR
),
386 CsrFreeCaptureBuffer(CaptureBuffer
);
387 return Request
.Data
.GetCommandHistory
.Length
;
391 * @implemented (Undocumented)
395 GetConsoleCommandHistoryW(LPWSTR lpHistory
,
399 return IntGetConsoleCommandHistory(lpHistory
, cbHistory
, lpExeName
, TRUE
);
403 * @implemented (Undocumented)
407 GetConsoleCommandHistoryA(LPSTR lpHistory
,
411 return IntGetConsoleCommandHistory(lpHistory
, cbHistory
, lpExeName
, FALSE
);
416 IntGetConsoleCommandHistoryLength(LPCVOID lpExeName
, BOOL bUnicode
)
418 CSR_API_MESSAGE Request
;
419 PCSR_CAPTURE_BUFFER CaptureBuffer
;
422 if (lpExeName
== NULL
|| !(bUnicode
? *(PWCHAR
)lpExeName
: *(PCHAR
)lpExeName
))
424 SetLastError(ERROR_INVALID_PARAMETER
);
428 CaptureBuffer
= CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName
, bUnicode
));
431 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
432 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
436 IntCaptureMessageString(CaptureBuffer
, lpExeName
, bUnicode
,
437 &Request
.Data
.GetCommandHistoryLength
.ExeName
);
439 Status
= CsrClientCallServer(&Request
,
441 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_COMMAND_HISTORY_LENGTH
),
442 sizeof(CSR_API_MESSAGE
));
444 CsrFreeCaptureBuffer(CaptureBuffer
);
446 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
448 BaseSetLastNTError(Status
);
452 return Request
.Data
.GetCommandHistoryLength
.Length
;
456 * @implemented (Undocumented)
460 GetConsoleCommandHistoryLengthW(LPCWSTR lpExeName
)
462 return IntGetConsoleCommandHistoryLength(lpExeName
, TRUE
);
466 * @implemented (Undocumented)
470 GetConsoleCommandHistoryLengthA(LPCSTR lpExeName
)
472 return IntGetConsoleCommandHistoryLength(lpExeName
, FALSE
) / sizeof(WCHAR
);
481 GetConsoleDisplayMode(LPDWORD lpdwMode
)
483 * FUNCTION: Get the console display mode
485 * lpdwMode - Address of variable that receives the current value
487 * STATUS: Undocumented
490 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
491 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
497 * @unimplemented (Undocumented)
501 GetConsoleFontInfo(DWORD Unknown0
,
506 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
507 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
517 GetConsoleFontSize(HANDLE hConsoleOutput
,
520 COORD Empty
= {0, 0};
521 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
522 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
528 * @implemented (Undocumented)
532 GetConsoleHardwareState(HANDLE hConsole
,
536 CSR_API_MESSAGE Request
;
539 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
540 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
542 Status
= CsrClientCallServer(&Request
,
544 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SETGET_CONSOLE_HW_STATE
),
545 sizeof(CSR_API_MESSAGE
));
546 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
548 BaseSetLastNTError(Status
);
552 *State
= Request
.Data
.ConsoleHardwareStateRequest
.State
;
558 * @implemented (Undocumented)
562 GetConsoleInputWaitHandle(VOID
)
564 CSR_API_MESSAGE Request
;
567 Status
= CsrClientCallServer(&Request
,
569 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_INPUT_WAIT_HANDLE
),
570 sizeof(CSR_API_MESSAGE
));
571 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
573 BaseSetLastNTError(Status
);
577 return Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
586 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
588 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
590 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
591 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
597 * @unimplemented (Undocumented)
601 GetNumberOfConsoleFonts(VOID
)
603 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
604 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
605 return 1; /* FIXME: call csrss.exe */
610 * @unimplemented (Undocumented)
614 InvalidateConsoleDIBits(DWORD Unknown0
,
617 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
618 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
624 * @unimplemented (Undocumented)
628 OpenConsoleW(LPCWSTR wsName
,
629 DWORD dwDesiredAccess
,
633 CSR_API_MESSAGE Request
;
635 NTSTATUS Status
= STATUS_SUCCESS
;
637 if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONIN$"))
639 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_NATIVE
, GET_INPUT_HANDLE
);
641 else if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONOUT$"))
643 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_NATIVE
, GET_OUTPUT_HANDLE
);
647 SetLastError(ERROR_INVALID_PARAMETER
);
648 return(INVALID_HANDLE_VALUE
);
651 if (dwDesiredAccess
& ~(GENERIC_READ
|GENERIC_WRITE
))
653 SetLastError(ERROR_INVALID_PARAMETER
);
654 return(INVALID_HANDLE_VALUE
);
657 if (dwShareMode
& ~(FILE_SHARE_READ
|FILE_SHARE_WRITE
))
659 SetLastError(ERROR_INVALID_PARAMETER
);
660 return(INVALID_HANDLE_VALUE
);
663 /* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
664 Request
.Data
.GetInputHandleRequest
.Access
= dwDesiredAccess
;
665 Request
.Data
.GetInputHandleRequest
.Inheritable
= bInheritHandle
;
666 Request
.Data
.GetInputHandleRequest
.ShareMode
= dwShareMode
;
668 Status
= CsrClientCallServer(&Request
,
671 sizeof(CSR_API_MESSAGE
));
672 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
674 BaseSetLastNTError(Status
);
675 return INVALID_HANDLE_VALUE
;
678 return Request
.Data
.GetInputHandleRequest
.Handle
;
683 * @unimplemented (Undocumented)
687 SetConsoleCursor(DWORD Unknown0
,
690 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
691 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
701 SetConsoleDisplayMode(HANDLE hOut
,
705 * FUNCTION: Set the console display mode.
707 * hOut - Standard output handle.
708 * dwNewMode - New mode.
709 * lpdwOldMode - Address of a variable that receives the old mode.
712 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
713 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
719 * @unimplemented (Undocumented)
723 SetConsoleFont(DWORD Unknown0
,
726 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
727 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
733 * @implemented (Undocumented)
737 SetConsoleHardwareState(HANDLE hConsole
,
741 CSR_API_MESSAGE Request
;
744 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
745 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
746 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
748 Status
= CsrClientCallServer(&Request
,
750 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SETGET_CONSOLE_HW_STATE
),
751 sizeof(CSR_API_MESSAGE
));
752 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
754 BaseSetLastNTError(Status
);
763 * @unimplemented (Undocumented)
767 SetConsoleKeyShortcuts(DWORD Unknown0
,
772 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
773 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
779 * @unimplemented (Undocumented)
783 SetConsoleMaximumWindowSize(DWORD Unknown0
,
786 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
787 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
793 * @unimplemented (Undocumented)
797 SetConsoleMenuClose(DWORD Unknown0
)
799 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
800 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
806 IntSetConsoleNumberOfCommands(DWORD dwNumCommands
,
810 CSR_API_MESSAGE Request
;
811 PCSR_CAPTURE_BUFFER CaptureBuffer
;
814 if (lpExeName
== NULL
|| !(bUnicode
? *(PWCHAR
)lpExeName
: *(PCHAR
)lpExeName
))
816 SetLastError(ERROR_INVALID_PARAMETER
);
820 CaptureBuffer
= CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName
, bUnicode
));
823 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
824 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
828 IntCaptureMessageString(CaptureBuffer
, lpExeName
, bUnicode
,
829 &Request
.Data
.SetHistoryNumberCommands
.ExeName
);
830 Request
.Data
.SetHistoryNumberCommands
.NumCommands
= dwNumCommands
;
832 Status
= CsrClientCallServer(&Request
,
834 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_HISTORY_NUMBER_COMMANDS
),
835 sizeof(CSR_API_MESSAGE
));
837 CsrFreeCaptureBuffer(CaptureBuffer
);
839 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
841 BaseSetLastNTError(Status
);
849 * @implemented (Undocumented)
853 SetConsoleNumberOfCommandsA(DWORD dwNumCommands
,
856 return IntSetConsoleNumberOfCommands(dwNumCommands
, lpExeName
, FALSE
);
860 * @implemented (Undocumented)
864 SetConsoleNumberOfCommandsW(DWORD dwNumCommands
,
867 return IntSetConsoleNumberOfCommands(dwNumCommands
, lpExeName
, TRUE
);
872 * @unimplemented (Undocumented)
876 SetConsolePalette(DWORD Unknown0
,
880 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
881 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
886 * @unimplemented (Undocumented)
890 ShowConsoleCursor(DWORD Unknown0
,
893 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
894 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
900 * FUNCTION: Checks whether the given handle is a valid console handle.
902 * Handle - Handle to be checked
904 * TRUE: Handle is a valid console handle
905 * FALSE: Handle is not a valid console handle.
906 * STATUS: Officially undocumented
912 VerifyConsoleIoHandle(HANDLE Handle
)
914 CSR_API_MESSAGE Request
;
917 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
919 Status
= CsrClientCallServer(&Request
,
921 CSR_CREATE_API_NUMBER(CSR_NATIVE
, VERIFY_HANDLE
),
922 sizeof(CSR_API_MESSAGE
));
923 if (!NT_SUCCESS(Status
))
925 BaseSetLastNTError(Status
);
929 return (BOOL
)NT_SUCCESS(Request
.Status
);
938 WriteConsoleInputVDMA(DWORD Unknown0
,
943 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
944 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
954 WriteConsoleInputVDMW(DWORD Unknown0
,
959 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
960 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
966 * @implemented (Undocumented)
970 CloseConsoleHandle(HANDLE Handle
)
972 CSR_API_MESSAGE Request
;
975 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
977 Status
= CsrClientCallServer(&Request
,
979 CSR_CREATE_API_NUMBER(CSR_NATIVE
, CLOSE_HANDLE
),
980 sizeof(CSR_API_MESSAGE
));
981 if (!NT_SUCCESS(Status
))
983 BaseSetLastNTError(Status
);
995 GetStdHandle(DWORD nStdHandle
)
997 * FUNCTION: Get a handle for the standard input, standard output
998 * and a standard error device.
1000 * nStdHandle - Specifies the device for which to return the handle.
1001 * RETURNS: If the function succeeds, the return value is the handle
1002 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
1005 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1007 Ppb
= NtCurrentPeb()->ProcessParameters
;
1010 case STD_INPUT_HANDLE
:
1011 return Ppb
->StandardInput
;
1013 case STD_OUTPUT_HANDLE
:
1014 return Ppb
->StandardOutput
;
1016 case STD_ERROR_HANDLE
:
1017 return Ppb
->StandardError
;
1020 SetLastError (ERROR_INVALID_PARAMETER
);
1021 return INVALID_HANDLE_VALUE
;
1030 SetStdHandle(DWORD nStdHandle
,
1033 * FUNCTION: Set the handle for the standard input, standard output or
1034 * the standard error device.
1036 * nStdHandle - Specifies the handle to be set.
1037 * hHandle - The handle to set.
1038 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
1041 PRTL_USER_PROCESS_PARAMETERS Ppb
;
1043 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
1045 Ppb
= NtCurrentPeb()->ProcessParameters
;
1049 case STD_INPUT_HANDLE
:
1050 Ppb
->StandardInput
= hHandle
;
1053 case STD_OUTPUT_HANDLE
:
1054 Ppb
->StandardOutput
= hHandle
;
1057 case STD_ERROR_HANDLE
:
1058 Ppb
->StandardError
= hHandle
;
1062 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
1063 SetLastError(ERROR_INVALID_HANDLE
);
1070 IntWriteConsole(HANDLE hConsoleOutput
,
1072 DWORD nNumberOfCharsToWrite
,
1073 LPDWORD lpNumberOfCharsWritten
,
1077 PCSR_API_MESSAGE Request
;
1081 ULONG SizeBytes
, CharSize
;
1084 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1085 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
1087 max(sizeof(CSR_API_MESSAGE
),
1088 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + min(nNumberOfCharsToWrite
,
1089 CSRSS_MAX_WRITE_CONSOLE
/ CharSize
) * CharSize
));
1090 if (Request
== NULL
)
1092 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1096 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE
);
1098 while (nNumberOfCharsToWrite
> 0)
1100 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
1101 Request
->Data
.WriteConsoleRequest
.Unicode
= bUnicode
;
1103 nChars
= (USHORT
)min(nNumberOfCharsToWrite
, CSRSS_MAX_WRITE_CONSOLE
/ CharSize
);
1104 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
= nChars
;
1106 SizeBytes
= nChars
* CharSize
;
1108 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
, lpBuffer
, SizeBytes
);
1110 Status
= CsrClientCallServer(Request
,
1113 max(sizeof(CSR_API_MESSAGE
),
1114 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE
) + SizeBytes
));
1116 if (Status
== STATUS_PENDING
)
1118 WaitForSingleObject(Request
->Data
.WriteConsoleRequest
.UnpauseEvent
, INFINITE
);
1119 CloseHandle(Request
->Data
.WriteConsoleRequest
.UnpauseEvent
);
1122 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
1124 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1125 BaseSetLastNTError(Status
);
1129 nNumberOfCharsToWrite
-= nChars
;
1130 lpBuffer
= (PVOID
)((ULONG_PTR
)lpBuffer
+ (ULONG_PTR
)SizeBytes
);
1131 Written
+= Request
->Data
.WriteConsoleRequest
.NrCharactersWritten
;
1134 if (lpNumberOfCharsWritten
!= NULL
)
1136 *lpNumberOfCharsWritten
= Written
;
1138 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
1144 /*--------------------------------------------------------------
1151 WriteConsoleA(HANDLE hConsoleOutput
,
1152 CONST VOID
*lpBuffer
,
1153 DWORD nNumberOfCharsToWrite
,
1154 LPDWORD lpNumberOfCharsWritten
,
1157 return IntWriteConsole(hConsoleOutput
,
1159 nNumberOfCharsToWrite
,
1160 lpNumberOfCharsWritten
,
1166 /*--------------------------------------------------------------
1173 WriteConsoleW(HANDLE hConsoleOutput
,
1174 CONST VOID
*lpBuffer
,
1175 DWORD nNumberOfCharsToWrite
,
1176 LPDWORD lpNumberOfCharsWritten
,
1179 return IntWriteConsole(hConsoleOutput
,
1181 nNumberOfCharsToWrite
,
1182 lpNumberOfCharsWritten
,
1190 IntReadConsole(HANDLE hConsoleInput
,
1192 DWORD nNumberOfCharsToRead
,
1193 LPDWORD lpNumberOfCharsRead
,
1194 PCONSOLE_READCONSOLE_CONTROL pInputControl
,
1197 CSR_API_MESSAGE Request
;
1199 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1200 NTSTATUS Status
= STATUS_SUCCESS
;
1201 ULONG CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1203 CaptureBuffer
= CsrAllocateCaptureBuffer(1, nNumberOfCharsToRead
* CharSize
);
1204 if (CaptureBuffer
== NULL
)
1206 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1207 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1211 CsrAllocateMessagePointer(CaptureBuffer
,
1212 nNumberOfCharsToRead
* CharSize
,
1213 &Request
.Data
.ReadConsoleRequest
.Buffer
);
1215 Request
.Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
1216 Request
.Data
.ReadConsoleRequest
.Unicode
= bUnicode
;
1217 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
= (WORD
)nNumberOfCharsToRead
;
1218 Request
.Data
.ReadConsoleRequest
.NrCharactersRead
= 0;
1219 Request
.Data
.ReadConsoleRequest
.CtrlWakeupMask
= 0;
1220 if (pInputControl
&& pInputControl
->nLength
== sizeof(CONSOLE_READCONSOLE_CONTROL
))
1222 Request
.Data
.ReadConsoleRequest
.NrCharactersRead
= pInputControl
->nInitialChars
;
1223 memcpy(Request
.Data
.ReadConsoleRequest
.Buffer
,
1225 pInputControl
->nInitialChars
* sizeof(WCHAR
));
1226 Request
.Data
.ReadConsoleRequest
.CtrlWakeupMask
= pInputControl
->dwCtrlWakeupMask
;
1229 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_CONSOLE
);
1233 if (Status
== STATUS_PENDING
)
1235 Status
= NtWaitForSingleObject(Request
.Data
.ReadConsoleRequest
.EventHandle
,
1238 if (!NT_SUCCESS(Status
))
1240 DPRINT1("Wait for console input failed!\n");
1245 Status
= CsrClientCallServer(&Request
,
1248 sizeof(CSR_API_MESSAGE
));
1249 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1251 DPRINT1("CSR returned error in ReadConsole\n");
1252 CsrFreeCaptureBuffer(CaptureBuffer
);
1253 BaseSetLastNTError(Status
);
1257 while (Status
== STATUS_PENDING
);
1260 Request
.Data
.ReadConsoleRequest
.Buffer
,
1261 Request
.Data
.ReadConsoleRequest
.NrCharactersRead
* CharSize
);
1263 if (lpNumberOfCharsRead
!= NULL
)
1264 *lpNumberOfCharsRead
= Request
.Data
.ReadConsoleRequest
.NrCharactersRead
;
1266 if (pInputControl
&& pInputControl
->nLength
== sizeof(CONSOLE_READCONSOLE_CONTROL
))
1267 pInputControl
->dwControlKeyState
= Request
.Data
.ReadConsoleRequest
.ControlKeyState
;
1269 CsrFreeCaptureBuffer(CaptureBuffer
);
1275 /*--------------------------------------------------------------
1282 ReadConsoleA(HANDLE hConsoleInput
,
1284 DWORD nNumberOfCharsToRead
,
1285 LPDWORD lpNumberOfCharsRead
,
1286 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1288 return IntReadConsole(hConsoleInput
,
1290 nNumberOfCharsToRead
,
1291 lpNumberOfCharsRead
,
1297 /*--------------------------------------------------------------
1304 ReadConsoleW(HANDLE hConsoleInput
,
1306 DWORD nNumberOfCharsToRead
,
1307 LPDWORD lpNumberOfCharsRead
,
1308 PCONSOLE_READCONSOLE_CONTROL pInputControl
)
1310 return IntReadConsole(hConsoleInput
,
1312 nNumberOfCharsToRead
,
1313 lpNumberOfCharsRead
,
1319 /*--------------------------------------------------------------
1328 CSR_API_MESSAGE Request
;
1333 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
1335 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
1336 BaseSetLastNTError (STATUS_OBJECT_NAME_EXISTS
);
1340 GetStartupInfo(&si
);
1342 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
1343 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
1344 Request
.Data
.AllocConsoleRequest
.ShowCmd
= si
.wShowWindow
;
1346 Status
= CsrClientCallServer(&Request
,
1348 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, ALLOC_CONSOLE
),
1349 sizeof(CSR_API_MESSAGE
));
1350 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1352 BaseSetLastNTError(Status
);
1356 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
1358 SetStdHandle(STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
1359 SetStdHandle(STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
1361 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
1364 DUPLICATE_SAME_ACCESS
);
1366 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
1371 /*--------------------------------------------------------------
1380 // AG: I'm not sure if this is correct (what happens to std handles?)
1381 // but I just tried to reverse what AllocConsole() does...
1383 CSR_API_MESSAGE Request
;
1386 Status
= CsrClientCallServer(&Request
,
1388 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, FREE_CONSOLE
),
1389 sizeof(CSR_API_MESSAGE
));
1390 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1392 BaseSetLastNTError(Status
);
1396 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
1401 /*--------------------------------------------------------------
1402 * GetConsoleScreenBufferInfo
1408 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
1409 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
1411 CSR_API_MESSAGE Request
;
1414 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1416 Status
= CsrClientCallServer(&Request
,
1418 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SCREEN_BUFFER_INFO
),
1419 sizeof(CSR_API_MESSAGE
));
1420 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1422 BaseSetLastNTError(Status
);
1425 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
1430 /*--------------------------------------------------------------
1431 * SetConsoleCursorPosition
1437 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
1438 COORD dwCursorPosition
)
1440 CSR_API_MESSAGE Request
;
1443 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
1444 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
1446 Status
= CsrClientCallServer(&Request
,
1448 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CURSOR
),
1449 sizeof(CSR_API_MESSAGE
));
1450 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1452 BaseSetLastNTError(Status
);
1462 IntFillConsoleOutputCharacter(HANDLE hConsoleOutput
,
1466 LPDWORD lpNumberOfCharsWritten
,
1469 CSR_API_MESSAGE Request
;
1472 Request
.Data
.FillOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1473 Request
.Data
.FillOutputRequest
.Unicode
= bUnicode
;
1476 Request
.Data
.FillOutputRequest
.Char
.UnicodeChar
= *((WCHAR
*)cCharacter
);
1478 Request
.Data
.FillOutputRequest
.Char
.AsciiChar
= *((CHAR
*)cCharacter
);
1480 Request
.Data
.FillOutputRequest
.Position
= dwWriteCoord
;
1481 Request
.Data
.FillOutputRequest
.Length
= (WORD
)nLength
;
1483 Status
= CsrClientCallServer(&Request
,
1485 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, FILL_OUTPUT
),
1486 sizeof(CSR_API_MESSAGE
));
1488 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1490 BaseSetLastNTError(Status
);
1494 if(lpNumberOfCharsWritten
!= NULL
)
1496 *lpNumberOfCharsWritten
= Request
.Data
.FillOutputRequest
.NrCharactersWritten
;
1502 /*--------------------------------------------------------------
1503 * FillConsoleOutputCharacterA
1509 FillConsoleOutputCharacterA(HANDLE hConsoleOutput
,
1513 LPDWORD lpNumberOfCharsWritten
)
1515 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1519 lpNumberOfCharsWritten
,
1524 /*--------------------------------------------------------------
1525 * FillConsoleOutputCharacterW
1531 FillConsoleOutputCharacterW(HANDLE hConsoleOutput
,
1535 LPDWORD lpNumberOfCharsWritten
)
1537 return IntFillConsoleOutputCharacter(hConsoleOutput
,
1541 lpNumberOfCharsWritten
,
1548 IntPeekConsoleInput(HANDLE hConsoleInput
,
1549 PINPUT_RECORD lpBuffer
,
1551 LPDWORD lpNumberOfEventsRead
,
1554 CSR_API_MESSAGE Request
;
1555 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1558 if (lpBuffer
== NULL
)
1560 SetLastError(ERROR_INVALID_PARAMETER
);
1564 Size
= nLength
* sizeof(INPUT_RECORD
);
1566 /* Allocate a Capture Buffer */
1567 DPRINT("IntPeekConsoleInput: %lx %p\n", Size
, lpNumberOfEventsRead
);
1568 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1569 if (CaptureBuffer
== NULL
)
1571 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1572 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1576 /* Allocate space in the Buffer */
1577 CsrCaptureMessageBuffer(CaptureBuffer
,
1580 (PVOID
*)&Request
.Data
.PeekConsoleInputRequest
.InputRecord
);
1582 /* Set up the data to send to the Console Server */
1583 Request
.Data
.PeekConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1584 Request
.Data
.PeekConsoleInputRequest
.Unicode
= bUnicode
;
1585 Request
.Data
.PeekConsoleInputRequest
.Length
= nLength
;
1587 /* Call the server */
1588 CsrClientCallServer(&Request
,
1590 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, PEEK_CONSOLE_INPUT
),
1591 sizeof(CSR_API_MESSAGE
));
1592 DPRINT("Server returned: %x\n", Request
.Status
);
1594 /* Check for success*/
1595 if (NT_SUCCESS(Request
.Status
))
1597 /* Return the number of events read */
1598 DPRINT("Events read: %lx\n", Request
.Data
.PeekConsoleInputRequest
.Length
);
1599 *lpNumberOfEventsRead
= Request
.Data
.PeekConsoleInputRequest
.Length
;
1601 /* Copy into the buffer */
1602 DPRINT("Copying to buffer\n");
1603 RtlCopyMemory(lpBuffer
,
1604 Request
.Data
.PeekConsoleInputRequest
.InputRecord
,
1605 sizeof(INPUT_RECORD
) * *lpNumberOfEventsRead
);
1610 *lpNumberOfEventsRead
= 0;
1611 BaseSetLastNTError(Request
.Status
);
1614 /* Release the capture buffer */
1615 CsrFreeCaptureBuffer(CaptureBuffer
);
1617 /* Return TRUE or FALSE */
1618 return NT_SUCCESS(Request
.Status
);
1621 /*--------------------------------------------------------------
1628 PeekConsoleInputA(HANDLE hConsoleInput
,
1629 PINPUT_RECORD lpBuffer
,
1631 LPDWORD lpNumberOfEventsRead
)
1633 return IntPeekConsoleInput(hConsoleInput
,
1636 lpNumberOfEventsRead
,
1641 /*--------------------------------------------------------------
1648 PeekConsoleInputW(HANDLE hConsoleInput
,
1649 PINPUT_RECORD lpBuffer
,
1651 LPDWORD lpNumberOfEventsRead
)
1653 return IntPeekConsoleInput(hConsoleInput
,
1655 lpNumberOfEventsRead
,
1662 IntReadConsoleInput(HANDLE hConsoleInput
,
1663 PINPUT_RECORD lpBuffer
,
1665 LPDWORD lpNumberOfEventsRead
,
1668 CSR_API_MESSAGE Request
;
1673 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_INPUT
);
1678 Request
.Data
.ReadInputRequest
.ConsoleHandle
= hConsoleInput
;
1679 Request
.Data
.ReadInputRequest
.Unicode
= bUnicode
;
1681 Status
= CsrClientCallServer(&Request
,
1684 sizeof(CSR_API_MESSAGE
));
1685 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1689 /* we couldn't read a single record, fail */
1690 BaseSetLastNTError(Status
);
1695 /* FIXME - fail gracefully in case we already read at least one record? */
1699 else if (Status
== STATUS_PENDING
)
1703 Status
= NtWaitForSingleObject(Request
.Data
.ReadInputRequest
.Event
, FALSE
, 0);
1704 if (!NT_SUCCESS(Status
))
1706 BaseSetLastNTError(Status
);
1712 /* nothing more to read (waiting for more input??), let's just bail */
1718 lpBuffer
[Read
++] = Request
.Data
.ReadInputRequest
.Input
;
1721 if (!Request
.Data
.ReadInputRequest
.MoreEvents
)
1723 /* nothing more to read, bail */
1729 if (lpNumberOfEventsRead
!= NULL
)
1731 *lpNumberOfEventsRead
= Read
;
1738 /*--------------------------------------------------------------
1745 ReadConsoleInputA(HANDLE hConsoleInput
,
1746 PINPUT_RECORD lpBuffer
,
1748 LPDWORD lpNumberOfEventsRead
)
1750 return IntReadConsoleInput(hConsoleInput
,
1753 lpNumberOfEventsRead
,
1758 /*--------------------------------------------------------------
1765 ReadConsoleInputW(HANDLE hConsoleInput
,
1766 PINPUT_RECORD lpBuffer
,
1768 LPDWORD lpNumberOfEventsRead
)
1770 return IntReadConsoleInput(hConsoleInput
,
1773 lpNumberOfEventsRead
,
1780 IntWriteConsoleInput(HANDLE hConsoleInput
,
1781 PINPUT_RECORD lpBuffer
,
1783 LPDWORD lpNumberOfEventsWritten
,
1786 CSR_API_MESSAGE Request
;
1787 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1790 if (lpBuffer
== NULL
)
1792 SetLastError(ERROR_INVALID_PARAMETER
);
1796 Size
= nLength
* sizeof(INPUT_RECORD
);
1798 /* Allocate a Capture Buffer */
1799 DPRINT("IntWriteConsoleInput: %lx %p\n", Size
, lpNumberOfEventsWritten
);
1800 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1801 if (CaptureBuffer
== NULL
)
1803 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1804 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1808 /* Allocate space in the Buffer */
1809 CsrCaptureMessageBuffer(CaptureBuffer
,
1812 (PVOID
*)&Request
.Data
.WriteConsoleInputRequest
.InputRecord
);
1814 /* Set up the data to send to the Console Server */
1815 Request
.Data
.WriteConsoleInputRequest
.ConsoleHandle
= hConsoleInput
;
1816 Request
.Data
.WriteConsoleInputRequest
.Unicode
= bUnicode
;
1817 Request
.Data
.WriteConsoleInputRequest
.Length
= nLength
;
1819 /* Call the server */
1820 CsrClientCallServer(&Request
,
1822 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE_INPUT
),
1823 sizeof(CSR_API_MESSAGE
));
1824 DPRINT("Server returned: %x\n", Request
.Status
);
1826 /* Check for success*/
1827 if (NT_SUCCESS(Request
.Status
))
1829 /* Return the number of events read */
1830 DPRINT("Events read: %lx\n", Request
.Data
.WriteConsoleInputRequest
.Length
);
1831 *lpNumberOfEventsWritten
= Request
.Data
.WriteConsoleInputRequest
.Length
;
1836 *lpNumberOfEventsWritten
= 0;
1837 BaseSetLastNTError(Request
.Status
);
1840 /* Release the capture buffer */
1841 CsrFreeCaptureBuffer(CaptureBuffer
);
1843 /* Return TRUE or FALSE */
1844 return NT_SUCCESS(Request
.Status
);
1848 /*--------------------------------------------------------------
1849 * WriteConsoleInputA
1855 WriteConsoleInputA(HANDLE hConsoleInput
,
1856 CONST INPUT_RECORD
*lpBuffer
,
1858 LPDWORD lpNumberOfEventsWritten
)
1860 return IntWriteConsoleInput(hConsoleInput
,
1861 (PINPUT_RECORD
)lpBuffer
,
1863 lpNumberOfEventsWritten
,
1868 /*--------------------------------------------------------------
1869 * WriteConsoleInputW
1875 WriteConsoleInputW(HANDLE hConsoleInput
,
1876 CONST INPUT_RECORD
*lpBuffer
,
1878 LPDWORD lpNumberOfEventsWritten
)
1880 return IntWriteConsoleInput(hConsoleInput
,
1881 (PINPUT_RECORD
)lpBuffer
,
1883 lpNumberOfEventsWritten
,
1890 IntReadConsoleOutput(HANDLE hConsoleOutput
,
1891 PCHAR_INFO lpBuffer
,
1893 COORD dwBufferCoord
,
1894 PSMALL_RECT lpReadRegion
,
1897 CSR_API_MESSAGE Request
;
1898 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1899 DWORD Size
, SizeX
, SizeY
;
1901 if (lpBuffer
== NULL
)
1903 SetLastError(ERROR_INVALID_PARAMETER
);
1907 Size
= dwBufferSize
.X
* dwBufferSize
.Y
* sizeof(CHAR_INFO
);
1909 /* Allocate a Capture Buffer */
1910 DPRINT("IntReadConsoleOutput: %lx %p\n", Size
, lpReadRegion
);
1911 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
1912 if (CaptureBuffer
== NULL
)
1914 DPRINT1("CsrAllocateCaptureBuffer failed with size 0x%x!\n", Size
);
1915 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1919 /* Allocate space in the Buffer */
1920 CsrCaptureMessageBuffer(CaptureBuffer
,
1923 (PVOID
*)&Request
.Data
.ReadConsoleOutputRequest
.CharInfo
);
1925 /* Set up the data to send to the Console Server */
1926 Request
.Data
.ReadConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
1927 Request
.Data
.ReadConsoleOutputRequest
.Unicode
= bUnicode
;
1928 Request
.Data
.ReadConsoleOutputRequest
.BufferSize
= dwBufferSize
;
1929 Request
.Data
.ReadConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
1930 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
= *lpReadRegion
;
1932 /* Call the server */
1933 CsrClientCallServer(&Request
,
1935 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_CONSOLE_OUTPUT
),
1936 sizeof(CSR_API_MESSAGE
));
1937 DPRINT("Server returned: %x\n", Request
.Status
);
1939 /* Check for success*/
1940 if (NT_SUCCESS(Request
.Status
))
1942 /* Copy into the buffer */
1943 DPRINT("Copying to buffer\n");
1944 SizeX
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Right
-
1945 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Left
+ 1;
1946 SizeY
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Bottom
-
1947 Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
.Top
+ 1;
1948 RtlCopyMemory(lpBuffer
,
1949 Request
.Data
.ReadConsoleOutputRequest
.CharInfo
,
1950 sizeof(CHAR_INFO
) * SizeX
* SizeY
);
1955 BaseSetLastNTError(Request
.Status
);
1958 /* Return the read region */
1959 DPRINT("read region: %lx\n", Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
);
1960 *lpReadRegion
= Request
.Data
.ReadConsoleOutputRequest
.ReadRegion
;
1962 /* Release the capture buffer */
1963 CsrFreeCaptureBuffer(CaptureBuffer
);
1965 /* Return TRUE or FALSE */
1966 return NT_SUCCESS(Request
.Status
);
1969 /*--------------------------------------------------------------
1970 * ReadConsoleOutputA
1976 ReadConsoleOutputA(HANDLE hConsoleOutput
,
1977 PCHAR_INFO lpBuffer
,
1979 COORD dwBufferCoord
,
1980 PSMALL_RECT lpReadRegion
)
1982 return IntReadConsoleOutput(hConsoleOutput
,
1991 /*--------------------------------------------------------------
1992 * ReadConsoleOutputW
1998 ReadConsoleOutputW(HANDLE hConsoleOutput
,
1999 PCHAR_INFO lpBuffer
,
2001 COORD dwBufferCoord
,
2002 PSMALL_RECT lpReadRegion
)
2004 return IntReadConsoleOutput(hConsoleOutput
,
2015 IntWriteConsoleOutput(HANDLE hConsoleOutput
,
2016 CONST CHAR_INFO
*lpBuffer
,
2018 COORD dwBufferCoord
,
2019 PSMALL_RECT lpWriteRegion
,
2022 CSR_API_MESSAGE Request
;
2023 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2026 Size
= dwBufferSize
.Y
* dwBufferSize
.X
* sizeof(CHAR_INFO
);
2028 /* Allocate a Capture Buffer */
2029 DPRINT("IntWriteConsoleOutput: %lx %p\n", Size
, lpWriteRegion
);
2030 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Size
);
2031 if (CaptureBuffer
== NULL
)
2033 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
2034 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2038 /* Allocate space in the Buffer */
2039 CsrCaptureMessageBuffer(CaptureBuffer
,
2042 (PVOID
*)&Request
.Data
.WriteConsoleOutputRequest
.CharInfo
);
2044 /* Copy from the buffer */
2045 RtlCopyMemory(Request
.Data
.WriteConsoleOutputRequest
.CharInfo
, lpBuffer
, Size
);
2047 /* Set up the data to send to the Console Server */
2048 Request
.Data
.WriteConsoleOutputRequest
.ConsoleHandle
= hConsoleOutput
;
2049 Request
.Data
.WriteConsoleOutputRequest
.Unicode
= bUnicode
;
2050 Request
.Data
.WriteConsoleOutputRequest
.BufferSize
= dwBufferSize
;
2051 Request
.Data
.WriteConsoleOutputRequest
.BufferCoord
= dwBufferCoord
;
2052 Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
= *lpWriteRegion
;
2054 /* Call the server */
2055 CsrClientCallServer(&Request
,
2057 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE_OUTPUT
),
2058 sizeof(CSR_API_MESSAGE
));
2059 DPRINT("Server returned: %x\n", Request
.Status
);
2061 /* Check for success*/
2062 if (!NT_SUCCESS(Request
.Status
))
2065 BaseSetLastNTError(Request
.Status
);
2068 /* Return the read region */
2069 DPRINT("read region: %lx\n", Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
);
2070 *lpWriteRegion
= Request
.Data
.WriteConsoleOutputRequest
.WriteRegion
;
2072 /* Release the capture buffer */
2073 CsrFreeCaptureBuffer(CaptureBuffer
);
2075 /* Return TRUE or FALSE */
2076 return NT_SUCCESS(Request
.Status
);
2079 /*--------------------------------------------------------------
2080 * WriteConsoleOutputA
2086 WriteConsoleOutputA(HANDLE hConsoleOutput
,
2087 CONST CHAR_INFO
*lpBuffer
,
2089 COORD dwBufferCoord
,
2090 PSMALL_RECT lpWriteRegion
)
2092 return IntWriteConsoleOutput(hConsoleOutput
,
2101 /*--------------------------------------------------------------
2102 * WriteConsoleOutputW
2108 WriteConsoleOutputW(HANDLE hConsoleOutput
,
2109 CONST CHAR_INFO
*lpBuffer
,
2111 COORD dwBufferCoord
,
2112 PSMALL_RECT lpWriteRegion
)
2114 return IntWriteConsoleOutput(hConsoleOutput
,
2125 IntReadConsoleOutputCharacter(HANDLE hConsoleOutput
,
2129 LPDWORD lpNumberOfCharsRead
,
2132 PCSR_API_MESSAGE Request
;
2135 ULONG SizeBytes
, CharSize
;
2136 DWORD CharsRead
= 0;
2138 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2140 nLength
= min(nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2141 SizeBytes
= nLength
* CharSize
;
2143 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2144 max(sizeof(CSR_API_MESSAGE
),
2145 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2146 if (Request
== NULL
)
2148 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2152 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_CONSOLE_OUTPUT_CHAR
);
2153 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= dwReadCoord
;
2159 Request
->Data
.ReadConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2160 Request
->Data
.ReadConsoleOutputCharRequest
.Unicode
= bUnicode
;
2161 Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
= nLength
;
2162 SizeBytes
= Request
->Data
.ReadConsoleOutputCharRequest
.NumCharsToRead
* CharSize
;
2164 Status
= CsrClientCallServer(Request
,
2167 max(sizeof(CSR_API_MESSAGE
),
2168 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR
) + SizeBytes
));
2169 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2171 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2172 BaseSetLastNTError(Status
);
2176 BytesRead
= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
* CharSize
;
2177 memcpy(lpCharacter
, Request
->Data
.ReadConsoleOutputCharRequest
.String
, BytesRead
);
2178 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)BytesRead
);
2179 CharsRead
+= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2180 nLength
-= Request
->Data
.ReadConsoleOutputCharRequest
.CharsRead
;
2182 Request
->Data
.ReadConsoleOutputCharRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputCharRequest
.EndCoord
;
2185 if (lpNumberOfCharsRead
!= NULL
)
2187 *lpNumberOfCharsRead
= CharsRead
;
2190 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2196 /*--------------------------------------------------------------
2197 * ReadConsoleOutputCharacterA
2203 ReadConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2207 LPDWORD lpNumberOfCharsRead
)
2209 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2213 lpNumberOfCharsRead
,
2218 /*--------------------------------------------------------------
2219 * ReadConsoleOutputCharacterW
2225 ReadConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2229 LPDWORD lpNumberOfCharsRead
)
2231 return IntReadConsoleOutputCharacter(hConsoleOutput
,
2235 lpNumberOfCharsRead
,
2240 /*--------------------------------------------------------------
2241 * ReadConsoleOutputAttribute
2247 ReadConsoleOutputAttribute(HANDLE hConsoleOutput
,
2251 LPDWORD lpNumberOfAttrsRead
)
2253 PCSR_API_MESSAGE Request
;
2258 if (lpNumberOfAttrsRead
!= NULL
)
2259 *lpNumberOfAttrsRead
= nLength
;
2261 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2263 max(sizeof(CSR_API_MESSAGE
),
2264 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
)
2265 + min (nLength
, CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2266 if (Request
== NULL
)
2268 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2272 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, READ_CONSOLE_OUTPUT_ATTRIB
);
2274 while (nLength
!= 0)
2276 Request
->Data
.ReadConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2277 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= dwReadCoord
;
2279 if (nLength
> CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
))
2280 Size
= CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WCHAR
);
2284 Request
->Data
.ReadConsoleOutputAttribRequest
.NumAttrsToRead
= Size
;
2286 Status
= CsrClientCallServer(Request
,
2289 max(sizeof(CSR_API_MESSAGE
),
2290 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2291 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Request
->Status
))
2293 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2294 BaseSetLastNTError(Status
);
2298 memcpy(lpAttribute
, Request
->Data
.ReadConsoleOutputAttribRequest
.Attribute
, Size
* sizeof(WORD
));
2299 lpAttribute
+= Size
;
2301 Request
->Data
.ReadConsoleOutputAttribRequest
.ReadCoord
= Request
->Data
.ReadConsoleOutputAttribRequest
.EndCoord
;
2304 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2312 IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput
,
2316 LPDWORD lpNumberOfCharsWritten
,
2319 PCSR_API_MESSAGE Request
;
2322 ULONG CharSize
, nChars
;
2326 CharSize
= (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
2328 nChars
= min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
);
2329 //SizeBytes = nChars * CharSize;
2331 Request
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
2332 max(sizeof(CSR_API_MESSAGE
),
2333 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
)
2334 + min (nChars
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR
/ CharSize
) * CharSize
));
2335 if (Request
== NULL
)
2337 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2341 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE_OUTPUT_CHAR
);
2342 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= dwWriteCoord
;
2348 Request
->Data
.WriteConsoleOutputCharRequest
.ConsoleHandle
= hConsoleOutput
;
2349 Request
->Data
.WriteConsoleOutputCharRequest
.Unicode
= bUnicode
;
2350 Request
->Data
.WriteConsoleOutputCharRequest
.Length
= (WORD
)min(nLength
, nChars
);
2351 BytesWrite
= Request
->Data
.WriteConsoleOutputCharRequest
.Length
* CharSize
;
2353 memcpy(Request
->Data
.WriteConsoleOutputCharRequest
.String
, lpCharacter
, BytesWrite
);
2355 Status
= CsrClientCallServer(Request
,
2358 max(sizeof(CSR_API_MESSAGE
),
2359 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR
) + BytesWrite
));
2361 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2363 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2364 BaseSetLastNTError(Status
);
2368 nLength
-= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2369 lpCharacter
= (PVOID
)((ULONG_PTR
)lpCharacter
+ (ULONG_PTR
)(Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
* CharSize
));
2370 Written
+= Request
->Data
.WriteConsoleOutputCharRequest
.NrCharactersWritten
;
2372 Request
->Data
.WriteConsoleOutputCharRequest
.Coord
= Request
->Data
.WriteConsoleOutputCharRequest
.EndCoord
;
2375 if (lpNumberOfCharsWritten
!= NULL
)
2377 *lpNumberOfCharsWritten
= Written
;
2380 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2386 /*--------------------------------------------------------------
2387 * WriteConsoleOutputCharacterA
2393 WriteConsoleOutputCharacterA(HANDLE hConsoleOutput
,
2397 LPDWORD lpNumberOfCharsWritten
)
2399 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2403 lpNumberOfCharsWritten
,
2408 /*--------------------------------------------------------------
2409 * WriteConsoleOutputCharacterW
2415 WriteConsoleOutputCharacterW(HANDLE hConsoleOutput
,
2416 LPCWSTR lpCharacter
,
2419 LPDWORD lpNumberOfCharsWritten
)
2421 return IntWriteConsoleOutputCharacter(hConsoleOutput
,
2425 lpNumberOfCharsWritten
,
2430 /*--------------------------------------------------------------
2431 * WriteConsoleOutputAttribute
2437 WriteConsoleOutputAttribute(HANDLE hConsoleOutput
,
2438 CONST WORD
*lpAttribute
,
2441 LPDWORD lpNumberOfAttrsWritten
)
2443 PCSR_API_MESSAGE Request
;
2448 Request
= RtlAllocateHeap(RtlGetProcessHeap(),
2450 max(sizeof(CSR_API_MESSAGE
),
2451 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
)
2452 + min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
)) * sizeof(WORD
)));
2453 if (Request
== NULL
)
2455 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2459 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_CONSOLE
, WRITE_CONSOLE_OUTPUT_ATTRIB
);
2460 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= dwWriteCoord
;
2462 if (lpNumberOfAttrsWritten
)
2463 *lpNumberOfAttrsWritten
= nLength
;
2466 Size
= (WORD
)min(nLength
, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB
/ sizeof(WORD
));
2467 Request
->Data
.WriteConsoleOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2468 Request
->Data
.WriteConsoleOutputAttribRequest
.Length
= Size
;
2469 memcpy(Request
->Data
.WriteConsoleOutputAttribRequest
.Attribute
, lpAttribute
, Size
* sizeof(WORD
));
2471 Status
= CsrClientCallServer(Request
,
2474 max(sizeof(CSR_API_MESSAGE
),
2475 CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB
) + Size
* sizeof(WORD
)));
2477 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
->Status
))
2479 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2480 BaseSetLastNTError (Status
);
2484 lpAttribute
+= Size
;
2485 Request
->Data
.WriteConsoleOutputAttribRequest
.Coord
= Request
->Data
.WriteConsoleOutputAttribRequest
.EndCoord
;
2488 RtlFreeHeap(RtlGetProcessHeap(), 0, Request
);
2494 /*--------------------------------------------------------------
2495 * FillConsoleOutputAttribute
2501 FillConsoleOutputAttribute(HANDLE hConsoleOutput
,
2505 LPDWORD lpNumberOfAttrsWritten
)
2507 CSR_API_MESSAGE Request
;
2510 Request
.Data
.FillOutputAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2511 Request
.Data
.FillOutputAttribRequest
.Attribute
= (CHAR
)wAttribute
;
2512 Request
.Data
.FillOutputAttribRequest
.Coord
= dwWriteCoord
;
2513 Request
.Data
.FillOutputAttribRequest
.Length
= (WORD
)nLength
;
2515 Status
= CsrClientCallServer(&Request
,
2517 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, FILL_OUTPUT_ATTRIB
),
2518 sizeof(CSR_API_MESSAGE
));
2519 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2521 BaseSetLastNTError ( Status
);
2525 if (lpNumberOfAttrsWritten
)
2526 *lpNumberOfAttrsWritten
= nLength
;
2532 /*--------------------------------------------------------------
2539 GetConsoleMode(HANDLE hConsoleHandle
,
2542 CSR_API_MESSAGE Request
;
2545 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2547 Status
= CsrClientCallServer(&Request
,
2549 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_MODE
),
2550 sizeof(CSR_API_MESSAGE
));
2551 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2553 BaseSetLastNTError(Status
);
2557 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
2563 /*--------------------------------------------------------------
2564 * GetNumberOfConsoleInputEvents
2570 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
2571 LPDWORD lpNumberOfEvents
)
2573 CSR_API_MESSAGE Request
;
2576 if (lpNumberOfEvents
== NULL
)
2578 SetLastError(ERROR_INVALID_PARAMETER
);
2582 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
2584 Status
= CsrClientCallServer(&Request
,
2586 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_NUM_INPUT_EVENTS
),
2587 sizeof(CSR_API_MESSAGE
));
2588 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2590 BaseSetLastNTError(Status
);
2594 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
2600 /*--------------------------------------------------------------
2601 * GetLargestConsoleWindowSize
2607 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
2609 COORD Coord
= {80,25};
2610 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
2611 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2616 /*--------------------------------------------------------------
2617 * GetConsoleCursorInfo
2623 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
2624 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
2626 CSR_API_MESSAGE Request
;
2629 if (!lpConsoleCursorInfo
)
2631 if (!hConsoleOutput
)
2632 SetLastError(ERROR_INVALID_HANDLE
);
2634 SetLastError(ERROR_INVALID_ACCESS
);
2639 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2641 Status
= CsrClientCallServer(&Request
,
2643 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CURSOR_INFO
),
2644 sizeof(CSR_API_MESSAGE
));
2645 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2647 BaseSetLastNTError(Status
);
2651 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
2657 /*--------------------------------------------------------------
2658 * GetNumberOfConsoleMouseButtons
2664 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
2666 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
2667 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2672 /*--------------------------------------------------------------
2679 SetConsoleMode(HANDLE hConsoleHandle
,
2682 CSR_API_MESSAGE Request
;
2685 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
2686 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
2688 Status
= CsrClientCallServer(&Request
,
2690 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_MODE
),
2691 sizeof(CSR_API_MESSAGE
));
2692 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2694 BaseSetLastNTError(Status
);
2702 /*--------------------------------------------------------------
2703 * SetConsoleActiveScreenBuffer
2709 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
2711 CSR_API_MESSAGE Request
;
2714 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
2716 Status
= CsrClientCallServer(&Request
,
2718 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_SCREEN_BUFFER
),
2719 sizeof(CSR_API_MESSAGE
));
2720 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2722 BaseSetLastNTError(Status
);
2730 /*--------------------------------------------------------------
2731 * FlushConsoleInputBuffer
2737 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
2739 CSR_API_MESSAGE Request
;
2742 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
2744 Status
= CsrClientCallServer(&Request
,
2746 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, FLUSH_INPUT_BUFFER
),
2747 sizeof(CSR_API_MESSAGE
));
2748 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2750 BaseSetLastNTError(Status
);
2758 /*--------------------------------------------------------------
2759 * SetConsoleScreenBufferSize
2765 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
2768 CSR_API_MESSAGE Request
;
2771 Request
.Data
.SetScreenBufferSize
.OutputHandle
= hConsoleOutput
;
2772 Request
.Data
.SetScreenBufferSize
.Size
= dwSize
;
2774 Status
= CsrClientCallServer(&Request
,
2776 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_SCREEN_BUFFER_SIZE
),
2777 sizeof(CSR_API_MESSAGE
));
2778 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2780 BaseSetLastNTError(Status
);
2787 /*--------------------------------------------------------------
2788 * SetConsoleCursorInfo
2794 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
2795 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
2797 CSR_API_MESSAGE Request
;
2800 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
2801 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
2803 Status
= CsrClientCallServer(&Request
,
2805 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CURSOR_INFO
),
2806 sizeof(CSR_API_MESSAGE
));
2807 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2809 BaseSetLastNTError(Status
);
2819 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
2820 const SMALL_RECT
*lpScrollRectangle
,
2821 const SMALL_RECT
*lpClipRectangle
,
2822 COORD dwDestinationOrigin
,
2823 const CHAR_INFO
*lpFill
,
2826 CSR_API_MESSAGE Request
;
2829 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
2830 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
2831 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
2833 if (lpClipRectangle
!= NULL
)
2835 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
2836 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
2840 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
2843 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
2844 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
2846 Status
= CsrClientCallServer(&Request
,
2848 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SCROLL_CONSOLE_SCREEN_BUFFER
),
2849 sizeof(CSR_API_MESSAGE
));
2851 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2853 BaseSetLastNTError(Status
);
2861 /*--------------------------------------------------------------
2862 * ScrollConsoleScreenBufferA
2868 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
2869 CONST SMALL_RECT
*lpScrollRectangle
,
2870 CONST SMALL_RECT
*lpClipRectangle
,
2871 COORD dwDestinationOrigin
,
2872 CONST CHAR_INFO
*lpFill
)
2874 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2875 (PSMALL_RECT
)lpScrollRectangle
,
2876 (PSMALL_RECT
)lpClipRectangle
,
2877 dwDestinationOrigin
,
2883 /*--------------------------------------------------------------
2884 * ScrollConsoleScreenBufferW
2890 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
2891 CONST SMALL_RECT
*lpScrollRectangle
,
2892 CONST SMALL_RECT
*lpClipRectangle
,
2893 COORD dwDestinationOrigin
,
2894 CONST CHAR_INFO
*lpFill
)
2896 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
2899 dwDestinationOrigin
,
2905 /*--------------------------------------------------------------
2906 * SetConsoleWindowInfo
2912 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
2914 CONST SMALL_RECT
*lpConsoleWindow
)
2916 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
2917 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
2922 /*--------------------------------------------------------------
2923 * SetConsoleTextAttribute
2929 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
2932 CSR_API_MESSAGE Request
;
2935 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
2936 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
2938 Status
= CsrClientCallServer(&Request
,
2940 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_ATTRIB
),
2941 sizeof(CSR_API_MESSAGE
));
2942 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
2944 BaseSetLastNTError(Status
);
2954 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2956 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
2958 if (HandlerRoutine
== NULL
)
2960 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
2964 if (NrCtrlHandlers
== NrAllocatedHandlers
)
2966 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
2968 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
2969 if (NewCtrlHandlers
== NULL
)
2971 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2975 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
2977 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
2979 CtrlHandlers
= NewCtrlHandlers
;
2980 NrAllocatedHandlers
+= 4;
2983 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
2985 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
2992 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
2996 if (HandlerRoutine
== NULL
)
2998 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
3002 for (i
= 0; i
< NrCtrlHandlers
; i
++)
3004 if (CtrlHandlers
[i
] == HandlerRoutine
)
3006 if (i
< (NrCtrlHandlers
- 1))
3008 memmove(&CtrlHandlers
[i
],
3010 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
3018 SetLastError(ERROR_INVALID_PARAMETER
);
3028 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
3033 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
3036 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
3040 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
3043 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
3048 /*--------------------------------------------------------------
3049 * GenerateConsoleCtrlEvent
3055 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
3056 DWORD dwProcessGroupId
)
3058 CSR_API_MESSAGE Request
;
3061 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
3063 SetLastError(ERROR_INVALID_PARAMETER
);
3067 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
3068 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
3070 Status
= CsrClientCallServer(&Request
,
3072 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GENERATE_CTRL_EVENT
),
3073 sizeof(CSR_API_MESSAGE
));
3074 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3076 BaseSetLastNTError(Status
);
3085 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD nSize
, BOOL bUnicode
)
3087 CSR_API_MESSAGE Request
;
3088 PCSR_CAPTURE_BUFFER CaptureBuffer
;
3094 Request
.Data
.GetTitleRequest
.Length
= nSize
* (bUnicode
? 1 : sizeof(WCHAR
));
3095 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.GetTitleRequest
.Length
);
3096 if (CaptureBuffer
== NULL
)
3098 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
3099 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3103 CsrAllocateMessagePointer(CaptureBuffer
,
3104 Request
.Data
.GetTitleRequest
.Length
,
3105 (PVOID
*)&Request
.Data
.GetTitleRequest
.Title
);
3107 Status
= CsrClientCallServer(&Request
,
3109 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_TITLE
),
3110 sizeof(CSR_API_MESSAGE
));
3111 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
3113 CsrFreeCaptureBuffer(CaptureBuffer
);
3114 BaseSetLastNTError(Status
);
3120 if (nSize
>= sizeof(WCHAR
))
3121 wcscpy((LPWSTR
)lpConsoleTitle
, Request
.Data
.GetTitleRequest
.Title
);
3125 if (nSize
< Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
) ||
3126 !WideCharToMultiByte(CP_ACP
, // ANSI code page
3127 0, // performance and mapping flags
3128 Request
.Data
.GetTitleRequest
.Title
, // address of wide-character string
3129 -1, // number of characters in string
3130 (LPSTR
)lpConsoleTitle
, // address of buffer for new string
3131 nSize
, // size of buffer
3135 /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
3136 *(LPSTR
)lpConsoleTitle
= '\0';
3137 Request
.Data
.GetTitleRequest
.Length
= 0;
3140 CsrFreeCaptureBuffer(CaptureBuffer
);
3142 return Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
);
3145 /*--------------------------------------------------------------
3152 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
3155 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
3158 /*--------------------------------------------------------------
3167 GetConsoleTitleA(LPSTR lpConsoleTitle
,
3170 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
3174 /*--------------------------------------------------------------
3181 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
3183 CSR_API_MESSAGE Request
;
3184 PCSR_CAPTURE_BUFFER CaptureBuffer
;
3187 Request
.Data
.SetTitleRequest
.Length
= wcslen(lpConsoleTitle
) * sizeof(WCHAR
);
3189 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.SetTitleRequest
.Length
);
3190 if (CaptureBuffer
== NULL
)
3192 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
3193 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3197 CsrCaptureMessageBuffer(CaptureBuffer
,
3198 (PVOID
)lpConsoleTitle
,
3199 Request
.Data
.SetTitleRequest
.Length
,
3200 (PVOID
*)&Request
.Data
.SetTitleRequest
.Title
);
3202 Status
= CsrClientCallServer(&Request
,
3204 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_TITLE
),
3205 sizeof(CSR_API_MESSAGE
));
3207 CsrFreeCaptureBuffer(CaptureBuffer
);
3209 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3211 BaseSetLastNTError(Status
);
3219 /*--------------------------------------------------------------
3228 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
3230 ULONG Length
= strlen(lpConsoleTitle
) + 1;
3231 LPWSTR WideTitle
= HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
3235 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3238 MultiByteToWideChar(CP_ACP
, 0, lpConsoleTitle
, -1, WideTitle
, Length
);
3239 Ret
= SetConsoleTitleW(WideTitle
);
3240 HeapFree(GetProcessHeap(), 0, WideTitle
);
3245 /*--------------------------------------------------------------
3246 * CreateConsoleScreenBuffer
3252 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
3254 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
3256 LPVOID lpScreenBufferData
)
3258 CSR_API_MESSAGE Request
;
3261 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
3262 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
3263 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
3265 SetLastError(ERROR_INVALID_PARAMETER
);
3266 return INVALID_HANDLE_VALUE
;
3269 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
3270 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
3271 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
3272 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
3274 Status
= CsrClientCallServer(&Request
,
3276 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, CREATE_SCREEN_BUFFER
),
3277 sizeof(CSR_API_MESSAGE
));
3278 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3280 BaseSetLastNTError(Status
);
3281 return INVALID_HANDLE_VALUE
;
3283 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
3287 /*--------------------------------------------------------------
3296 CSR_API_MESSAGE Request
;
3299 Status
= CsrClientCallServer(&Request
,
3301 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_CP
),
3302 sizeof(CSR_API_MESSAGE
));
3303 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3305 BaseSetLastNTError (Status
);
3309 return Request
.Data
.GetConsoleCodePage
.CodePage
;
3313 /*--------------------------------------------------------------
3320 SetConsoleCP(UINT wCodePageID
)
3322 CSR_API_MESSAGE Request
;
3325 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
3327 Status
= CsrClientCallServer(&Request
,
3329 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_CP
),
3330 sizeof(CSR_API_MESSAGE
));
3331 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3333 BaseSetLastNTError(Status
);
3336 return NT_SUCCESS(Status
);
3340 /*--------------------------------------------------------------
3341 * GetConsoleOutputCP
3347 GetConsoleOutputCP(VOID
)
3349 CSR_API_MESSAGE Request
;
3352 Status
= CsrClientCallServer(&Request
,
3354 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_OUTPUT_CP
),
3355 sizeof(CSR_API_MESSAGE
));
3356 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3358 BaseSetLastNTError (Status
);
3362 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
3366 /*--------------------------------------------------------------
3367 * SetConsoleOutputCP
3373 SetConsoleOutputCP(UINT wCodePageID
)
3375 CSR_API_MESSAGE Request
;
3378 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
3380 Status
= CsrClientCallServer(&Request
,
3382 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_OUTPUT_CP
),
3383 sizeof(CSR_API_MESSAGE
));
3384 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3386 BaseSetLastNTError(Status
);
3389 return NT_SUCCESS(Status
);
3393 /*--------------------------------------------------------------
3394 * GetConsoleProcessList
3400 GetConsoleProcessList(LPDWORD lpdwProcessList
,
3401 DWORD dwProcessCount
)
3403 PCSR_CAPTURE_BUFFER CaptureBuffer
;
3404 CSR_API_MESSAGE Request
;
3408 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
3410 SetLastError(ERROR_INVALID_PARAMETER
);
3414 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
3415 if (CaptureBuffer
== NULL
)
3417 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
3418 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
3422 Request
.Data
.GetProcessListRequest
.nMaxIds
= dwProcessCount
;
3423 CsrAllocateMessagePointer(CaptureBuffer
,
3424 dwProcessCount
* sizeof(DWORD
),
3425 (PVOID
*)&Request
.Data
.GetProcessListRequest
.ProcessId
);
3427 Status
= CsrClientCallServer(&Request
,
3429 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_PROCESS_LIST
),
3430 sizeof(CSR_API_MESSAGE
));
3431 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3433 BaseSetLastNTError (Status
);
3438 nProcesses
= Request
.Data
.GetProcessListRequest
.nProcessIdsTotal
;
3439 if (dwProcessCount
>= nProcesses
)
3441 memcpy(lpdwProcessList
, Request
.Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
3445 CsrFreeCaptureBuffer(CaptureBuffer
);
3451 /*--------------------------------------------------------------
3452 * GetConsoleSelectionInfo
3458 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
3460 CSR_API_MESSAGE Request
;
3461 NTSTATUS Status
= CsrClientCallServer(&Request
,
3463 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_SELECTION_INFO
),
3464 sizeof(CSR_API_MESSAGE
));
3465 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3467 BaseSetLastNTError(Status
);
3471 *lpConsoleSelectionInfo
= Request
.Data
.GetConsoleSelectionInfo
.Info
;
3477 /*--------------------------------------------------------------
3484 AttachConsole(DWORD dwProcessId
)
3486 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
3490 /*--------------------------------------------------------------
3497 GetConsoleWindow(VOID
)
3499 CSR_API_MESSAGE Request
;
3502 Status
= CsrClientCallServer(&Request
,
3504 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_WINDOW
),
3505 sizeof(CSR_API_MESSAGE
));
3506 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3508 BaseSetLastNTError(Status
);
3512 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
3516 /*--------------------------------------------------------------
3523 SetConsoleIcon(HICON hicon
)
3525 CSR_API_MESSAGE Request
;
3528 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
3530 Status
= CsrClientCallServer(&Request
,
3532 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_ICON
),
3533 sizeof(CSR_API_MESSAGE
));
3534 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
3536 BaseSetLastNTError(Status
);
3540 return NT_SUCCESS(Status
);
3544 /******************************************************************************
3545 * \name SetConsoleInputExeNameW
3546 * \brief Sets the console input file name from a unicode string.
3547 * \param lpInputExeName Pointer to a unicode string with the name.
3548 * \return TRUE if successful, FALSE if unsuccsedful.
3549 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3550 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3554 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
3559 || (lenName
= lstrlenW(lpInputExeName
)) == 0
3560 || lenName
> INPUTEXENAME_BUFLEN
- 1)
3562 /* Fail if string is empty or too long */
3563 SetLastError(ERROR_INVALID_PARAMETER
);
3567 RtlEnterCriticalSection(&ConsoleLock
);
3570 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
3571 InputExeName
[lenName
] = L
'\0';
3575 RtlLeaveCriticalSection(&ConsoleLock
);
3583 /******************************************************************************
3584 * \name SetConsoleInputExeNameA
3585 * \brief Sets the console input file name from an ansi string.
3586 * \param lpInputExeName Pointer to an ansi string with the name.
3587 * \return TRUE if successful, FALSE if unsuccsedful.
3588 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
3589 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
3593 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
3595 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3596 ANSI_STRING InputExeNameA
;
3597 UNICODE_STRING InputExeNameU
;
3601 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
3603 if(InputExeNameA
.Length
== 0 ||
3604 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
3606 /* Fail if string is empty or too long */
3607 SetLastError(ERROR_INVALID_PARAMETER
);
3611 InputExeNameU
.Buffer
= Buffer
;
3612 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
3613 InputExeNameU
.Length
= 0;
3614 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
3615 if(NT_SUCCESS(Status
))
3617 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
3621 BaseSetLastNTError(Status
);
3629 /******************************************************************************
3630 * \name GetConsoleInputExeNameW
3631 * \brief Retrieves the console input file name as unicode string.
3632 * \param nBufferLength Length of the buffer in WCHARs.
3633 * Specify 0 to recieve the needed buffer length.
3634 * \param lpBuffer Pointer to a buffer that recieves the string.
3635 * \return Needed buffer size if \p nBufferLength is 0.
3636 * Otherwise 1 if successful, 2 if buffer is too small.
3637 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3638 * is not big enough.
3642 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
3644 int lenName
= lstrlenW(InputExeName
);
3646 if (nBufferLength
== 0)
3648 /* Buffer size is requested, return it */
3652 if(lenName
+ 1 > nBufferLength
)
3654 /* Buffer is not large enough! */
3655 SetLastError(ERROR_BUFFER_OVERFLOW
);
3659 RtlEnterCriticalSection(&ConsoleLock
);
3662 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
3663 lpBuffer
[lenName
] = '\0';
3667 RtlLeaveCriticalSection(&ConsoleLock
);
3671 /* Success, return 1 */
3676 /******************************************************************************
3677 * \name GetConsoleInputExeNameA
3678 * \brief Retrieves the console input file name as ansi string.
3679 * \param nBufferLength Length of the buffer in CHARs.
3680 * \param lpBuffer Pointer to a buffer that recieves the string.
3681 * \return 1 if successful, 2 if buffer is too small.
3682 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
3683 * is not big enough. The buffer recieves as much characters as fit.
3687 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
3689 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
3691 UNICODE_STRING BufferU
;
3692 ANSI_STRING BufferA
;
3694 /* Get the unicode name */
3695 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
3697 /* Initialize strings for conversion */
3698 RtlInitUnicodeString(&BufferU
, Buffer
);
3700 BufferA
.MaximumLength
= nBufferLength
;
3701 BufferA
.Buffer
= lpBuffer
;
3703 /* Convert unicode name to ansi, copying as much chars as fit */
3704 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
3706 /* Error handling */
3707 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
3709 SetLastError(ERROR_BUFFER_OVERFLOW
);
3718 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
3726 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
3734 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
3743 ReadConsoleInputExA(HANDLE hConsole
, LPVOID lpBuffer
, DWORD dwLen
, LPDWORD Unknown1
, DWORD Unknown2
)
3751 ReadConsoleInputExW(HANDLE hConsole
, LPVOID lpBuffer
, DWORD dwLen
, LPDWORD Unknown1
, DWORD Unknown2
)
3759 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
3767 RegisterConsoleOS2(BOOL bUnknown
)
3775 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
3783 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
3791 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
3799 SetConsoleOS2OemFormat(BOOL bUnknown
)
3807 UnregisterConsoleIME(VOID
)
3817 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
3826 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
3837 SetLastConsoleEventActive(VOID
)
3848 SetConsoleCommandHistoryMode(IN DWORD dwMode
)