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
);
71 ConsoleControlDispatcher(IN LPVOID lpThreadParameter
)
74 DWORD CodeAndFlag
= PtrToUlong(lpThreadParameter
);
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
);
122 case CTRL_CLOSE_EVENT
:
123 case CTRL_LOGOFF_EVENT
:
124 case CTRL_SHUTDOWN_EVENT
:
132 ExitProcess(CONTROL_C_EXIT
);
140 ASSERT(ConsoleInitialized
);
142 RtlEnterCriticalSection(&ConsoleLock
);
144 if ((nCode
!= CTRL_C_EVENT
) || (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
146 for (i
= NrCtrlHandlers
; i
> 0; i
--)
149 (CodeAndFlag
& MINLONG
) &&
150 ((nCode
== CTRL_LOGOFF_EVENT
) || (nCode
== CTRL_SHUTDOWN_EVENT
)))
152 DPRINT("Skipping system/service apps\n");
156 if (CtrlHandlers
[i
- 1](nCode
))
160 case CTRL_CLOSE_EVENT
:
161 case CTRL_LOGOFF_EVENT
:
162 case CTRL_SHUTDOWN_EVENT
:
164 nExitCode
= CodeAndFlag
;
172 RtlLeaveCriticalSection(&ConsoleLock
);
173 ExitThread(nExitCode
);
174 return STATUS_SUCCESS
;
178 /* FUNCTIONS ******************************************************************/
181 * @unimplemented (Undocumented)
185 ConsoleMenuControl(HANDLE hConsole
,
189 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
190 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
200 DuplicateConsoleHandle(HANDLE hConsole
,
201 DWORD dwDesiredAccess
,
205 CSR_API_MESSAGE Request
;
208 if (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)
209 || (!(dwOptions
& DUPLICATE_SAME_ACCESS
)
210 && dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)))
212 SetLastError (ERROR_INVALID_PARAMETER
);
213 return INVALID_HANDLE_VALUE
;
216 Request
.Data
.DuplicateHandleRequest
.Handle
= hConsole
;
217 Request
.Data
.DuplicateHandleRequest
.Access
= dwDesiredAccess
;
218 Request
.Data
.DuplicateHandleRequest
.Inheritable
= bInheritHandle
;
219 Request
.Data
.DuplicateHandleRequest
.Options
= dwOptions
;
221 Status
= CsrClientCallServer(&Request
,
223 CSR_CREATE_API_NUMBER(CSR_NATIVE
, DUPLICATE_HANDLE
),
224 sizeof(CSR_API_MESSAGE
));
225 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
=Request
.Status
))
227 BaseSetLastNTError(Status
);
228 return INVALID_HANDLE_VALUE
;
231 return Request
.Data
.DuplicateHandleRequest
.Handle
;
240 GetConsoleDisplayMode(LPDWORD lpdwMode
)
242 * FUNCTION: Get the console display mode
244 * lpdwMode - Address of variable that receives the current value
246 * STATUS: Undocumented
249 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
250 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
256 * @unimplemented (Undocumented)
260 GetConsoleFontInfo(DWORD Unknown0
,
265 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
266 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
276 GetConsoleFontSize(HANDLE hConsoleOutput
,
279 COORD Empty
= {0, 0};
280 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
281 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
287 * @implemented (Undocumented)
291 GetConsoleHardwareState(HANDLE hConsole
,
295 CSR_API_MESSAGE Request
;
298 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
299 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_GET
;
301 Status
= CsrClientCallServer(&Request
,
303 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SETGET_CONSOLE_HW_STATE
),
304 sizeof(CSR_API_MESSAGE
));
305 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
307 BaseSetLastNTError(Status
);
311 *State
= Request
.Data
.ConsoleHardwareStateRequest
.State
;
317 * @implemented (Undocumented)
321 GetConsoleInputWaitHandle(VOID
)
323 CSR_API_MESSAGE Request
;
326 Status
= CsrClientCallServer(&Request
,
328 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_INPUT_WAIT_HANDLE
),
329 sizeof(CSR_API_MESSAGE
));
330 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
332 BaseSetLastNTError(Status
);
336 return Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
345 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
347 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
349 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
350 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
356 * @unimplemented (Undocumented)
360 GetNumberOfConsoleFonts(VOID
)
362 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
363 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
364 return 1; /* FIXME: call csrss.exe */
369 * @unimplemented (Undocumented)
373 InvalidateConsoleDIBits(DWORD Unknown0
,
376 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
377 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
383 * @unimplemented (Undocumented)
387 OpenConsoleW(LPCWSTR wsName
,
388 DWORD dwDesiredAccess
,
392 CSR_API_MESSAGE Request
;
394 NTSTATUS Status
= STATUS_SUCCESS
;
396 if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONIN$"))
398 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_NATIVE
, GET_INPUT_HANDLE
);
400 else if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONOUT$"))
402 CsrRequest
= CSR_CREATE_API_NUMBER(CSR_NATIVE
, GET_OUTPUT_HANDLE
);
406 SetLastError(ERROR_INVALID_PARAMETER
);
407 return(INVALID_HANDLE_VALUE
);
410 if (dwDesiredAccess
& ~(GENERIC_READ
|GENERIC_WRITE
))
412 SetLastError(ERROR_INVALID_PARAMETER
);
413 return(INVALID_HANDLE_VALUE
);
416 if (dwShareMode
& ~(FILE_SHARE_READ
|FILE_SHARE_WRITE
))
418 SetLastError(ERROR_INVALID_PARAMETER
);
419 return(INVALID_HANDLE_VALUE
);
422 /* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
423 Request
.Data
.GetInputHandleRequest
.Access
= dwDesiredAccess
;
424 Request
.Data
.GetInputHandleRequest
.Inheritable
= bInheritHandle
;
425 Request
.Data
.GetInputHandleRequest
.ShareMode
= dwShareMode
;
427 Status
= CsrClientCallServer(&Request
,
430 sizeof(CSR_API_MESSAGE
));
431 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
433 BaseSetLastNTError(Status
);
434 return INVALID_HANDLE_VALUE
;
437 return Request
.Data
.GetInputHandleRequest
.Handle
;
442 * @unimplemented (Undocumented)
446 SetConsoleCursor(DWORD Unknown0
,
449 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
450 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
460 SetConsoleDisplayMode(HANDLE hOut
,
464 * FUNCTION: Set the console display mode.
466 * hOut - Standard output handle.
467 * dwNewMode - New mode.
468 * lpdwOldMode - Address of a variable that receives the old mode.
471 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
472 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
478 * @unimplemented (Undocumented)
482 SetConsoleFont(DWORD Unknown0
,
485 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
486 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
492 * @implemented (Undocumented)
496 SetConsoleHardwareState(HANDLE hConsole
,
500 CSR_API_MESSAGE Request
;
503 Request
.Data
.ConsoleHardwareStateRequest
.ConsoleHandle
= hConsole
;
504 Request
.Data
.ConsoleHardwareStateRequest
.SetGet
= CONSOLE_HARDWARE_STATE_SET
;
505 Request
.Data
.ConsoleHardwareStateRequest
.State
= State
;
507 Status
= CsrClientCallServer(&Request
,
509 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SETGET_CONSOLE_HW_STATE
),
510 sizeof(CSR_API_MESSAGE
));
511 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
513 BaseSetLastNTError(Status
);
522 * @unimplemented (Undocumented)
526 SetConsoleKeyShortcuts(DWORD Unknown0
,
531 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
532 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
538 * @unimplemented (Undocumented)
542 SetConsoleMaximumWindowSize(DWORD Unknown0
,
545 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
546 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
552 * @unimplemented (Undocumented)
556 SetConsoleMenuClose(DWORD Unknown0
)
558 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
559 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
565 * @unimplemented (Undocumented)
569 SetConsolePalette(DWORD Unknown0
,
573 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
574 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
579 * @unimplemented (Undocumented)
583 ShowConsoleCursor(DWORD Unknown0
,
586 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
587 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
593 * FUNCTION: Checks whether the given handle is a valid console handle.
595 * Handle - Handle to be checked
597 * TRUE: Handle is a valid console handle
598 * FALSE: Handle is not a valid console handle.
599 * STATUS: Officially undocumented
605 VerifyConsoleIoHandle(HANDLE Handle
)
607 CSR_API_MESSAGE Request
;
610 Request
.Data
.VerifyHandleRequest
.Handle
= Handle
;
612 Status
= CsrClientCallServer(&Request
,
614 CSR_CREATE_API_NUMBER(CSR_NATIVE
, VERIFY_HANDLE
),
615 sizeof(CSR_API_MESSAGE
));
616 if (!NT_SUCCESS(Status
))
618 BaseSetLastNTError(Status
);
622 return (BOOL
)NT_SUCCESS(Request
.Status
);
631 WriteConsoleInputVDMA(DWORD Unknown0
,
636 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
637 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
647 WriteConsoleInputVDMW(DWORD Unknown0
,
652 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
653 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
659 * @implemented (Undocumented)
663 CloseConsoleHandle(HANDLE Handle
)
665 CSR_API_MESSAGE Request
;
668 Request
.Data
.CloseHandleRequest
.Handle
= Handle
;
670 Status
= CsrClientCallServer(&Request
,
672 CSR_CREATE_API_NUMBER(CSR_NATIVE
, CLOSE_HANDLE
),
673 sizeof(CSR_API_MESSAGE
));
674 if (!NT_SUCCESS(Status
))
676 BaseSetLastNTError(Status
);
688 GetStdHandle(DWORD nStdHandle
)
690 * FUNCTION: Get a handle for the standard input, standard output
691 * and a standard error device.
693 * nStdHandle - Specifies the device for which to return the handle.
694 * RETURNS: If the function succeeds, the return value is the handle
695 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
698 PRTL_USER_PROCESS_PARAMETERS Ppb
;
700 Ppb
= NtCurrentPeb()->ProcessParameters
;
703 case STD_INPUT_HANDLE
:
704 return Ppb
->StandardInput
;
706 case STD_OUTPUT_HANDLE
:
707 return Ppb
->StandardOutput
;
709 case STD_ERROR_HANDLE
:
710 return Ppb
->StandardError
;
713 SetLastError (ERROR_INVALID_PARAMETER
);
714 return INVALID_HANDLE_VALUE
;
723 SetStdHandle(DWORD nStdHandle
,
726 * FUNCTION: Set the handle for the standard input, standard output or
727 * the standard error device.
729 * nStdHandle - Specifies the handle to be set.
730 * hHandle - The handle to set.
731 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
734 PRTL_USER_PROCESS_PARAMETERS Ppb
;
736 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
738 Ppb
= NtCurrentPeb()->ProcessParameters
;
742 case STD_INPUT_HANDLE
:
743 Ppb
->StandardInput
= hHandle
;
746 case STD_OUTPUT_HANDLE
:
747 Ppb
->StandardOutput
= hHandle
;
750 case STD_ERROR_HANDLE
:
751 Ppb
->StandardError
= hHandle
;
755 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
756 SetLastError(ERROR_INVALID_HANDLE
);
761 /*--------------------------------------------------------------
770 CSR_API_MESSAGE Request
;
775 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
777 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
778 BaseSetLastNTError (STATUS_OBJECT_NAME_EXISTS
);
784 Request
.Data
.AllocConsoleRequest
.CtrlDispatcher
= ConsoleControlDispatcher
;
785 Request
.Data
.AllocConsoleRequest
.ConsoleNeeded
= TRUE
;
786 Request
.Data
.AllocConsoleRequest
.ShowCmd
= si
.wShowWindow
;
788 Status
= CsrClientCallServer(&Request
,
790 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, ALLOC_CONSOLE
),
791 sizeof(CSR_API_MESSAGE
));
792 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
794 BaseSetLastNTError(Status
);
798 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= Request
.Data
.AllocConsoleRequest
.Console
;
800 SetStdHandle(STD_INPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.InputHandle
);
801 SetStdHandle(STD_OUTPUT_HANDLE
, Request
.Data
.AllocConsoleRequest
.OutputHandle
);
803 hStdError
= DuplicateConsoleHandle(Request
.Data
.AllocConsoleRequest
.OutputHandle
,
806 DUPLICATE_SAME_ACCESS
);
808 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
813 /*--------------------------------------------------------------
822 // AG: I'm not sure if this is correct (what happens to std handles?)
823 // but I just tried to reverse what AllocConsole() does...
825 CSR_API_MESSAGE Request
;
828 Status
= CsrClientCallServer(&Request
,
830 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, FREE_CONSOLE
),
831 sizeof(CSR_API_MESSAGE
));
832 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
834 BaseSetLastNTError(Status
);
838 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
843 /*--------------------------------------------------------------
844 * GetConsoleScreenBufferInfo
850 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
851 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
853 CSR_API_MESSAGE Request
;
856 Request
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
858 Status
= CsrClientCallServer(&Request
,
860 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SCREEN_BUFFER_INFO
),
861 sizeof(CSR_API_MESSAGE
));
862 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
864 BaseSetLastNTError(Status
);
867 *lpConsoleScreenBufferInfo
= Request
.Data
.ScreenBufferInfoRequest
.Info
;
872 /*--------------------------------------------------------------
873 * SetConsoleCursorPosition
879 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
880 COORD dwCursorPosition
)
882 CSR_API_MESSAGE Request
;
885 Request
.Data
.SetCursorRequest
.ConsoleHandle
= hConsoleOutput
;
886 Request
.Data
.SetCursorRequest
.Position
= dwCursorPosition
;
888 Status
= CsrClientCallServer(&Request
,
890 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CURSOR
),
891 sizeof(CSR_API_MESSAGE
));
892 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
894 BaseSetLastNTError(Status
);
902 /*--------------------------------------------------------------
909 GetConsoleMode(HANDLE hConsoleHandle
,
912 CSR_API_MESSAGE Request
;
915 Request
.Data
.GetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
917 Status
= CsrClientCallServer(&Request
,
919 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_MODE
),
920 sizeof(CSR_API_MESSAGE
));
921 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
923 BaseSetLastNTError(Status
);
927 *lpMode
= Request
.Data
.GetConsoleModeRequest
.ConsoleMode
;
933 /*--------------------------------------------------------------
934 * GetNumberOfConsoleInputEvents
940 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
941 LPDWORD lpNumberOfEvents
)
943 CSR_API_MESSAGE Request
;
946 if (lpNumberOfEvents
== NULL
)
948 SetLastError(ERROR_INVALID_PARAMETER
);
952 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
954 Status
= CsrClientCallServer(&Request
,
956 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_NUM_INPUT_EVENTS
),
957 sizeof(CSR_API_MESSAGE
));
958 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
960 BaseSetLastNTError(Status
);
964 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
970 /*--------------------------------------------------------------
971 * GetLargestConsoleWindowSize
977 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
979 COORD Coord
= {80,25};
980 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
981 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
986 /*--------------------------------------------------------------
987 * GetConsoleCursorInfo
993 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
994 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
996 CSR_API_MESSAGE Request
;
999 if (!lpConsoleCursorInfo
)
1001 if (!hConsoleOutput
)
1002 SetLastError(ERROR_INVALID_HANDLE
);
1004 SetLastError(ERROR_INVALID_ACCESS
);
1009 Request
.Data
.GetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1011 Status
= CsrClientCallServer(&Request
,
1013 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CURSOR_INFO
),
1014 sizeof(CSR_API_MESSAGE
));
1015 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1017 BaseSetLastNTError(Status
);
1021 *lpConsoleCursorInfo
= Request
.Data
.GetCursorInfoRequest
.Info
;
1027 /*--------------------------------------------------------------
1028 * GetNumberOfConsoleMouseButtons
1034 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
1036 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
1037 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1042 /*--------------------------------------------------------------
1049 SetConsoleMode(HANDLE hConsoleHandle
,
1052 CSR_API_MESSAGE Request
;
1055 Request
.Data
.SetConsoleModeRequest
.ConsoleHandle
= hConsoleHandle
;
1056 Request
.Data
.SetConsoleModeRequest
.Mode
= dwMode
;
1058 Status
= CsrClientCallServer(&Request
,
1060 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_MODE
),
1061 sizeof(CSR_API_MESSAGE
));
1062 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1064 BaseSetLastNTError(Status
);
1072 /*--------------------------------------------------------------
1073 * SetConsoleActiveScreenBuffer
1079 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
1081 CSR_API_MESSAGE Request
;
1084 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
1086 Status
= CsrClientCallServer(&Request
,
1088 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_SCREEN_BUFFER
),
1089 sizeof(CSR_API_MESSAGE
));
1090 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1092 BaseSetLastNTError(Status
);
1100 /*--------------------------------------------------------------
1101 * FlushConsoleInputBuffer
1107 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
1109 CSR_API_MESSAGE Request
;
1112 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
1114 Status
= CsrClientCallServer(&Request
,
1116 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, FLUSH_INPUT_BUFFER
),
1117 sizeof(CSR_API_MESSAGE
));
1118 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1120 BaseSetLastNTError(Status
);
1128 /*--------------------------------------------------------------
1129 * SetConsoleScreenBufferSize
1135 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
1138 CSR_API_MESSAGE Request
;
1141 Request
.Data
.SetScreenBufferSize
.OutputHandle
= hConsoleOutput
;
1142 Request
.Data
.SetScreenBufferSize
.Size
= dwSize
;
1144 Status
= CsrClientCallServer(&Request
,
1146 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_SCREEN_BUFFER_SIZE
),
1147 sizeof(CSR_API_MESSAGE
));
1148 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1150 BaseSetLastNTError(Status
);
1157 /*--------------------------------------------------------------
1158 * SetConsoleCursorInfo
1164 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
1165 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
1167 CSR_API_MESSAGE Request
;
1170 Request
.Data
.SetCursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1171 Request
.Data
.SetCursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
1173 Status
= CsrClientCallServer(&Request
,
1175 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CURSOR_INFO
),
1176 sizeof(CSR_API_MESSAGE
));
1177 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1179 BaseSetLastNTError(Status
);
1189 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
1190 const SMALL_RECT
*lpScrollRectangle
,
1191 const SMALL_RECT
*lpClipRectangle
,
1192 COORD dwDestinationOrigin
,
1193 const CHAR_INFO
*lpFill
,
1196 CSR_API_MESSAGE Request
;
1199 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
1200 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
1201 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
1203 if (lpClipRectangle
!= NULL
)
1205 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
1206 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
1210 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
1213 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
1214 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
1216 Status
= CsrClientCallServer(&Request
,
1218 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SCROLL_CONSOLE_SCREEN_BUFFER
),
1219 sizeof(CSR_API_MESSAGE
));
1221 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1223 BaseSetLastNTError(Status
);
1231 /*--------------------------------------------------------------
1232 * ScrollConsoleScreenBufferA
1238 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
1239 CONST SMALL_RECT
*lpScrollRectangle
,
1240 CONST SMALL_RECT
*lpClipRectangle
,
1241 COORD dwDestinationOrigin
,
1242 CONST CHAR_INFO
*lpFill
)
1244 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1245 (PSMALL_RECT
)lpScrollRectangle
,
1246 (PSMALL_RECT
)lpClipRectangle
,
1247 dwDestinationOrigin
,
1253 /*--------------------------------------------------------------
1254 * ScrollConsoleScreenBufferW
1260 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
1261 CONST SMALL_RECT
*lpScrollRectangle
,
1262 CONST SMALL_RECT
*lpClipRectangle
,
1263 COORD dwDestinationOrigin
,
1264 CONST CHAR_INFO
*lpFill
)
1266 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1269 dwDestinationOrigin
,
1275 /*--------------------------------------------------------------
1276 * SetConsoleWindowInfo
1282 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
1284 CONST SMALL_RECT
*lpConsoleWindow
)
1286 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
1287 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1292 /*--------------------------------------------------------------
1293 * SetConsoleTextAttribute
1299 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
1302 CSR_API_MESSAGE Request
;
1305 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1306 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
1308 Status
= CsrClientCallServer(&Request
,
1310 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_ATTRIB
),
1311 sizeof(CSR_API_MESSAGE
));
1312 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1314 BaseSetLastNTError(Status
);
1324 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1326 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
1328 if (HandlerRoutine
== NULL
)
1330 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
1334 if (NrCtrlHandlers
== NrAllocatedHandlers
)
1336 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
1338 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
1339 if (NewCtrlHandlers
== NULL
)
1341 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1345 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
1347 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
1349 CtrlHandlers
= NewCtrlHandlers
;
1350 NrAllocatedHandlers
+= 4;
1353 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
1355 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
1362 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1366 if (HandlerRoutine
== NULL
)
1368 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
1372 for (i
= 0; i
< NrCtrlHandlers
; i
++)
1374 if (CtrlHandlers
[i
] == HandlerRoutine
)
1376 if (i
< (NrCtrlHandlers
- 1))
1378 memmove(&CtrlHandlers
[i
],
1380 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
1388 SetLastError(ERROR_INVALID_PARAMETER
);
1398 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
1403 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
1406 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
1410 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
1413 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
1418 /*--------------------------------------------------------------
1419 * GenerateConsoleCtrlEvent
1425 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
1426 DWORD dwProcessGroupId
)
1428 CSR_API_MESSAGE Request
;
1431 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
1433 SetLastError(ERROR_INVALID_PARAMETER
);
1437 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
1438 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
1440 Status
= CsrClientCallServer(&Request
,
1442 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GENERATE_CTRL_EVENT
),
1443 sizeof(CSR_API_MESSAGE
));
1444 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
1446 BaseSetLastNTError(Status
);
1455 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD nSize
, BOOL bUnicode
)
1457 CSR_API_MESSAGE Request
;
1458 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1464 Request
.Data
.GetTitleRequest
.Length
= nSize
* (bUnicode
? 1 : sizeof(WCHAR
));
1465 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.GetTitleRequest
.Length
);
1466 if (CaptureBuffer
== NULL
)
1468 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1469 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1473 CsrAllocateMessagePointer(CaptureBuffer
,
1474 Request
.Data
.GetTitleRequest
.Length
,
1475 (PVOID
*)&Request
.Data
.GetTitleRequest
.Title
);
1477 Status
= CsrClientCallServer(&Request
,
1479 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_TITLE
),
1480 sizeof(CSR_API_MESSAGE
));
1481 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
1483 CsrFreeCaptureBuffer(CaptureBuffer
);
1484 BaseSetLastNTError(Status
);
1490 if (nSize
>= sizeof(WCHAR
))
1491 wcscpy((LPWSTR
)lpConsoleTitle
, Request
.Data
.GetTitleRequest
.Title
);
1495 if (nSize
< Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
) ||
1496 !WideCharToMultiByte(CP_ACP
, // ANSI code page
1497 0, // performance and mapping flags
1498 Request
.Data
.GetTitleRequest
.Title
, // address of wide-character string
1499 -1, // number of characters in string
1500 (LPSTR
)lpConsoleTitle
, // address of buffer for new string
1501 nSize
, // size of buffer
1505 /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
1506 *(LPSTR
)lpConsoleTitle
= '\0';
1507 Request
.Data
.GetTitleRequest
.Length
= 0;
1510 CsrFreeCaptureBuffer(CaptureBuffer
);
1512 return Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
);
1515 /*--------------------------------------------------------------
1522 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
1525 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
1528 /*--------------------------------------------------------------
1537 GetConsoleTitleA(LPSTR lpConsoleTitle
,
1540 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
1544 /*--------------------------------------------------------------
1551 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
1553 CSR_API_MESSAGE Request
;
1554 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1557 Request
.Data
.SetTitleRequest
.Length
= wcslen(lpConsoleTitle
) * sizeof(WCHAR
);
1559 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.SetTitleRequest
.Length
);
1560 if (CaptureBuffer
== NULL
)
1562 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1563 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1567 CsrCaptureMessageBuffer(CaptureBuffer
,
1568 (PVOID
)lpConsoleTitle
,
1569 Request
.Data
.SetTitleRequest
.Length
,
1570 (PVOID
*)&Request
.Data
.SetTitleRequest
.Title
);
1572 Status
= CsrClientCallServer(&Request
,
1574 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_TITLE
),
1575 sizeof(CSR_API_MESSAGE
));
1577 CsrFreeCaptureBuffer(CaptureBuffer
);
1579 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1581 BaseSetLastNTError(Status
);
1589 /*--------------------------------------------------------------
1598 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
1600 ULONG Length
= strlen(lpConsoleTitle
) + 1;
1601 LPWSTR WideTitle
= HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
1605 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1608 MultiByteToWideChar(CP_ACP
, 0, lpConsoleTitle
, -1, WideTitle
, Length
);
1609 Ret
= SetConsoleTitleW(WideTitle
);
1610 HeapFree(GetProcessHeap(), 0, WideTitle
);
1615 /*--------------------------------------------------------------
1616 * CreateConsoleScreenBuffer
1622 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
1624 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1626 LPVOID lpScreenBufferData
)
1628 CSR_API_MESSAGE Request
;
1631 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
1632 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
1633 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
1635 SetLastError(ERROR_INVALID_PARAMETER
);
1636 return INVALID_HANDLE_VALUE
;
1639 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
1640 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
1641 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
1642 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
1644 Status
= CsrClientCallServer(&Request
,
1646 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, CREATE_SCREEN_BUFFER
),
1647 sizeof(CSR_API_MESSAGE
));
1648 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1650 BaseSetLastNTError(Status
);
1651 return INVALID_HANDLE_VALUE
;
1653 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
1657 /*--------------------------------------------------------------
1666 CSR_API_MESSAGE Request
;
1669 Status
= CsrClientCallServer(&Request
,
1671 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_CP
),
1672 sizeof(CSR_API_MESSAGE
));
1673 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1675 BaseSetLastNTError (Status
);
1679 return Request
.Data
.GetConsoleCodePage
.CodePage
;
1683 /*--------------------------------------------------------------
1690 SetConsoleCP(UINT wCodePageID
)
1692 CSR_API_MESSAGE Request
;
1695 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
1697 Status
= CsrClientCallServer(&Request
,
1699 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_CP
),
1700 sizeof(CSR_API_MESSAGE
));
1701 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1703 BaseSetLastNTError(Status
);
1706 return NT_SUCCESS(Status
);
1710 /*--------------------------------------------------------------
1711 * GetConsoleOutputCP
1717 GetConsoleOutputCP(VOID
)
1719 CSR_API_MESSAGE Request
;
1722 Status
= CsrClientCallServer(&Request
,
1724 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_OUTPUT_CP
),
1725 sizeof(CSR_API_MESSAGE
));
1726 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1728 BaseSetLastNTError (Status
);
1732 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
1736 /*--------------------------------------------------------------
1737 * SetConsoleOutputCP
1743 SetConsoleOutputCP(UINT wCodePageID
)
1745 CSR_API_MESSAGE Request
;
1748 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
1750 Status
= CsrClientCallServer(&Request
,
1752 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_OUTPUT_CP
),
1753 sizeof(CSR_API_MESSAGE
));
1754 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1756 BaseSetLastNTError(Status
);
1759 return NT_SUCCESS(Status
);
1763 /*--------------------------------------------------------------
1764 * GetConsoleProcessList
1770 GetConsoleProcessList(LPDWORD lpdwProcessList
,
1771 DWORD dwProcessCount
)
1773 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1774 CSR_API_MESSAGE Request
;
1778 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
1780 SetLastError(ERROR_INVALID_PARAMETER
);
1784 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
1785 if (CaptureBuffer
== NULL
)
1787 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1788 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1792 Request
.Data
.GetProcessListRequest
.nMaxIds
= dwProcessCount
;
1793 CsrAllocateMessagePointer(CaptureBuffer
,
1794 dwProcessCount
* sizeof(DWORD
),
1795 (PVOID
*)&Request
.Data
.GetProcessListRequest
.ProcessId
);
1797 Status
= CsrClientCallServer(&Request
,
1799 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_PROCESS_LIST
),
1800 sizeof(CSR_API_MESSAGE
));
1801 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1803 BaseSetLastNTError (Status
);
1808 nProcesses
= Request
.Data
.GetProcessListRequest
.nProcessIdsTotal
;
1809 if (dwProcessCount
>= nProcesses
)
1811 memcpy(lpdwProcessList
, Request
.Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
1815 CsrFreeCaptureBuffer(CaptureBuffer
);
1820 /*--------------------------------------------------------------
1821 * GetConsoleSelectionInfo
1827 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
1829 CSR_API_MESSAGE Request
;
1830 NTSTATUS Status
= CsrClientCallServer(&Request
,
1832 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_SELECTION_INFO
),
1833 sizeof(CSR_API_MESSAGE
));
1834 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1836 BaseSetLastNTError(Status
);
1840 *lpConsoleSelectionInfo
= Request
.Data
.GetConsoleSelectionInfo
.Info
;
1845 /*--------------------------------------------------------------
1852 AttachConsole(DWORD dwProcessId
)
1854 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
1858 /*--------------------------------------------------------------
1865 GetConsoleWindow(VOID
)
1867 CSR_API_MESSAGE Request
;
1870 Status
= CsrClientCallServer(&Request
,
1872 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_WINDOW
),
1873 sizeof(CSR_API_MESSAGE
));
1874 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1876 BaseSetLastNTError(Status
);
1880 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
1884 /*--------------------------------------------------------------
1891 SetConsoleIcon(HICON hicon
)
1893 CSR_API_MESSAGE Request
;
1896 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
1898 Status
= CsrClientCallServer(&Request
,
1900 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_ICON
),
1901 sizeof(CSR_API_MESSAGE
));
1902 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1904 BaseSetLastNTError(Status
);
1908 return NT_SUCCESS(Status
);
1912 /******************************************************************************
1913 * \name SetConsoleInputExeNameW
1914 * \brief Sets the console input file name from a unicode string.
1915 * \param lpInputExeName Pointer to a unicode string with the name.
1916 * \return TRUE if successful, FALSE if unsuccsedful.
1917 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
1918 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
1922 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
1927 || (lenName
= lstrlenW(lpInputExeName
)) == 0
1928 || lenName
> INPUTEXENAME_BUFLEN
- 1)
1930 /* Fail if string is empty or too long */
1931 SetLastError(ERROR_INVALID_PARAMETER
);
1935 RtlEnterCriticalSection(&ConsoleLock
);
1938 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
1939 InputExeName
[lenName
] = L
'\0';
1943 RtlLeaveCriticalSection(&ConsoleLock
);
1951 /******************************************************************************
1952 * \name SetConsoleInputExeNameA
1953 * \brief Sets the console input file name from an ansi string.
1954 * \param lpInputExeName Pointer to an ansi string with the name.
1955 * \return TRUE if successful, FALSE if unsuccsedful.
1956 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
1957 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
1961 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
1963 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
1964 ANSI_STRING InputExeNameA
;
1965 UNICODE_STRING InputExeNameU
;
1969 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
1971 if(InputExeNameA
.Length
== 0 ||
1972 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
1974 /* Fail if string is empty or too long */
1975 SetLastError(ERROR_INVALID_PARAMETER
);
1979 InputExeNameU
.Buffer
= Buffer
;
1980 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
1981 InputExeNameU
.Length
= 0;
1982 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
1983 if(NT_SUCCESS(Status
))
1985 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
1989 BaseSetLastNTError(Status
);
1997 /******************************************************************************
1998 * \name GetConsoleInputExeNameW
1999 * \brief Retrieves the console input file name as unicode string.
2000 * \param nBufferLength Length of the buffer in WCHARs.
2001 * Specify 0 to recieve the needed buffer length.
2002 * \param lpBuffer Pointer to a buffer that recieves the string.
2003 * \return Needed buffer size if \p nBufferLength is 0.
2004 * Otherwise 1 if successful, 2 if buffer is too small.
2005 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2006 * is not big enough.
2010 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
2012 int lenName
= lstrlenW(InputExeName
);
2014 if (nBufferLength
== 0)
2016 /* Buffer size is requested, return it */
2020 if(lenName
+ 1 > nBufferLength
)
2022 /* Buffer is not large enough! */
2023 SetLastError(ERROR_BUFFER_OVERFLOW
);
2027 RtlEnterCriticalSection(&ConsoleLock
);
2030 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
2031 lpBuffer
[lenName
] = '\0';
2035 RtlLeaveCriticalSection(&ConsoleLock
);
2039 /* Success, return 1 */
2044 /******************************************************************************
2045 * \name GetConsoleInputExeNameA
2046 * \brief Retrieves the console input file name as ansi string.
2047 * \param nBufferLength Length of the buffer in CHARs.
2048 * \param lpBuffer Pointer to a buffer that recieves the string.
2049 * \return 1 if successful, 2 if buffer is too small.
2050 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2051 * is not big enough. The buffer recieves as much characters as fit.
2055 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
2057 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2059 UNICODE_STRING BufferU
;
2060 ANSI_STRING BufferA
;
2062 /* Get the unicode name */
2063 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
2065 /* Initialize strings for conversion */
2066 RtlInitUnicodeString(&BufferU
, Buffer
);
2068 BufferA
.MaximumLength
= nBufferLength
;
2069 BufferA
.Buffer
= lpBuffer
;
2071 /* Convert unicode name to ansi, copying as much chars as fit */
2072 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
2074 /* Error handling */
2075 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
2077 SetLastError(ERROR_BUFFER_OVERFLOW
);
2086 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
2094 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
2102 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
2110 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
2118 RegisterConsoleOS2(BOOL bUnknown
)
2126 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
2134 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
2142 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
2150 SetConsoleOS2OemFormat(BOOL bUnknown
)
2158 UnregisterConsoleIME(VOID
)
2168 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
2177 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
2188 SetLastConsoleEventActive(VOID
)