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
,
206 CONSOLE_API_MESSAGE ApiMessage
;
207 PCSRSS_DUPLICATE_HANDLE DuplicateHandleRequest
= &ApiMessage
.Data
.DuplicateHandleRequest
;
209 if ( (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)) ||
210 (!(dwOptions
& DUPLICATE_SAME_ACCESS
) &&
211 (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
))) )
213 SetLastError (ERROR_INVALID_PARAMETER
);
214 return INVALID_HANDLE_VALUE
;
217 DuplicateHandleRequest
->Handle
= hConsole
;
218 DuplicateHandleRequest
->Access
= dwDesiredAccess
;
219 DuplicateHandleRequest
->Inheritable
= bInheritHandle
;
220 DuplicateHandleRequest
->Options
= dwOptions
;
222 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
224 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepDuplicateHandle
),
225 sizeof(CSRSS_DUPLICATE_HANDLE
));
226 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
228 BaseSetLastNTError(Status
);
229 return INVALID_HANDLE_VALUE
;
232 return DuplicateHandleRequest
->Handle
;
241 GetConsoleDisplayMode(LPDWORD lpdwMode
)
243 * FUNCTION: Get the console display mode
245 * lpdwMode - Address of variable that receives the current value
247 * STATUS: Undocumented
250 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
251 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
257 * @unimplemented (Undocumented)
261 GetConsoleFontInfo(DWORD Unknown0
,
266 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
267 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
277 GetConsoleFontSize(HANDLE hConsoleOutput
,
280 COORD Empty
= {0, 0};
281 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
282 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
288 * @implemented (Undocumented)
292 GetConsoleHardwareState(HANDLE hConsole
,
297 CONSOLE_API_MESSAGE ApiMessage
;
298 PCSRSS_CONSOLE_HW_STATE ConsoleHardwareStateRequest
= &ApiMessage
.Data
.ConsoleHardwareStateRequest
;
300 ConsoleHardwareStateRequest
->ConsoleHandle
= hConsole
;
302 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
304 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetHardwareState
),
305 sizeof(CSRSS_CONSOLE_HW_STATE
));
306 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
308 BaseSetLastNTError(Status
);
312 *State
= ConsoleHardwareStateRequest
->State
;
318 * @implemented (Undocumented)
322 GetConsoleInputWaitHandle(VOID
)
324 CSR_API_MESSAGE Request
;
327 Status
= CsrClientCallServer(&Request
,
329 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_INPUT_WAIT_HANDLE
),
330 sizeof(CSR_API_MESSAGE
));
331 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
333 BaseSetLastNTError(Status
);
337 return Request
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
346 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
348 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
350 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
351 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
357 * @unimplemented (Undocumented)
361 GetNumberOfConsoleFonts(VOID
)
363 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
364 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
370 * @unimplemented (Undocumented)
374 InvalidateConsoleDIBits(DWORD Unknown0
,
377 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
378 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
384 * @unimplemented (Undocumented)
388 OpenConsoleW(LPCWSTR wsName
,
389 DWORD dwDesiredAccess
,
393 NTSTATUS Status
= STATUS_SUCCESS
;
394 CONSOLE_API_MESSAGE ApiMessage
;
395 PCSRSS_OPEN_CONSOLE OpenConsoleRequest
= &ApiMessage
.Data
.OpenConsoleRequest
;
396 HANDLE_TYPE HandleType
;
398 if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONIN$"))
400 HandleType
= HANDLE_INPUT
;
402 else if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONOUT$"))
404 HandleType
= HANDLE_OUTPUT
;
408 SetLastError(ERROR_INVALID_PARAMETER
);
409 return INVALID_HANDLE_VALUE
;
412 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
))
414 SetLastError(ERROR_INVALID_PARAMETER
);
415 return INVALID_HANDLE_VALUE
;
418 if (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
))
420 SetLastError(ERROR_INVALID_PARAMETER
);
421 return INVALID_HANDLE_VALUE
;
424 OpenConsoleRequest
->HandleType
= HandleType
;
425 OpenConsoleRequest
->Access
= dwDesiredAccess
;
426 OpenConsoleRequest
->Inheritable
= bInheritHandle
;
427 OpenConsoleRequest
->ShareMode
= dwShareMode
;
429 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
431 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepOpenConsole
),
432 sizeof(CSRSS_OPEN_CONSOLE
));
433 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
435 BaseSetLastNTError(Status
);
436 return INVALID_HANDLE_VALUE
;
439 return OpenConsoleRequest
->Handle
;
444 * @unimplemented (Undocumented)
448 SetConsoleCursor(DWORD Unknown0
,
451 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
452 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
462 SetConsoleDisplayMode(HANDLE hOut
,
466 * FUNCTION: Set the console display mode.
468 * hOut - Standard output handle.
469 * dwNewMode - New mode.
470 * lpdwOldMode - Address of a variable that receives the old mode.
473 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
474 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
480 * @unimplemented (Undocumented)
484 SetConsoleFont(DWORD Unknown0
,
487 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
488 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
494 * @implemented (Undocumented)
498 SetConsoleHardwareState(HANDLE hConsole
,
503 CONSOLE_API_MESSAGE ApiMessage
;
504 PCSRSS_CONSOLE_HW_STATE ConsoleHardwareStateRequest
= &ApiMessage
.Data
.ConsoleHardwareStateRequest
;
506 ConsoleHardwareStateRequest
->ConsoleHandle
= hConsole
;
507 ConsoleHardwareStateRequest
->State
= State
;
509 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
511 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetHardwareState
),
512 sizeof(CSRSS_CONSOLE_HW_STATE
));
513 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
515 BaseSetLastNTError(Status
);
524 * @unimplemented (Undocumented)
528 SetConsoleKeyShortcuts(DWORD Unknown0
,
533 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
534 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
540 * @unimplemented (Undocumented)
544 SetConsoleMaximumWindowSize(DWORD Unknown0
,
547 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
548 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
554 * @unimplemented (Undocumented)
558 SetConsoleMenuClose(DWORD Unknown0
)
560 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
561 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
567 * @unimplemented (Undocumented)
571 SetConsolePalette(DWORD Unknown0
,
575 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
576 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
581 * @unimplemented (Undocumented)
585 ShowConsoleCursor(DWORD Unknown0
,
588 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
589 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
595 * FUNCTION: Checks whether the given handle is a valid console handle.
598 * Handle - Handle to be checked
601 * TRUE: Handle is a valid console handle
602 * FALSE: Handle is not a valid console handle.
604 * STATUS: Officially undocumented
610 VerifyConsoleIoHandle(HANDLE Handle
)
613 CONSOLE_API_MESSAGE ApiMessage
;
615 ApiMessage
.Data
.VerifyHandleRequest
.Handle
= Handle
;
617 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
619 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepVerifyIoHandle
),
620 sizeof(CSRSS_VERIFY_HANDLE
));
621 if (!NT_SUCCESS(Status
))
623 BaseSetLastNTError(Status
);
627 return (BOOL
)NT_SUCCESS(ApiMessage
.Status
);
636 WriteConsoleInputVDMA(DWORD Unknown0
,
641 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
642 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
652 WriteConsoleInputVDMW(DWORD Unknown0
,
657 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
658 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
664 * @implemented (Undocumented)
668 CloseConsoleHandle(HANDLE Handle
)
671 CONSOLE_API_MESSAGE ApiMessage
;
673 ApiMessage
.Data
.CloseHandleRequest
.Handle
= Handle
;
675 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
677 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCloseHandle
),
678 sizeof(CSRSS_CLOSE_HANDLE
));
679 if (!NT_SUCCESS(Status
))
681 BaseSetLastNTError(Status
);
694 GetStdHandle(DWORD nStdHandle
)
696 * FUNCTION: Get a handle for the standard input, standard output
697 * and a standard error device.
700 * nStdHandle - Specifies the device for which to return the handle.
702 * RETURNS: If the function succeeds, the return value is the handle
703 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
706 PRTL_USER_PROCESS_PARAMETERS Ppb
;
708 Ppb
= NtCurrentPeb()->ProcessParameters
;
711 case STD_INPUT_HANDLE
:
712 return Ppb
->StandardInput
;
714 case STD_OUTPUT_HANDLE
:
715 return Ppb
->StandardOutput
;
717 case STD_ERROR_HANDLE
:
718 return Ppb
->StandardError
;
721 SetLastError(ERROR_INVALID_PARAMETER
);
722 return INVALID_HANDLE_VALUE
;
731 SetStdHandle(DWORD nStdHandle
,
734 * FUNCTION: Set the handle for the standard input, standard output or
735 * the standard error device.
738 * nStdHandle - Specifies the handle to be set.
739 * hHandle - The handle to set.
741 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
744 PRTL_USER_PROCESS_PARAMETERS Ppb
;
746 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
748 Ppb
= NtCurrentPeb()->ProcessParameters
;
752 case STD_INPUT_HANDLE
:
753 Ppb
->StandardInput
= hHandle
;
756 case STD_OUTPUT_HANDLE
:
757 Ppb
->StandardOutput
= hHandle
;
760 case STD_ERROR_HANDLE
:
761 Ppb
->StandardError
= hHandle
;
765 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
766 SetLastError(ERROR_INVALID_HANDLE
);
771 /*--------------------------------------------------------------
781 CONSOLE_API_MESSAGE ApiMessage
;
782 PCSRSS_ALLOC_CONSOLE AllocConsoleRequest
= &ApiMessage
.Data
.AllocConsoleRequest
;
786 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
788 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
789 BaseSetLastNTError (STATUS_OBJECT_NAME_EXISTS
);
795 AllocConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
796 AllocConsoleRequest
->ConsoleNeeded
= TRUE
;
797 AllocConsoleRequest
->ShowCmd
= si
.wShowWindow
;
799 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
801 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAlloc
),
802 sizeof(CSRSS_ALLOC_CONSOLE
));
803 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
805 BaseSetLastNTError(Status
);
809 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= AllocConsoleRequest
->Console
;
811 SetStdHandle(STD_INPUT_HANDLE
, AllocConsoleRequest
->InputHandle
);
812 SetStdHandle(STD_OUTPUT_HANDLE
, AllocConsoleRequest
->OutputHandle
);
814 hStdError
= DuplicateConsoleHandle(AllocConsoleRequest
->OutputHandle
,
817 DUPLICATE_SAME_ACCESS
);
819 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
824 /*--------------------------------------------------------------
833 // AG: I'm not sure if this is correct (what happens to std handles?)
834 // but I just tried to reverse what AllocConsole() does...
837 CONSOLE_API_MESSAGE ApiMessage
;
839 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
841 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFree
),
842 sizeof(CSRSS_FREE_CONSOLE
));
843 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
845 BaseSetLastNTError(Status
);
849 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
854 /*--------------------------------------------------------------
855 * GetConsoleScreenBufferInfo
861 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
862 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
865 CONSOLE_API_MESSAGE ApiMessage
;
867 ApiMessage
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
869 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
871 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetScreenBufferInfo
),
872 sizeof(CSRSS_SCREEN_BUFFER_INFO
));
873 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
875 BaseSetLastNTError(Status
);
879 *lpConsoleScreenBufferInfo
= ApiMessage
.Data
.ScreenBufferInfoRequest
.Info
;
885 /*--------------------------------------------------------------
886 * SetConsoleCursorPosition
892 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
893 COORD dwCursorPosition
)
896 CONSOLE_API_MESSAGE ApiMessage
;
898 ApiMessage
.Data
.SetCursorPositionRequest
.ConsoleHandle
= hConsoleOutput
;
899 ApiMessage
.Data
.SetCursorPositionRequest
.Position
= dwCursorPosition
;
901 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
903 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorPosition
),
904 sizeof(CSRSS_SET_CURSOR_POSITION
));
905 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
907 BaseSetLastNTError(Status
);
915 /*--------------------------------------------------------------
922 GetConsoleMode(HANDLE hConsoleHandle
,
926 CONSOLE_API_MESSAGE ApiMessage
;
927 PCSRSS_CONSOLE_MODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
929 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
931 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
933 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetMode
),
934 sizeof(CSRSS_CONSOLE_MODE
));
935 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
937 BaseSetLastNTError(Status
);
941 *lpMode
= ConsoleModeRequest
->ConsoleMode
;
947 /*--------------------------------------------------------------
948 * GetNumberOfConsoleInputEvents
954 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
955 LPDWORD lpNumberOfEvents
)
957 CSR_API_MESSAGE Request
;
960 if (lpNumberOfEvents
== NULL
)
962 SetLastError(ERROR_INVALID_PARAMETER
);
966 Request
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
968 Status
= CsrClientCallServer(&Request
,
970 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_NUM_INPUT_EVENTS
),
971 sizeof(CSR_API_MESSAGE
));
972 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
974 BaseSetLastNTError(Status
);
978 *lpNumberOfEvents
= Request
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
984 /*--------------------------------------------------------------
985 * GetLargestConsoleWindowSize
991 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
993 COORD Coord
= {80,25};
994 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
995 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1000 /*--------------------------------------------------------------
1001 * GetConsoleCursorInfo
1007 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
1008 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
1011 CONSOLE_API_MESSAGE ApiMessage
;
1013 if (!lpConsoleCursorInfo
)
1015 if (!hConsoleOutput
)
1016 SetLastError(ERROR_INVALID_HANDLE
);
1018 SetLastError(ERROR_INVALID_ACCESS
);
1023 ApiMessage
.Data
.CursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1025 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1027 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCursorInfo
),
1028 sizeof(CSRSS_CURSOR_INFO
));
1029 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1031 BaseSetLastNTError(Status
);
1035 *lpConsoleCursorInfo
= ApiMessage
.Data
.CursorInfoRequest
.Info
;
1041 /*--------------------------------------------------------------
1042 * GetNumberOfConsoleMouseButtons
1048 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
1050 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
1051 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1056 /*--------------------------------------------------------------
1063 SetConsoleMode(HANDLE hConsoleHandle
,
1067 CONSOLE_API_MESSAGE ApiMessage
;
1068 PCSRSS_CONSOLE_MODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1070 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
1071 ConsoleModeRequest
->ConsoleMode
= dwMode
;
1073 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1075 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetMode
),
1076 sizeof(CSRSS_CONSOLE_MODE
));
1077 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1079 BaseSetLastNTError(Status
);
1087 /*--------------------------------------------------------------
1088 * SetConsoleActiveScreenBuffer
1094 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
1096 CSR_API_MESSAGE Request
;
1099 Request
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
1101 Status
= CsrClientCallServer(&Request
,
1103 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_SCREEN_BUFFER
),
1104 sizeof(CSR_API_MESSAGE
));
1105 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1107 BaseSetLastNTError(Status
);
1115 /*--------------------------------------------------------------
1116 * FlushConsoleInputBuffer
1122 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
1124 CSR_API_MESSAGE Request
;
1127 Request
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
1129 Status
= CsrClientCallServer(&Request
,
1131 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, FLUSH_INPUT_BUFFER
),
1132 sizeof(CSR_API_MESSAGE
));
1133 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1135 BaseSetLastNTError(Status
);
1143 /*--------------------------------------------------------------
1144 * SetConsoleScreenBufferSize
1150 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
1153 CSR_API_MESSAGE Request
;
1156 Request
.Data
.SetScreenBufferSize
.OutputHandle
= hConsoleOutput
;
1157 Request
.Data
.SetScreenBufferSize
.Size
= dwSize
;
1159 Status
= CsrClientCallServer(&Request
,
1161 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_SCREEN_BUFFER_SIZE
),
1162 sizeof(CSR_API_MESSAGE
));
1163 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1165 BaseSetLastNTError(Status
);
1173 /*--------------------------------------------------------------
1174 * SetConsoleCursorInfo
1180 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
1181 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
1184 CONSOLE_API_MESSAGE ApiMessage
;
1186 ApiMessage
.Data
.CursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1187 ApiMessage
.Data
.CursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
1189 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1191 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorInfo
),
1192 sizeof(CSRSS_CURSOR_INFO
));
1193 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1195 BaseSetLastNTError(Status
);
1205 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
1206 const SMALL_RECT
*lpScrollRectangle
,
1207 const SMALL_RECT
*lpClipRectangle
,
1208 COORD dwDestinationOrigin
,
1209 const CHAR_INFO
*lpFill
,
1212 CSR_API_MESSAGE Request
;
1215 Request
.Data
.ScrollConsoleScreenBufferRequest
.ConsoleHandle
= hConsoleOutput
;
1216 Request
.Data
.ScrollConsoleScreenBufferRequest
.Unicode
= bUnicode
;
1217 Request
.Data
.ScrollConsoleScreenBufferRequest
.ScrollRectangle
= *lpScrollRectangle
;
1219 if (lpClipRectangle
!= NULL
)
1221 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= TRUE
;
1222 Request
.Data
.ScrollConsoleScreenBufferRequest
.ClipRectangle
= *lpClipRectangle
;
1226 Request
.Data
.ScrollConsoleScreenBufferRequest
.UseClipRectangle
= FALSE
;
1229 Request
.Data
.ScrollConsoleScreenBufferRequest
.DestinationOrigin
= dwDestinationOrigin
;
1230 Request
.Data
.ScrollConsoleScreenBufferRequest
.Fill
= *lpFill
;
1232 Status
= CsrClientCallServer(&Request
,
1234 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SCROLL_CONSOLE_SCREEN_BUFFER
),
1235 sizeof(CSR_API_MESSAGE
));
1237 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1239 BaseSetLastNTError(Status
);
1247 /*--------------------------------------------------------------
1248 * ScrollConsoleScreenBufferA
1254 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
1255 CONST SMALL_RECT
*lpScrollRectangle
,
1256 CONST SMALL_RECT
*lpClipRectangle
,
1257 COORD dwDestinationOrigin
,
1258 CONST CHAR_INFO
*lpFill
)
1260 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1261 (PSMALL_RECT
)lpScrollRectangle
,
1262 (PSMALL_RECT
)lpClipRectangle
,
1263 dwDestinationOrigin
,
1269 /*--------------------------------------------------------------
1270 * ScrollConsoleScreenBufferW
1276 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
1277 CONST SMALL_RECT
*lpScrollRectangle
,
1278 CONST SMALL_RECT
*lpClipRectangle
,
1279 COORD dwDestinationOrigin
,
1280 CONST CHAR_INFO
*lpFill
)
1282 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1285 dwDestinationOrigin
,
1291 /*--------------------------------------------------------------
1292 * SetConsoleWindowInfo
1298 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
1300 CONST SMALL_RECT
*lpConsoleWindow
)
1302 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
1303 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1308 /*--------------------------------------------------------------
1309 * SetConsoleTextAttribute
1315 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
1318 CSR_API_MESSAGE Request
;
1321 Request
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1322 Request
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
1324 Status
= CsrClientCallServer(&Request
,
1326 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_ATTRIB
),
1327 sizeof(CSR_API_MESSAGE
));
1328 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1330 BaseSetLastNTError(Status
);
1340 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1342 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
1344 if (HandlerRoutine
== NULL
)
1346 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
1350 if (NrCtrlHandlers
== NrAllocatedHandlers
)
1352 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
1354 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
1355 if (NewCtrlHandlers
== NULL
)
1357 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1361 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
1363 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
1365 CtrlHandlers
= NewCtrlHandlers
;
1366 NrAllocatedHandlers
+= 4;
1369 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
1371 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
1378 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1382 if (HandlerRoutine
== NULL
)
1384 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
1388 for (i
= 0; i
< NrCtrlHandlers
; i
++)
1390 if (CtrlHandlers
[i
] == HandlerRoutine
)
1392 if (i
< (NrCtrlHandlers
- 1))
1394 memmove(&CtrlHandlers
[i
],
1396 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
1404 SetLastError(ERROR_INVALID_PARAMETER
);
1414 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
1419 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
1422 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
1426 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
1429 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
1434 /*--------------------------------------------------------------
1435 * GenerateConsoleCtrlEvent
1441 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
1442 DWORD dwProcessGroupId
)
1444 CSR_API_MESSAGE Request
;
1447 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
1449 SetLastError(ERROR_INVALID_PARAMETER
);
1453 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
1454 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
1456 Status
= CsrClientCallServer(&Request
,
1458 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GENERATE_CTRL_EVENT
),
1459 sizeof(CSR_API_MESSAGE
));
1460 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
1462 BaseSetLastNTError(Status
);
1471 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD nSize
, BOOL bUnicode
)
1473 CSR_API_MESSAGE Request
;
1474 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1480 Request
.Data
.GetTitleRequest
.Length
= nSize
* (bUnicode
? 1 : sizeof(WCHAR
));
1481 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.GetTitleRequest
.Length
);
1482 if (CaptureBuffer
== NULL
)
1484 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1485 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1489 CsrAllocateMessagePointer(CaptureBuffer
,
1490 Request
.Data
.GetTitleRequest
.Length
,
1491 (PVOID
*)&Request
.Data
.GetTitleRequest
.Title
);
1493 Status
= CsrClientCallServer(&Request
,
1495 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_TITLE
),
1496 sizeof(CSR_API_MESSAGE
));
1497 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
1499 CsrFreeCaptureBuffer(CaptureBuffer
);
1500 BaseSetLastNTError(Status
);
1506 if (nSize
>= sizeof(WCHAR
))
1507 wcscpy((LPWSTR
)lpConsoleTitle
, Request
.Data
.GetTitleRequest
.Title
);
1511 if (nSize
< Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
) ||
1512 !WideCharToMultiByte(CP_ACP
, // ANSI code page
1513 0, // performance and mapping flags
1514 Request
.Data
.GetTitleRequest
.Title
, // address of wide-character string
1515 -1, // number of characters in string
1516 (LPSTR
)lpConsoleTitle
, // address of buffer for new string
1517 nSize
, // size of buffer
1521 /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
1522 *(LPSTR
)lpConsoleTitle
= '\0';
1523 Request
.Data
.GetTitleRequest
.Length
= 0;
1526 CsrFreeCaptureBuffer(CaptureBuffer
);
1528 return Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
);
1531 /*--------------------------------------------------------------
1538 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
1541 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
1544 /*--------------------------------------------------------------
1553 GetConsoleTitleA(LPSTR lpConsoleTitle
,
1556 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
1560 /*--------------------------------------------------------------
1567 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
1569 CSR_API_MESSAGE Request
;
1570 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1573 Request
.Data
.SetTitleRequest
.Length
= wcslen(lpConsoleTitle
) * sizeof(WCHAR
);
1575 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.SetTitleRequest
.Length
);
1576 if (CaptureBuffer
== NULL
)
1578 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1579 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1583 CsrCaptureMessageBuffer(CaptureBuffer
,
1584 (PVOID
)lpConsoleTitle
,
1585 Request
.Data
.SetTitleRequest
.Length
,
1586 (PVOID
*)&Request
.Data
.SetTitleRequest
.Title
);
1588 Status
= CsrClientCallServer(&Request
,
1590 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_TITLE
),
1591 sizeof(CSR_API_MESSAGE
));
1593 CsrFreeCaptureBuffer(CaptureBuffer
);
1595 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1597 BaseSetLastNTError(Status
);
1605 /*--------------------------------------------------------------
1614 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
1616 ULONG Length
= strlen(lpConsoleTitle
) + 1;
1617 LPWSTR WideTitle
= HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
1621 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1624 MultiByteToWideChar(CP_ACP
, 0, lpConsoleTitle
, -1, WideTitle
, Length
);
1625 Ret
= SetConsoleTitleW(WideTitle
);
1626 HeapFree(GetProcessHeap(), 0, WideTitle
);
1631 /*--------------------------------------------------------------
1632 * CreateConsoleScreenBuffer
1638 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
1640 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1642 LPVOID lpScreenBufferData
)
1644 CSR_API_MESSAGE Request
;
1647 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)
1648 || dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)
1649 || dwFlags
!= CONSOLE_TEXTMODE_BUFFER
)
1651 SetLastError(ERROR_INVALID_PARAMETER
);
1652 return INVALID_HANDLE_VALUE
;
1655 Request
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
1656 Request
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
1657 Request
.Data
.CreateScreenBufferRequest
.Inheritable
=
1658 lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
;
1660 Status
= CsrClientCallServer(&Request
,
1662 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, CREATE_SCREEN_BUFFER
),
1663 sizeof(CSR_API_MESSAGE
));
1664 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1666 BaseSetLastNTError(Status
);
1667 return INVALID_HANDLE_VALUE
;
1669 return Request
.Data
.CreateScreenBufferRequest
.OutputHandle
;
1673 /*--------------------------------------------------------------
1682 CSR_API_MESSAGE Request
;
1685 Status
= CsrClientCallServer(&Request
,
1687 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_CP
),
1688 sizeof(CSR_API_MESSAGE
));
1689 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1691 BaseSetLastNTError (Status
);
1695 return Request
.Data
.GetConsoleCodePage
.CodePage
;
1699 /*--------------------------------------------------------------
1706 SetConsoleCP(UINT wCodePageID
)
1708 CSR_API_MESSAGE Request
;
1711 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
1713 Status
= CsrClientCallServer(&Request
,
1715 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_CP
),
1716 sizeof(CSR_API_MESSAGE
));
1717 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1719 BaseSetLastNTError(Status
);
1722 return NT_SUCCESS(Status
);
1726 /*--------------------------------------------------------------
1727 * GetConsoleOutputCP
1733 GetConsoleOutputCP(VOID
)
1735 CSR_API_MESSAGE Request
;
1738 Status
= CsrClientCallServer(&Request
,
1740 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_OUTPUT_CP
),
1741 sizeof(CSR_API_MESSAGE
));
1742 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1744 BaseSetLastNTError (Status
);
1748 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
1752 /*--------------------------------------------------------------
1753 * SetConsoleOutputCP
1759 SetConsoleOutputCP(UINT wCodePageID
)
1761 CSR_API_MESSAGE Request
;
1764 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
1766 Status
= CsrClientCallServer(&Request
,
1768 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_OUTPUT_CP
),
1769 sizeof(CSR_API_MESSAGE
));
1770 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1772 BaseSetLastNTError(Status
);
1775 return NT_SUCCESS(Status
);
1779 /*--------------------------------------------------------------
1780 * GetConsoleProcessList
1786 GetConsoleProcessList(LPDWORD lpdwProcessList
,
1787 DWORD dwProcessCount
)
1789 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1790 CSR_API_MESSAGE Request
;
1794 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
1796 SetLastError(ERROR_INVALID_PARAMETER
);
1800 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
1801 if (CaptureBuffer
== NULL
)
1803 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1804 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1808 Request
.Data
.GetProcessListRequest
.nMaxIds
= dwProcessCount
;
1809 CsrAllocateMessagePointer(CaptureBuffer
,
1810 dwProcessCount
* sizeof(DWORD
),
1811 (PVOID
*)&Request
.Data
.GetProcessListRequest
.ProcessId
);
1813 Status
= CsrClientCallServer(&Request
,
1815 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_PROCESS_LIST
),
1816 sizeof(CSR_API_MESSAGE
));
1817 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1819 BaseSetLastNTError (Status
);
1824 nProcesses
= Request
.Data
.GetProcessListRequest
.nProcessIdsTotal
;
1825 if (dwProcessCount
>= nProcesses
)
1827 memcpy(lpdwProcessList
, Request
.Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
1831 CsrFreeCaptureBuffer(CaptureBuffer
);
1836 /*--------------------------------------------------------------
1837 * GetConsoleSelectionInfo
1843 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
1845 CSR_API_MESSAGE Request
;
1846 NTSTATUS Status
= CsrClientCallServer(&Request
,
1848 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_SELECTION_INFO
),
1849 sizeof(CSR_API_MESSAGE
));
1850 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1852 BaseSetLastNTError(Status
);
1856 *lpConsoleSelectionInfo
= Request
.Data
.GetConsoleSelectionInfo
.Info
;
1861 /*--------------------------------------------------------------
1868 AttachConsole(DWORD dwProcessId
)
1870 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
1874 /*--------------------------------------------------------------
1881 GetConsoleWindow(VOID
)
1883 CSR_API_MESSAGE Request
;
1886 Status
= CsrClientCallServer(&Request
,
1888 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_WINDOW
),
1889 sizeof(CSR_API_MESSAGE
));
1890 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1892 BaseSetLastNTError(Status
);
1896 return Request
.Data
.GetConsoleWindowRequest
.WindowHandle
;
1900 /*--------------------------------------------------------------
1907 SetConsoleIcon(HICON hicon
)
1909 CSR_API_MESSAGE Request
;
1912 Request
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
1914 Status
= CsrClientCallServer(&Request
,
1916 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_ICON
),
1917 sizeof(CSR_API_MESSAGE
));
1918 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1920 BaseSetLastNTError(Status
);
1924 return NT_SUCCESS(Status
);
1928 /******************************************************************************
1929 * \name SetConsoleInputExeNameW
1930 * \brief Sets the console input file name from a unicode string.
1931 * \param lpInputExeName Pointer to a unicode string with the name.
1932 * \return TRUE if successful, FALSE if unsuccsedful.
1933 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
1934 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
1938 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
1943 || (lenName
= lstrlenW(lpInputExeName
)) == 0
1944 || lenName
> INPUTEXENAME_BUFLEN
- 1)
1946 /* Fail if string is empty or too long */
1947 SetLastError(ERROR_INVALID_PARAMETER
);
1951 RtlEnterCriticalSection(&ConsoleLock
);
1954 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
1955 InputExeName
[lenName
] = L
'\0';
1959 RtlLeaveCriticalSection(&ConsoleLock
);
1967 /******************************************************************************
1968 * \name SetConsoleInputExeNameA
1969 * \brief Sets the console input file name from an ansi string.
1970 * \param lpInputExeName Pointer to an ansi string with the name.
1971 * \return TRUE if successful, FALSE if unsuccsedful.
1972 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
1973 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
1977 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
1979 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
1980 ANSI_STRING InputExeNameA
;
1981 UNICODE_STRING InputExeNameU
;
1985 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
1987 if(InputExeNameA
.Length
== 0 ||
1988 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
1990 /* Fail if string is empty or too long */
1991 SetLastError(ERROR_INVALID_PARAMETER
);
1995 InputExeNameU
.Buffer
= Buffer
;
1996 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
1997 InputExeNameU
.Length
= 0;
1998 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
1999 if(NT_SUCCESS(Status
))
2001 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
2005 BaseSetLastNTError(Status
);
2013 /******************************************************************************
2014 * \name GetConsoleInputExeNameW
2015 * \brief Retrieves the console input file name as unicode string.
2016 * \param nBufferLength Length of the buffer in WCHARs.
2017 * Specify 0 to recieve the needed buffer length.
2018 * \param lpBuffer Pointer to a buffer that recieves the string.
2019 * \return Needed buffer size if \p nBufferLength is 0.
2020 * Otherwise 1 if successful, 2 if buffer is too small.
2021 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2022 * is not big enough.
2026 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
2028 int lenName
= lstrlenW(InputExeName
);
2030 if (nBufferLength
== 0)
2032 /* Buffer size is requested, return it */
2036 if(lenName
+ 1 > nBufferLength
)
2038 /* Buffer is not large enough! */
2039 SetLastError(ERROR_BUFFER_OVERFLOW
);
2043 RtlEnterCriticalSection(&ConsoleLock
);
2046 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
2047 lpBuffer
[lenName
] = '\0';
2051 RtlLeaveCriticalSection(&ConsoleLock
);
2055 /* Success, return 1 */
2060 /******************************************************************************
2061 * \name GetConsoleInputExeNameA
2062 * \brief Retrieves the console input file name as ansi string.
2063 * \param nBufferLength Length of the buffer in CHARs.
2064 * \param lpBuffer Pointer to a buffer that recieves the string.
2065 * \return 1 if successful, 2 if buffer is too small.
2066 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2067 * is not big enough. The buffer recieves as much characters as fit.
2071 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
2073 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2075 UNICODE_STRING BufferU
;
2076 ANSI_STRING BufferA
;
2078 /* Get the unicode name */
2079 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
2081 /* Initialize strings for conversion */
2082 RtlInitUnicodeString(&BufferU
, Buffer
);
2084 BufferA
.MaximumLength
= nBufferLength
;
2085 BufferA
.Buffer
= lpBuffer
;
2087 /* Convert unicode name to ansi, copying as much chars as fit */
2088 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
2090 /* Error handling */
2091 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
2093 SetLastError(ERROR_BUFFER_OVERFLOW
);
2102 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
2110 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
2118 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
2126 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
2134 RegisterConsoleOS2(BOOL bUnknown
)
2142 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
2150 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
2158 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
2166 SetConsoleOS2OemFormat(BOOL bUnknown
)
2174 UnregisterConsoleIME(VOID
)
2184 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
2193 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
2204 SetLastConsoleEventActive(VOID
)