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 /// HACK !!!!!!!!!!!!!
330 CONSOLE_API_MESSAGE ApiMessage
;
332 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
334 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, GET_INPUT_WAIT_HANDLE
),
335 sizeof(CSRSS_GET_INPUT_WAIT_HANDLE
));
336 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
338 BaseSetLastNTError(Status
);
342 return ApiMessage
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
352 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
354 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
356 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
357 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
363 * @unimplemented (Undocumented)
367 GetNumberOfConsoleFonts(VOID
)
369 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
370 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
376 * @unimplemented (Undocumented)
380 InvalidateConsoleDIBits(DWORD Unknown0
,
383 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
384 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
390 * @unimplemented (Undocumented)
394 OpenConsoleW(LPCWSTR wsName
,
395 DWORD dwDesiredAccess
,
399 NTSTATUS Status
= STATUS_SUCCESS
;
400 CONSOLE_API_MESSAGE ApiMessage
;
401 PCSRSS_OPEN_CONSOLE OpenConsoleRequest
= &ApiMessage
.Data
.OpenConsoleRequest
;
402 CONSOLE_HANDLE_TYPE HandleType
;
404 if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONIN$"))
406 HandleType
= HANDLE_INPUT
;
408 else if (wsName
&& 0 == _wcsicmp(wsName
, L
"CONOUT$"))
410 HandleType
= HANDLE_OUTPUT
;
414 SetLastError(ERROR_INVALID_PARAMETER
);
415 return INVALID_HANDLE_VALUE
;
418 if (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
))
420 SetLastError(ERROR_INVALID_PARAMETER
);
421 return INVALID_HANDLE_VALUE
;
424 if (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
))
426 SetLastError(ERROR_INVALID_PARAMETER
);
427 return INVALID_HANDLE_VALUE
;
430 OpenConsoleRequest
->HandleType
= HandleType
;
431 OpenConsoleRequest
->Access
= dwDesiredAccess
;
432 OpenConsoleRequest
->Inheritable
= bInheritHandle
;
433 OpenConsoleRequest
->ShareMode
= dwShareMode
;
435 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
437 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepOpenConsole
),
438 sizeof(CSRSS_OPEN_CONSOLE
));
439 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
441 BaseSetLastNTError(Status
);
442 return INVALID_HANDLE_VALUE
;
445 return OpenConsoleRequest
->Handle
;
450 * @unimplemented (Undocumented)
454 SetConsoleCursor(DWORD Unknown0
,
457 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
458 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
468 SetConsoleDisplayMode(HANDLE hOut
,
472 * FUNCTION: Set the console display mode.
474 * hOut - Standard output handle.
475 * dwNewMode - New mode.
476 * lpdwOldMode - Address of a variable that receives the old mode.
479 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
480 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
486 * @unimplemented (Undocumented)
490 SetConsoleFont(DWORD Unknown0
,
493 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
494 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
500 * @implemented (Undocumented)
504 SetConsoleHardwareState(HANDLE hConsole
,
509 CONSOLE_API_MESSAGE ApiMessage
;
510 PCSRSS_CONSOLE_HW_STATE ConsoleHardwareStateRequest
= &ApiMessage
.Data
.ConsoleHardwareStateRequest
;
512 ConsoleHardwareStateRequest
->ConsoleHandle
= hConsole
;
513 ConsoleHardwareStateRequest
->State
= State
;
515 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
517 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetHardwareState
),
518 sizeof(CSRSS_CONSOLE_HW_STATE
));
519 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
521 BaseSetLastNTError(Status
);
530 * @unimplemented (Undocumented)
534 SetConsoleKeyShortcuts(DWORD Unknown0
,
539 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
540 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
546 * @unimplemented (Undocumented)
550 SetConsoleMaximumWindowSize(DWORD Unknown0
,
553 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
554 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
560 * @unimplemented (Undocumented)
564 SetConsoleMenuClose(DWORD Unknown0
)
566 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
567 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
573 * @unimplemented (Undocumented)
577 SetConsolePalette(DWORD Unknown0
,
581 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
582 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
587 * @unimplemented (Undocumented)
591 ShowConsoleCursor(DWORD Unknown0
,
594 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
595 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
601 * FUNCTION: Checks whether the given handle is a valid console handle.
604 * Handle - Handle to be checked
607 * TRUE: Handle is a valid console handle
608 * FALSE: Handle is not a valid console handle.
610 * STATUS: Officially undocumented
616 VerifyConsoleIoHandle(HANDLE Handle
)
619 CONSOLE_API_MESSAGE ApiMessage
;
621 ApiMessage
.Data
.VerifyHandleRequest
.Handle
= Handle
;
623 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
625 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepVerifyIoHandle
),
626 sizeof(CSRSS_VERIFY_HANDLE
));
627 if (!NT_SUCCESS(Status
))
629 BaseSetLastNTError(Status
);
633 return (BOOL
)NT_SUCCESS(ApiMessage
.Status
);
642 WriteConsoleInputVDMA(DWORD Unknown0
,
647 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
648 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
658 WriteConsoleInputVDMW(DWORD Unknown0
,
663 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
664 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
670 * @implemented (Undocumented)
674 CloseConsoleHandle(HANDLE Handle
)
677 CONSOLE_API_MESSAGE ApiMessage
;
679 ApiMessage
.Data
.CloseHandleRequest
.Handle
= Handle
;
681 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
683 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCloseHandle
),
684 sizeof(CSRSS_CLOSE_HANDLE
));
685 if (!NT_SUCCESS(Status
))
687 BaseSetLastNTError(Status
);
700 GetStdHandle(DWORD nStdHandle
)
702 * FUNCTION: Get a handle for the standard input, standard output
703 * and a standard error device.
706 * nStdHandle - Specifies the device for which to return the handle.
708 * RETURNS: If the function succeeds, the return value is the handle
709 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
712 PRTL_USER_PROCESS_PARAMETERS Ppb
;
714 Ppb
= NtCurrentPeb()->ProcessParameters
;
717 case STD_INPUT_HANDLE
:
718 return Ppb
->StandardInput
;
720 case STD_OUTPUT_HANDLE
:
721 return Ppb
->StandardOutput
;
723 case STD_ERROR_HANDLE
:
724 return Ppb
->StandardError
;
727 SetLastError(ERROR_INVALID_PARAMETER
);
728 return INVALID_HANDLE_VALUE
;
737 SetStdHandle(DWORD nStdHandle
,
740 * FUNCTION: Set the handle for the standard input, standard output or
741 * the standard error device.
744 * nStdHandle - Specifies the handle to be set.
745 * hHandle - The handle to set.
747 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
750 PRTL_USER_PROCESS_PARAMETERS Ppb
;
752 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
754 Ppb
= NtCurrentPeb()->ProcessParameters
;
758 case STD_INPUT_HANDLE
:
759 Ppb
->StandardInput
= hHandle
;
762 case STD_OUTPUT_HANDLE
:
763 Ppb
->StandardOutput
= hHandle
;
766 case STD_ERROR_HANDLE
:
767 Ppb
->StandardError
= hHandle
;
771 /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
772 SetLastError(ERROR_INVALID_HANDLE
);
777 /*--------------------------------------------------------------
787 CONSOLE_API_MESSAGE ApiMessage
;
788 PCSRSS_ALLOC_CONSOLE AllocConsoleRequest
= &ApiMessage
.Data
.AllocConsoleRequest
;
792 if (NtCurrentPeb()->ProcessParameters
->ConsoleHandle
)
794 DPRINT("AllocConsole: Allocate duplicate console to the same Process\n");
795 BaseSetLastNTError (STATUS_OBJECT_NAME_EXISTS
);
801 AllocConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
802 AllocConsoleRequest
->ConsoleNeeded
= TRUE
;
803 AllocConsoleRequest
->ShowCmd
= si
.wShowWindow
;
805 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
807 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAlloc
),
808 sizeof(CSRSS_ALLOC_CONSOLE
));
809 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
811 BaseSetLastNTError(Status
);
815 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= AllocConsoleRequest
->Console
;
817 SetStdHandle(STD_INPUT_HANDLE
, AllocConsoleRequest
->InputHandle
);
818 SetStdHandle(STD_OUTPUT_HANDLE
, AllocConsoleRequest
->OutputHandle
);
820 hStdError
= DuplicateConsoleHandle(AllocConsoleRequest
->OutputHandle
,
823 DUPLICATE_SAME_ACCESS
);
825 SetStdHandle(STD_ERROR_HANDLE
, hStdError
);
830 /*--------------------------------------------------------------
839 // AG: I'm not sure if this is correct (what happens to std handles?)
840 // but I just tried to reverse what AllocConsole() does...
843 CONSOLE_API_MESSAGE ApiMessage
;
845 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
847 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFree
),
848 sizeof(CSRSS_FREE_CONSOLE
));
849 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
851 BaseSetLastNTError(Status
);
855 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
860 /*--------------------------------------------------------------
861 * GetConsoleScreenBufferInfo
867 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
868 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
871 CONSOLE_API_MESSAGE ApiMessage
;
873 if (lpConsoleScreenBufferInfo
== NULL
)
875 SetLastError(ERROR_INVALID_PARAMETER
);
879 ApiMessage
.Data
.ScreenBufferInfoRequest
.ConsoleHandle
= hConsoleOutput
;
881 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
883 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetScreenBufferInfo
),
884 sizeof(CSRSS_SCREEN_BUFFER_INFO
));
885 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
887 BaseSetLastNTError(Status
);
891 *lpConsoleScreenBufferInfo
= ApiMessage
.Data
.ScreenBufferInfoRequest
.Info
;
897 /*--------------------------------------------------------------
898 * SetConsoleCursorPosition
904 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
905 COORD dwCursorPosition
)
908 CONSOLE_API_MESSAGE ApiMessage
;
910 ApiMessage
.Data
.SetCursorPositionRequest
.ConsoleHandle
= hConsoleOutput
;
911 ApiMessage
.Data
.SetCursorPositionRequest
.Position
= dwCursorPosition
;
913 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
915 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorPosition
),
916 sizeof(CSRSS_SET_CURSOR_POSITION
));
917 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
919 BaseSetLastNTError(Status
);
927 /*--------------------------------------------------------------
934 GetConsoleMode(HANDLE hConsoleHandle
,
938 CONSOLE_API_MESSAGE ApiMessage
;
939 PCSRSS_CONSOLE_MODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
941 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
943 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
945 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetMode
),
946 sizeof(CSRSS_CONSOLE_MODE
));
947 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
949 BaseSetLastNTError(Status
);
953 *lpMode
= ConsoleModeRequest
->ConsoleMode
;
959 /*--------------------------------------------------------------
960 * GetNumberOfConsoleInputEvents
966 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
967 LPDWORD lpNumberOfEvents
)
970 CONSOLE_API_MESSAGE ApiMessage
;
972 if (lpNumberOfEvents
== NULL
)
974 SetLastError(ERROR_INVALID_PARAMETER
);
978 ApiMessage
.Data
.GetNumInputEventsRequest
.ConsoleHandle
= hConsoleInput
;
980 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
982 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetNumberOfInputEvents
),
983 sizeof(CSRSS_GET_NUM_INPUT_EVENTS
));
984 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
986 BaseSetLastNTError(Status
);
990 *lpNumberOfEvents
= ApiMessage
.Data
.GetNumInputEventsRequest
.NumInputEvents
;
996 /*--------------------------------------------------------------
997 * GetLargestConsoleWindowSize
1003 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
1005 COORD Coord
= {80,25};
1006 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
1007 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1012 /*--------------------------------------------------------------
1013 * GetConsoleCursorInfo
1019 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
1020 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
1023 CONSOLE_API_MESSAGE ApiMessage
;
1025 if (!lpConsoleCursorInfo
)
1027 if (!hConsoleOutput
)
1028 SetLastError(ERROR_INVALID_HANDLE
);
1030 SetLastError(ERROR_INVALID_ACCESS
);
1035 ApiMessage
.Data
.CursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1037 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1039 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCursorInfo
),
1040 sizeof(CSRSS_CURSOR_INFO
));
1041 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1043 BaseSetLastNTError(Status
);
1047 *lpConsoleCursorInfo
= ApiMessage
.Data
.CursorInfoRequest
.Info
;
1053 /*--------------------------------------------------------------
1054 * GetNumberOfConsoleMouseButtons
1060 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
1062 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
1063 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1068 /*--------------------------------------------------------------
1075 SetConsoleMode(HANDLE hConsoleHandle
,
1079 CONSOLE_API_MESSAGE ApiMessage
;
1080 PCSRSS_CONSOLE_MODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1082 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
1083 ConsoleModeRequest
->ConsoleMode
= dwMode
;
1085 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1087 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetMode
),
1088 sizeof(CSRSS_CONSOLE_MODE
));
1089 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1091 BaseSetLastNTError(Status
);
1099 /*--------------------------------------------------------------
1100 * SetConsoleActiveScreenBuffer
1106 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
1109 CONSOLE_API_MESSAGE ApiMessage
;
1111 ApiMessage
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
1113 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1115 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetActiveScreenBuffer
),
1116 sizeof(CSRSS_SET_SCREEN_BUFFER
));
1117 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1119 BaseSetLastNTError(Status
);
1127 /*--------------------------------------------------------------
1128 * FlushConsoleInputBuffer
1134 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
1137 CONSOLE_API_MESSAGE ApiMessage
;
1139 ApiMessage
.Data
.FlushInputBufferRequest
.ConsoleInput
= hConsoleInput
;
1141 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1143 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFlushInputBuffer
),
1144 sizeof(CSRSS_FLUSH_INPUT_BUFFER
));
1145 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1147 BaseSetLastNTError(Status
);
1155 /*--------------------------------------------------------------
1156 * SetConsoleScreenBufferSize
1162 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
1166 CONSOLE_API_MESSAGE ApiMessage
;
1168 ApiMessage
.Data
.SetScreenBufferSize
.OutputHandle
= hConsoleOutput
;
1169 ApiMessage
.Data
.SetScreenBufferSize
.Size
= dwSize
;
1171 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1173 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetScreenBufferSize
),
1174 sizeof(CSRSS_SET_SCREEN_BUFFER_SIZE
));
1175 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1177 BaseSetLastNTError(Status
);
1185 /*--------------------------------------------------------------
1186 * SetConsoleCursorInfo
1192 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
1193 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
1196 CONSOLE_API_MESSAGE ApiMessage
;
1198 ApiMessage
.Data
.CursorInfoRequest
.ConsoleHandle
= hConsoleOutput
;
1199 ApiMessage
.Data
.CursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
1201 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1203 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorInfo
),
1204 sizeof(CSRSS_CURSOR_INFO
));
1205 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1207 BaseSetLastNTError(Status
);
1217 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
1218 const SMALL_RECT
*lpScrollRectangle
,
1219 const SMALL_RECT
*lpClipRectangle
,
1220 COORD dwDestinationOrigin
,
1221 const CHAR_INFO
*lpFill
,
1225 CONSOLE_API_MESSAGE ApiMessage
;
1226 PCSRSS_SCROLL_CONSOLE_SCREEN_BUFFER ScrollConsoleScreenBufferRequest
= &ApiMessage
.Data
.ScrollConsoleScreenBufferRequest
;
1228 ScrollConsoleScreenBufferRequest
->ConsoleHandle
= hConsoleOutput
;
1229 ScrollConsoleScreenBufferRequest
->Unicode
= bUnicode
;
1230 ScrollConsoleScreenBufferRequest
->ScrollRectangle
= *lpScrollRectangle
;
1232 if (lpClipRectangle
!= NULL
)
1234 ScrollConsoleScreenBufferRequest
->UseClipRectangle
= TRUE
;
1235 ScrollConsoleScreenBufferRequest
->ClipRectangle
= *lpClipRectangle
;
1239 ScrollConsoleScreenBufferRequest
->UseClipRectangle
= FALSE
;
1242 ScrollConsoleScreenBufferRequest
->DestinationOrigin
= dwDestinationOrigin
;
1243 ScrollConsoleScreenBufferRequest
->Fill
= *lpFill
;
1245 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1247 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepScrollScreenBuffer
),
1248 sizeof(CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER
));
1250 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1252 BaseSetLastNTError(Status
);
1260 /*--------------------------------------------------------------
1261 * ScrollConsoleScreenBufferA
1267 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
1268 CONST SMALL_RECT
*lpScrollRectangle
,
1269 CONST SMALL_RECT
*lpClipRectangle
,
1270 COORD dwDestinationOrigin
,
1271 CONST CHAR_INFO
*lpFill
)
1273 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1274 (PSMALL_RECT
)lpScrollRectangle
,
1275 (PSMALL_RECT
)lpClipRectangle
,
1276 dwDestinationOrigin
,
1282 /*--------------------------------------------------------------
1283 * ScrollConsoleScreenBufferW
1289 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
1290 CONST SMALL_RECT
*lpScrollRectangle
,
1291 CONST SMALL_RECT
*lpClipRectangle
,
1292 COORD dwDestinationOrigin
,
1293 CONST CHAR_INFO
*lpFill
)
1295 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1298 dwDestinationOrigin
,
1304 /*--------------------------------------------------------------
1305 * SetConsoleWindowInfo
1311 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
1313 CONST SMALL_RECT
*lpConsoleWindow
)
1315 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
1316 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1321 /*--------------------------------------------------------------
1322 * SetConsoleTextAttribute
1328 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
1332 CONSOLE_API_MESSAGE ApiMessage
;
1334 ApiMessage
.Data
.SetAttribRequest
.ConsoleHandle
= hConsoleOutput
;
1335 ApiMessage
.Data
.SetAttribRequest
.Attrib
= wAttributes
;
1337 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1339 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTextAttribute
),
1340 sizeof(CSRSS_SET_ATTRIB
));
1341 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1343 BaseSetLastNTError(Status
);
1353 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1355 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
1357 if (HandlerRoutine
== NULL
)
1359 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
1363 if (NrCtrlHandlers
== NrAllocatedHandlers
)
1365 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
1367 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
1368 if (NewCtrlHandlers
== NULL
)
1370 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1374 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
1376 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
1378 CtrlHandlers
= NewCtrlHandlers
;
1379 NrAllocatedHandlers
+= 4;
1382 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
1384 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
1391 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1395 if (HandlerRoutine
== NULL
)
1397 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
1401 for (i
= 0; i
< NrCtrlHandlers
; i
++)
1403 if (CtrlHandlers
[i
] == HandlerRoutine
)
1405 if (i
< (NrCtrlHandlers
- 1))
1407 memmove(&CtrlHandlers
[i
],
1409 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
1417 SetLastError(ERROR_INVALID_PARAMETER
);
1427 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
1432 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
1435 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
1439 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
1442 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
1447 /*--------------------------------------------------------------
1448 * GenerateConsoleCtrlEvent
1454 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
1455 DWORD dwProcessGroupId
)
1458 CONSOLE_API_MESSAGE ApiMessage
;
1460 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
1462 SetLastError(ERROR_INVALID_PARAMETER
);
1466 ApiMessage
.Data
.GenerateCtrlEvent
.Event
= dwCtrlEvent
;
1467 ApiMessage
.Data
.GenerateCtrlEvent
.ProcessGroup
= dwProcessGroupId
;
1469 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1471 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGenerateCtrlEvent
),
1472 sizeof(CSRSS_GENERATE_CTRL_EVENT
));
1473 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= ApiMessage
.Status
)))
1475 BaseSetLastNTError(Status
);
1484 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD nSize
, BOOL bUnicode
)
1487 CONSOLE_API_MESSAGE ApiMessage
;
1488 PCSRSS_CONSOLE_TITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1489 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1494 TitleRequest
->Length
= nSize
* (bUnicode
? 1 : sizeof(WCHAR
));
1495 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1496 if (CaptureBuffer
== NULL
)
1498 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1499 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1503 CsrAllocateMessagePointer(CaptureBuffer
,
1504 TitleRequest
->Length
,
1505 (PVOID
*)&TitleRequest
->Title
);
1507 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1509 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetTitle
),
1510 sizeof(CSRSS_CONSOLE_TITLE
));
1511 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= ApiMessage
.Status
)))
1513 CsrFreeCaptureBuffer(CaptureBuffer
);
1514 BaseSetLastNTError(Status
);
1520 if (nSize
>= sizeof(WCHAR
))
1521 wcscpy((LPWSTR
)lpConsoleTitle
, TitleRequest
->Title
);
1525 if (nSize
< TitleRequest
->Length
/ sizeof(WCHAR
) ||
1526 !WideCharToMultiByte(CP_ACP
, // ANSI code page
1527 0, // performance and mapping flags
1528 TitleRequest
->Title
, // address of wide-character string
1529 -1, // number of characters in string
1530 (LPSTR
)lpConsoleTitle
, // address of buffer for new string
1531 nSize
, // size of buffer
1535 /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
1536 *(LPSTR
)lpConsoleTitle
= '\0';
1537 TitleRequest
->Length
= 0;
1540 CsrFreeCaptureBuffer(CaptureBuffer
);
1542 return TitleRequest
->Length
/ sizeof(WCHAR
);
1546 /*--------------------------------------------------------------
1553 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
1556 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
1560 /*--------------------------------------------------------------
1567 GetConsoleTitleA(LPSTR lpConsoleTitle
,
1570 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
1574 /*--------------------------------------------------------------
1581 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
1584 CONSOLE_API_MESSAGE ApiMessage
;
1585 PCSRSS_CONSOLE_TITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1586 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1588 TitleRequest
->Length
= wcslen(lpConsoleTitle
) * sizeof(WCHAR
);
1590 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1591 if (CaptureBuffer
== NULL
)
1593 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1594 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1598 CsrCaptureMessageBuffer(CaptureBuffer
,
1599 (PVOID
)lpConsoleTitle
,
1600 TitleRequest
->Length
,
1601 (PVOID
*)&TitleRequest
->Title
);
1603 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1605 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTitle
),
1606 sizeof(CSRSS_CONSOLE_TITLE
));
1608 CsrFreeCaptureBuffer(CaptureBuffer
);
1610 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1612 BaseSetLastNTError(Status
);
1620 /*--------------------------------------------------------------
1627 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
1629 ULONG Length
= strlen(lpConsoleTitle
) + 1;
1630 LPWSTR WideTitle
= HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
1634 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1637 MultiByteToWideChar(CP_ACP
, 0, lpConsoleTitle
, -1, WideTitle
, Length
);
1638 Ret
= SetConsoleTitleW(WideTitle
);
1639 HeapFree(GetProcessHeap(), 0, WideTitle
);
1644 /*--------------------------------------------------------------
1645 * CreateConsoleScreenBuffer
1651 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
1653 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1655 LPVOID lpScreenBufferData
)
1658 CONSOLE_API_MESSAGE ApiMessage
;
1660 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
1661 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) ||
1662 (dwFlags
!= CONSOLE_TEXTMODE_BUFFER
) )
1664 SetLastError(ERROR_INVALID_PARAMETER
);
1665 return INVALID_HANDLE_VALUE
;
1668 ApiMessage
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
1669 ApiMessage
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
1670 ApiMessage
.Data
.CreateScreenBufferRequest
.Inheritable
=
1671 (lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
);
1673 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1675 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCreateScreenBuffer
),
1676 sizeof(CSRSS_CREATE_SCREEN_BUFFER
));
1677 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1679 BaseSetLastNTError(Status
);
1680 return INVALID_HANDLE_VALUE
;
1683 return ApiMessage
.Data
.CreateScreenBufferRequest
.OutputHandle
;
1687 /*--------------------------------------------------------------
1697 CONSOLE_API_MESSAGE ApiMessage
;
1699 /* Get the Input Code Page */
1700 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= TRUE
;
1702 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1704 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
1705 sizeof(CSRSS_CONSOLE_CP
));
1706 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1708 BaseSetLastNTError(Status
);
1712 return ApiMessage
.Data
.ConsoleCPRequest
.CodePage
;
1716 /*--------------------------------------------------------------
1723 SetConsoleCP(UINT wCodePageID
)
1726 CONSOLE_API_MESSAGE ApiMessage
;
1728 /* Set the Input Code Page */
1729 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= TRUE
;
1730 ApiMessage
.Data
.ConsoleCPRequest
.CodePage
= wCodePageID
;
1732 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1734 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
1735 sizeof(CSRSS_CONSOLE_CP
));
1736 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1738 BaseSetLastNTError(Status
);
1741 return NT_SUCCESS(Status
);
1745 /*--------------------------------------------------------------
1746 * GetConsoleOutputCP
1752 GetConsoleOutputCP(VOID
)
1755 CONSOLE_API_MESSAGE ApiMessage
;
1757 /* Get the Output Code Page */
1758 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= FALSE
;
1760 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1762 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
1763 sizeof(CSRSS_CONSOLE_CP
));
1764 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1766 BaseSetLastNTError (Status
);
1770 return ApiMessage
.Data
.ConsoleCPRequest
.CodePage
;
1774 /*--------------------------------------------------------------
1775 * SetConsoleOutputCP
1781 SetConsoleOutputCP(UINT wCodePageID
)
1784 CONSOLE_API_MESSAGE ApiMessage
;
1786 /* Set the Output Code Page */
1787 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= FALSE
;
1788 ApiMessage
.Data
.ConsoleCPRequest
.CodePage
= wCodePageID
;
1790 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1792 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
1793 sizeof(CSRSS_CONSOLE_CP
));
1794 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1796 BaseSetLastNTError(Status
);
1799 return NT_SUCCESS(Status
);
1803 /*--------------------------------------------------------------
1804 * GetConsoleProcessList
1810 GetConsoleProcessList(LPDWORD lpdwProcessList
,
1811 DWORD dwProcessCount
)
1814 CONSOLE_API_MESSAGE ApiMessage
;
1815 PCSRSS_GET_PROCESS_LIST GetProcessListRequest
= &ApiMessage
.Data
.GetProcessListRequest
;
1816 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1819 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
1821 SetLastError(ERROR_INVALID_PARAMETER
);
1825 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
1826 if (CaptureBuffer
== NULL
)
1828 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1829 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1833 GetProcessListRequest
->nMaxIds
= dwProcessCount
;
1835 CsrAllocateMessagePointer(CaptureBuffer
,
1836 dwProcessCount
* sizeof(DWORD
),
1837 (PVOID
*)&GetProcessListRequest
->pProcessIds
);
1839 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1841 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetProcessList
),
1842 sizeof(CSRSS_GET_PROCESS_LIST
));
1843 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1845 BaseSetLastNTError (Status
);
1850 nProcesses
= GetProcessListRequest
->nProcessIdsTotal
;
1851 if (dwProcessCount
>= nProcesses
)
1853 memcpy(lpdwProcessList
, GetProcessListRequest
->pProcessIds
, nProcesses
* sizeof(DWORD
));
1857 CsrFreeCaptureBuffer(CaptureBuffer
);
1862 /*--------------------------------------------------------------
1863 * GetConsoleSelectionInfo
1869 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
1872 CONSOLE_API_MESSAGE ApiMessage
;
1874 if (lpConsoleSelectionInfo
== NULL
)
1876 SetLastError(ERROR_INVALID_PARAMETER
);
1880 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1882 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetSelectionInfo
),
1883 sizeof(CSRSS_GET_CONSOLE_SELECTION_INFO
));
1884 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1886 BaseSetLastNTError(Status
);
1890 *lpConsoleSelectionInfo
= ApiMessage
.Data
.GetConsoleSelectionInfo
.Info
;
1895 /*--------------------------------------------------------------
1902 AttachConsole(DWORD dwProcessId
)
1904 DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId
);
1909 /*--------------------------------------------------------------
1916 GetConsoleWindow(VOID
)
1919 CONSOLE_API_MESSAGE ApiMessage
;
1921 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1923 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetConsoleWindow
),
1924 sizeof(CSRSS_GET_CONSOLE_WINDOW
));
1925 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1927 BaseSetLastNTError(Status
);
1931 return ApiMessage
.Data
.GetConsoleWindowRequest
.WindowHandle
;
1935 /*--------------------------------------------------------------
1942 SetConsoleIcon(HICON hicon
)
1945 CONSOLE_API_MESSAGE ApiMessage
;
1947 ApiMessage
.Data
.SetConsoleIconRequest
.WindowIcon
= hicon
;
1949 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1951 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetIcon
),
1952 sizeof(CSRSS_SET_CONSOLE_ICON
));
1953 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1955 BaseSetLastNTError(Status
);
1959 return NT_SUCCESS(Status
);
1963 /******************************************************************************
1964 * \name SetConsoleInputExeNameW
1965 * \brief Sets the console input file name from a unicode string.
1966 * \param lpInputExeName Pointer to a unicode string with the name.
1967 * \return TRUE if successful, FALSE if unsuccsedful.
1968 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
1969 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
1973 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
1978 || (lenName
= lstrlenW(lpInputExeName
)) == 0
1979 || lenName
> INPUTEXENAME_BUFLEN
- 1)
1981 /* Fail if string is empty or too long */
1982 SetLastError(ERROR_INVALID_PARAMETER
);
1986 RtlEnterCriticalSection(&ConsoleLock
);
1989 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
1990 InputExeName
[lenName
] = L
'\0';
1994 RtlLeaveCriticalSection(&ConsoleLock
);
2002 /******************************************************************************
2003 * \name SetConsoleInputExeNameA
2004 * \brief Sets the console input file name from an ansi string.
2005 * \param lpInputExeName Pointer to an ansi string with the name.
2006 * \return TRUE if successful, FALSE if unsuccsedful.
2007 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2008 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2012 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
2014 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2015 ANSI_STRING InputExeNameA
;
2016 UNICODE_STRING InputExeNameU
;
2020 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
2022 if(InputExeNameA
.Length
== 0 ||
2023 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1)
2025 /* Fail if string is empty or too long */
2026 SetLastError(ERROR_INVALID_PARAMETER
);
2030 InputExeNameU
.Buffer
= Buffer
;
2031 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
2032 InputExeNameU
.Length
= 0;
2033 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
2034 if(NT_SUCCESS(Status
))
2036 Ret
= SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
2040 BaseSetLastNTError(Status
);
2048 /******************************************************************************
2049 * \name GetConsoleInputExeNameW
2050 * \brief Retrieves the console input file name as unicode string.
2051 * \param nBufferLength Length of the buffer in WCHARs.
2052 * Specify 0 to recieve the needed buffer length.
2053 * \param lpBuffer Pointer to a buffer that recieves the string.
2054 * \return Needed buffer size if \p nBufferLength is 0.
2055 * Otherwise 1 if successful, 2 if buffer is too small.
2056 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2057 * is not big enough.
2061 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
2063 int lenName
= lstrlenW(InputExeName
);
2065 if (nBufferLength
== 0)
2067 /* Buffer size is requested, return it */
2071 if(lenName
+ 1 > nBufferLength
)
2073 /* Buffer is not large enough! */
2074 SetLastError(ERROR_BUFFER_OVERFLOW
);
2078 RtlEnterCriticalSection(&ConsoleLock
);
2081 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
2082 lpBuffer
[lenName
] = '\0';
2086 RtlLeaveCriticalSection(&ConsoleLock
);
2090 /* Success, return 1 */
2095 /******************************************************************************
2096 * \name GetConsoleInputExeNameA
2097 * \brief Retrieves the console input file name as ansi string.
2098 * \param nBufferLength Length of the buffer in CHARs.
2099 * \param lpBuffer Pointer to a buffer that recieves the string.
2100 * \return 1 if successful, 2 if buffer is too small.
2101 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2102 * is not big enough. The buffer recieves as much characters as fit.
2106 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
2108 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2110 UNICODE_STRING BufferU
;
2111 ANSI_STRING BufferA
;
2113 /* Get the unicode name */
2114 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
2116 /* Initialize strings for conversion */
2117 RtlInitUnicodeString(&BufferU
, Buffer
);
2119 BufferA
.MaximumLength
= nBufferLength
;
2120 BufferA
.Buffer
= lpBuffer
;
2122 /* Convert unicode name to ansi, copying as much chars as fit */
2123 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
2125 /* Error handling */
2126 if(nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
2128 SetLastError(ERROR_BUFFER_OVERFLOW
);
2137 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
2145 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
2153 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
2161 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
2169 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
2177 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
2185 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
2193 RegisterConsoleOS2(BOOL bUnknown
)
2201 SetConsoleOS2OemFormat(BOOL bUnknown
)
2209 UnregisterConsoleIME(VOID
)
2219 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
2228 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
2239 SetLastConsoleEventActive(VOID
)