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 if (lpConsoleScreenBufferInfo
== NULL
)
869 SetLastError(ERROR_INVALID_PARAMETER
);
873 ApiMessage
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
875 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
877 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetScreenBufferInfo
),
878 sizeof(CSRSS_SCREEN_BUFFER_INFO
));
879 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
881 BaseSetLastNTError(Status
);
885 *lpConsoleScreenBufferInfo
= ApiMessage
.Data
.ScreenBufferInfoRequest
.Info
;
891 /*--------------------------------------------------------------
892 * SetConsoleCursorPosition
898 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
899 COORD dwCursorPosition
)
902 CONSOLE_API_MESSAGE ApiMessage
;
904 ApiMessage
.Data
.SetCursorPositionRequest
.ConsoleHandle
= hConsoleOutput
;
905 ApiMessage
.Data
.SetCursorPositionRequest
.Position
= dwCursorPosition
;
907 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
909 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorPosition
),
910 sizeof(CSRSS_SET_CURSOR_POSITION
));
911 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
913 BaseSetLastNTError(Status
);
921 /*--------------------------------------------------------------
928 GetConsoleMode(HANDLE hConsoleHandle
,
932 CONSOLE_API_MESSAGE ApiMessage
;
933 PCSRSS_CONSOLE_MODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
935 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
937 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
939 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetMode
),
940 sizeof(CSRSS_CONSOLE_MODE
));
941 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
943 BaseSetLastNTError(Status
);
947 *lpMode
= ConsoleModeRequest
->ConsoleMode
;
953 /*--------------------------------------------------------------
954 * GetNumberOfConsoleInputEvents
960 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
961 LPDWORD lpNumberOfEvents
)
964 CONSOLE_API_MESSAGE ApiMessage
;
966 if (lpNumberOfEvents
== NULL
)
968 SetLastError(ERROR_INVALID_PARAMETER
);
972 ApiMessage
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
974 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
976 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetNumberOfInputEvents
),
977 sizeof(CSRSS_GET_NUM_INPUT_EVENTS
));
978 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
980 BaseSetLastNTError(Status
);
984 *lpNumberOfEvents
= ApiMessage
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
990 /*--------------------------------------------------------------
991 * GetLargestConsoleWindowSize
997 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
999 COORD Coord
= {80,25};
1000 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
1001 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1006 /*--------------------------------------------------------------
1007 * GetConsoleCursorInfo
1013 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
1014 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
1017 CONSOLE_API_MESSAGE ApiMessage
;
1019 if (!lpConsoleCursorInfo
)
1021 if (!hConsoleOutput
)
1022 SetLastError(ERROR_INVALID_HANDLE
);
1024 SetLastError(ERROR_INVALID_ACCESS
);
1029 ApiMessage
.Data
.CursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1031 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1033 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCursorInfo
),
1034 sizeof(CSRSS_CURSOR_INFO
));
1035 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1037 BaseSetLastNTError(Status
);
1041 *lpConsoleCursorInfo
= ApiMessage
.Data
.CursorInfoRequest
.Info
;
1047 /*--------------------------------------------------------------
1048 * GetNumberOfConsoleMouseButtons
1054 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
1056 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
1057 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1062 /*--------------------------------------------------------------
1069 SetConsoleMode(HANDLE hConsoleHandle
,
1073 CONSOLE_API_MESSAGE ApiMessage
;
1074 PCSRSS_CONSOLE_MODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1076 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
1077 ConsoleModeRequest
->ConsoleMode
= dwMode
;
1079 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1081 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetMode
),
1082 sizeof(CSRSS_CONSOLE_MODE
));
1083 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1085 BaseSetLastNTError(Status
);
1093 /*--------------------------------------------------------------
1094 * SetConsoleActiveScreenBuffer
1100 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
1103 CONSOLE_API_MESSAGE ApiMessage
;
1105 ApiMessage
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
1107 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1109 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetActiveScreenBuffer
),
1110 sizeof(CSRSS_SET_SCREEN_BUFFER
));
1111 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1113 BaseSetLastNTError(Status
);
1121 /*--------------------------------------------------------------
1122 * FlushConsoleInputBuffer
1128 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
1131 CONSOLE_API_MESSAGE ApiMessage
;
1133 ApiMessage
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
1135 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1137 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFlushInputBuffer
),
1138 sizeof(CSRSS_FLUSH_INPUT_BUFFER
));
1139 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1141 BaseSetLastNTError(Status
);
1149 /*--------------------------------------------------------------
1150 * SetConsoleScreenBufferSize
1156 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
1160 CONSOLE_API_MESSAGE ApiMessage
;
1162 ApiMessage
.Data
.SetScreenBufferSize
.OutputHandle
= hConsoleOutput
;
1163 ApiMessage
.Data
.SetScreenBufferSize
.Size
= dwSize
;
1165 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1167 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetScreenBufferSize
),
1168 sizeof(CSRSS_SET_SCREEN_BUFFER_SIZE
));
1169 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1171 BaseSetLastNTError(Status
);
1179 /*--------------------------------------------------------------
1180 * SetConsoleCursorInfo
1186 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
1187 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
1190 CONSOLE_API_MESSAGE ApiMessage
;
1192 ApiMessage
.Data
.CursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1193 ApiMessage
.Data
.CursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
1195 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1197 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorInfo
),
1198 sizeof(CSRSS_CURSOR_INFO
));
1199 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1201 BaseSetLastNTError(Status
);
1211 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
1212 const SMALL_RECT
*lpScrollRectangle
,
1213 const SMALL_RECT
*lpClipRectangle
,
1214 COORD dwDestinationOrigin
,
1215 const CHAR_INFO
*lpFill
,
1219 CONSOLE_API_MESSAGE ApiMessage
;
1220 PCSRSS_SCROLL_CONSOLE_SCREEN_BUFFER ScrollConsoleScreenBufferRequest
= &ApiMessage
.Data
.ScrollConsoleScreenBufferRequest
;
1222 ScrollConsoleScreenBufferRequest
->ConsoleHandle
= hConsoleOutput
;
1223 ScrollConsoleScreenBufferRequest
->Unicode
= bUnicode
;
1224 ScrollConsoleScreenBufferRequest
->ScrollRectangle
= *lpScrollRectangle
;
1226 if (lpClipRectangle
!= NULL
)
1228 ScrollConsoleScreenBufferRequest
->UseClipRectangle
= TRUE
;
1229 ScrollConsoleScreenBufferRequest
->ClipRectangle
= *lpClipRectangle
;
1233 ScrollConsoleScreenBufferRequest
->UseClipRectangle
= FALSE
;
1236 ScrollConsoleScreenBufferRequest
->DestinationOrigin
= dwDestinationOrigin
;
1237 ScrollConsoleScreenBufferRequest
->Fill
= *lpFill
;
1239 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1241 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepScrollScreenBuffer
),
1242 sizeof(CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER
));
1244 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1246 BaseSetLastNTError(Status
);
1254 /*--------------------------------------------------------------
1255 * ScrollConsoleScreenBufferA
1261 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
1262 CONST SMALL_RECT
*lpScrollRectangle
,
1263 CONST SMALL_RECT
*lpClipRectangle
,
1264 COORD dwDestinationOrigin
,
1265 CONST CHAR_INFO
*lpFill
)
1267 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1268 (PSMALL_RECT
)lpScrollRectangle
,
1269 (PSMALL_RECT
)lpClipRectangle
,
1270 dwDestinationOrigin
,
1276 /*--------------------------------------------------------------
1277 * ScrollConsoleScreenBufferW
1283 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
1284 CONST SMALL_RECT
*lpScrollRectangle
,
1285 CONST SMALL_RECT
*lpClipRectangle
,
1286 COORD dwDestinationOrigin
,
1287 CONST CHAR_INFO
*lpFill
)
1289 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1292 dwDestinationOrigin
,
1298 /*--------------------------------------------------------------
1299 * SetConsoleWindowInfo
1305 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
1307 CONST SMALL_RECT
*lpConsoleWindow
)
1309 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
1310 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1315 /*--------------------------------------------------------------
1316 * SetConsoleTextAttribute
1322 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
1326 CONSOLE_API_MESSAGE ApiMessage
;
1328 ApiMessage
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1329 ApiMessage
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
1331 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1333 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTextAttribute
),
1334 sizeof(CSRSS_SET_ATTRIB
));
1335 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1337 BaseSetLastNTError(Status
);
1347 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1349 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
1351 if (HandlerRoutine
== NULL
)
1353 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
1357 if (NrCtrlHandlers
== NrAllocatedHandlers
)
1359 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
1361 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
1362 if (NewCtrlHandlers
== NULL
)
1364 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1368 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
1370 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
1372 CtrlHandlers
= NewCtrlHandlers
;
1373 NrAllocatedHandlers
+= 4;
1376 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
1378 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
1385 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1389 if (HandlerRoutine
== NULL
)
1391 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
1395 for (i
= 0; i
< NrCtrlHandlers
; i
++)
1397 if (CtrlHandlers
[i
] == HandlerRoutine
)
1399 if (i
< (NrCtrlHandlers
- 1))
1401 memmove(&CtrlHandlers
[i
],
1403 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
1411 SetLastError(ERROR_INVALID_PARAMETER
);
1421 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
1426 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
1429 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
1433 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
1436 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
1441 /*--------------------------------------------------------------
1442 * GenerateConsoleCtrlEvent
1448 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
1449 DWORD dwProcessGroupId
)
1451 CSR_API_MESSAGE Request
;
1454 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
1456 SetLastError(ERROR_INVALID_PARAMETER
);
1460 Request
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
1461 Request
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
1463 Status
= CsrClientCallServer(&Request
,
1465 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GENERATE_CTRL_EVENT
),
1466 sizeof(CSR_API_MESSAGE
));
1467 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
1469 BaseSetLastNTError(Status
);
1478 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD nSize
, BOOL bUnicode
)
1480 CSR_API_MESSAGE Request
;
1481 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1487 Request
.Data
.GetTitleRequest
.Length
= nSize
* (bUnicode
? 1 : sizeof(WCHAR
));
1488 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.GetTitleRequest
.Length
);
1489 if (CaptureBuffer
== NULL
)
1491 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1492 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1496 CsrAllocateMessagePointer(CaptureBuffer
,
1497 Request
.Data
.GetTitleRequest
.Length
,
1498 (PVOID
*)&Request
.Data
.GetTitleRequest
.Title
);
1500 Status
= CsrClientCallServer(&Request
,
1502 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_TITLE
),
1503 sizeof(CSR_API_MESSAGE
));
1504 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= Request
.Status
)))
1506 CsrFreeCaptureBuffer(CaptureBuffer
);
1507 BaseSetLastNTError(Status
);
1513 if (nSize
>= sizeof(WCHAR
))
1514 wcscpy((LPWSTR
)lpConsoleTitle
, Request
.Data
.GetTitleRequest
.Title
);
1518 if (nSize
< Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
) ||
1519 !WideCharToMultiByte(CP_ACP
, // ANSI code page
1520 0, // performance and mapping flags
1521 Request
.Data
.GetTitleRequest
.Title
, // address of wide-character string
1522 -1, // number of characters in string
1523 (LPSTR
)lpConsoleTitle
, // address of buffer for new string
1524 nSize
, // size of buffer
1528 /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
1529 *(LPSTR
)lpConsoleTitle
= '\0';
1530 Request
.Data
.GetTitleRequest
.Length
= 0;
1533 CsrFreeCaptureBuffer(CaptureBuffer
);
1535 return Request
.Data
.GetTitleRequest
.Length
/ sizeof(WCHAR
);
1538 /*--------------------------------------------------------------
1545 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
1548 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
1551 /*--------------------------------------------------------------
1558 GetConsoleTitleA(LPSTR lpConsoleTitle
,
1561 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
1565 /*--------------------------------------------------------------
1572 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
1574 CSR_API_MESSAGE Request
;
1575 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1578 Request
.Data
.SetTitleRequest
.Length
= wcslen(lpConsoleTitle
) * sizeof(WCHAR
);
1580 CaptureBuffer
= CsrAllocateCaptureBuffer(1, Request
.Data
.SetTitleRequest
.Length
);
1581 if (CaptureBuffer
== NULL
)
1583 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1584 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1588 CsrCaptureMessageBuffer(CaptureBuffer
,
1589 (PVOID
)lpConsoleTitle
,
1590 Request
.Data
.SetTitleRequest
.Length
,
1591 (PVOID
*)&Request
.Data
.SetTitleRequest
.Title
);
1593 Status
= CsrClientCallServer(&Request
,
1595 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_TITLE
),
1596 sizeof(CSR_API_MESSAGE
));
1598 CsrFreeCaptureBuffer(CaptureBuffer
);
1600 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1602 BaseSetLastNTError(Status
);
1610 /*--------------------------------------------------------------
1617 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
1619 ULONG Length
= strlen(lpConsoleTitle
) + 1;
1620 LPWSTR WideTitle
= HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
1624 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1627 MultiByteToWideChar(CP_ACP
, 0, lpConsoleTitle
, -1, WideTitle
, Length
);
1628 Ret
= SetConsoleTitleW(WideTitle
);
1629 HeapFree(GetProcessHeap(), 0, WideTitle
);
1634 /*--------------------------------------------------------------
1635 * CreateConsoleScreenBuffer
1641 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
1643 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1645 LPVOID lpScreenBufferData
)
1648 CONSOLE_API_MESSAGE ApiMessage
;
1650 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
1651 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) ||
1652 (dwFlags
!= CONSOLE_TEXTMODE_BUFFER
) )
1654 SetLastError(ERROR_INVALID_PARAMETER
);
1655 return INVALID_HANDLE_VALUE
;
1658 ApiMessage
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
1659 ApiMessage
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
1660 ApiMessage
.Data
.CreateScreenBufferRequest
.Inheritable
=
1661 (lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
);
1663 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1665 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCreateScreenBuffer
),
1666 sizeof(CSRSS_CREATE_SCREEN_BUFFER
));
1667 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1669 BaseSetLastNTError(Status
);
1670 return INVALID_HANDLE_VALUE
;
1673 return ApiMessage
.Data
.CreateScreenBufferRequest
.OutputHandle
;
1677 /*--------------------------------------------------------------
1686 CSR_API_MESSAGE Request
;
1689 Status
= CsrClientCallServer(&Request
,
1691 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_CP
),
1692 sizeof(CSR_API_MESSAGE
));
1693 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1695 BaseSetLastNTError (Status
);
1699 return Request
.Data
.GetConsoleCodePage
.CodePage
;
1703 /*--------------------------------------------------------------
1710 SetConsoleCP(UINT wCodePageID
)
1712 CSR_API_MESSAGE Request
;
1715 Request
.Data
.SetConsoleCodePage
.CodePage
= wCodePageID
;
1717 Status
= CsrClientCallServer(&Request
,
1719 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_CP
),
1720 sizeof(CSR_API_MESSAGE
));
1721 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1723 BaseSetLastNTError(Status
);
1726 return NT_SUCCESS(Status
);
1730 /*--------------------------------------------------------------
1731 * GetConsoleOutputCP
1737 GetConsoleOutputCP(VOID
)
1739 CSR_API_MESSAGE Request
;
1742 Status
= CsrClientCallServer(&Request
,
1744 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_CONSOLE_OUTPUT_CP
),
1745 sizeof(CSR_API_MESSAGE
));
1746 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1748 BaseSetLastNTError (Status
);
1752 return Request
.Data
.GetConsoleOutputCodePage
.CodePage
;
1756 /*--------------------------------------------------------------
1757 * SetConsoleOutputCP
1763 SetConsoleOutputCP(UINT wCodePageID
)
1765 CSR_API_MESSAGE Request
;
1768 Request
.Data
.SetConsoleOutputCodePage
.CodePage
= wCodePageID
;
1770 Status
= CsrClientCallServer(&Request
,
1772 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, SET_CONSOLE_OUTPUT_CP
),
1773 sizeof(CSR_API_MESSAGE
));
1774 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1776 BaseSetLastNTError(Status
);
1779 return NT_SUCCESS(Status
);
1783 /*--------------------------------------------------------------
1784 * GetConsoleProcessList
1790 GetConsoleProcessList(LPDWORD lpdwProcessList
,
1791 DWORD dwProcessCount
)
1793 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1794 CSR_API_MESSAGE Request
;
1798 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
1800 SetLastError(ERROR_INVALID_PARAMETER
);
1804 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
1805 if (CaptureBuffer
== NULL
)
1807 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1808 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1812 Request
.Data
.GetProcessListRequest
.nMaxIds
= dwProcessCount
;
1813 CsrAllocateMessagePointer(CaptureBuffer
,
1814 dwProcessCount
* sizeof(DWORD
),
1815 (PVOID
*)&Request
.Data
.GetProcessListRequest
.ProcessId
);
1817 Status
= CsrClientCallServer(&Request
,
1819 CSR_CREATE_API_NUMBER(CSR_CONSOLE
, GET_PROCESS_LIST
),
1820 sizeof(CSR_API_MESSAGE
));
1821 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= Request
.Status
))
1823 BaseSetLastNTError (Status
);
1828 nProcesses
= Request
.Data
.GetProcessListRequest
.nProcessIdsTotal
;
1829 if (dwProcessCount
>= nProcesses
)
1831 memcpy(lpdwProcessList
, Request
.Data
.GetProcessListRequest
.ProcessId
, nProcesses
* sizeof(DWORD
));
1835 CsrFreeCaptureBuffer(CaptureBuffer
);
1840 /*--------------------------------------------------------------
1841 * GetConsoleSelectionInfo
1847 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
1850 CONSOLE_API_MESSAGE ApiMessage
;
1852 if (lpConsoleSelectionInfo
== NULL
)
1854 SetLastError(ERROR_INVALID_PARAMETER
);
1858 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1860 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetSelectionInfo
),
1861 sizeof(CSRSS_GET_CONSOLE_SELECTION_INFO
));
1862 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1864 BaseSetLastNTError(Status
);
1868 *lpConsoleSelectionInfo
= ApiMessage
.Data
.GetConsoleSelectionInfo
.Info
;
1873 /*--------------------------------------------------------------
1880 AttachConsole(DWORD dwProcessId
)
1882 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
1887 /*--------------------------------------------------------------
1894 GetConsoleWindow(VOID
)
1897 CONSOLE_API_MESSAGE ApiMessage
;
1899 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1901 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetConsoleWindow
),
1902 sizeof(CSRSS_GET_CONSOLE_WINDOW
));
1903 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1905 BaseSetLastNTError(Status
);
1909 return ApiMessage
.Data
.GetConsoleWindowRequest
.WindowHandle
;
1913 /*--------------------------------------------------------------
1920 SetConsoleIcon(HICON hicon
)
1923 CONSOLE_API_MESSAGE ApiMessage
;
1925 ApiMessage
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
1927 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1929 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetIcon
),
1930 sizeof(CSRSS_SET_CONSOLE_ICON
));
1931 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1933 BaseSetLastNTError(Status
);
1937 return NT_SUCCESS(Status
);
1941 /******************************************************************************
1942 * \name SetConsoleInputExeNameW
1943 * \brief Sets the console input file name from a unicode string.
1944 * \param lpInputExeName Pointer to a unicode string with the name.
1945 * \return TRUE if successful, FALSE if unsuccsedful.
1946 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
1947 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
1951 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
1956 || (lenName
= lstrlenW(lpInputExeName
)) == 0
1957 || lenName
> INPUTEXENAME_BUFLEN
- 1)
1959 /* Fail if string is empty or too long */
1960 SetLastError(ERROR_INVALID_PARAMETER
);
1964 RtlEnterCriticalSection(&ConsoleLock
);
1967 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
1968 InputExeName
[lenName
] = L
'\0';
1972 RtlLeaveCriticalSection(&ConsoleLock
);
1980 /******************************************************************************
1981 * \name SetConsoleInputExeNameA
1982 * \brief Sets the console input file name from an ansi string.
1983 * \param lpInputExeName Pointer to an ansi string with the name.
1984 * \return TRUE if successful, FALSE if unsuccsedful.
1985 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
1986 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
1990 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
1992 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
1993 ANSI_STRING InputExeNameA
;
1994 UNICODE_STRING InputExeNameU
;
1998 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
2000 if(InputExeNameA
.Length
== 0 ||
2001 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
2003 /* Fail if string is empty or too long */
2004 SetLastError(ERROR_INVALID_PARAMETER
);
2008 InputExeNameU
.Buffer
= Buffer
;
2009 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
2010 InputExeNameU
.Length
= 0;
2011 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
2012 if(NT_SUCCESS(Status
))
2014 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
2018 BaseSetLastNTError(Status
);
2026 /******************************************************************************
2027 * \name GetConsoleInputExeNameW
2028 * \brief Retrieves the console input file name as unicode string.
2029 * \param nBufferLength Length of the buffer in WCHARs.
2030 * Specify 0 to recieve the needed buffer length.
2031 * \param lpBuffer Pointer to a buffer that recieves the string.
2032 * \return Needed buffer size if \p nBufferLength is 0.
2033 * Otherwise 1 if successful, 2 if buffer is too small.
2034 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2035 * is not big enough.
2039 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
2041 int lenName
= lstrlenW(InputExeName
);
2043 if (nBufferLength
== 0)
2045 /* Buffer size is requested, return it */
2049 if(lenName
+ 1 > nBufferLength
)
2051 /* Buffer is not large enough! */
2052 SetLastError(ERROR_BUFFER_OVERFLOW
);
2056 RtlEnterCriticalSection(&ConsoleLock
);
2059 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
2060 lpBuffer
[lenName
] = '\0';
2064 RtlLeaveCriticalSection(&ConsoleLock
);
2068 /* Success, return 1 */
2073 /******************************************************************************
2074 * \name GetConsoleInputExeNameA
2075 * \brief Retrieves the console input file name as ansi string.
2076 * \param nBufferLength Length of the buffer in CHARs.
2077 * \param lpBuffer Pointer to a buffer that recieves the string.
2078 * \return 1 if successful, 2 if buffer is too small.
2079 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2080 * is not big enough. The buffer recieves as much characters as fit.
2084 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
2086 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2088 UNICODE_STRING BufferU
;
2089 ANSI_STRING BufferA
;
2091 /* Get the unicode name */
2092 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
2094 /* Initialize strings for conversion */
2095 RtlInitUnicodeString(&BufferU
, Buffer
);
2097 BufferA
.MaximumLength
= nBufferLength
;
2098 BufferA
.Buffer
= lpBuffer
;
2100 /* Convert unicode name to ansi, copying as much chars as fit */
2101 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
2103 /* Error handling */
2104 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
2106 SetLastError(ERROR_BUFFER_OVERFLOW
);
2115 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
2123 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
2131 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
2139 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
2147 RegisterConsoleOS2(BOOL bUnknown
)
2155 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
2163 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
2171 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
2179 SetConsoleOS2OemFormat(BOOL bUnknown
)
2187 UnregisterConsoleIME(VOID
)
2197 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
2206 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
2217 SetLastConsoleEventActive(VOID
)