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 /* INCLUDES *******************************************************************/
18 /* GLOBALS ********************************************************************/
20 extern RTL_CRITICAL_SECTION ConsoleLock
;
21 extern BOOL ConsoleInitialized
;
22 extern BOOL WINAPI
IsDebuggerPresent(VOID
);
24 /* Console reserved "file" names */
25 static LPCWSTR BaseConFileName
= CONSOLE_FILE_NAME
;
26 static LPCWSTR BaseConInputFileName
= CONSOLE_INPUT_FILE_NAME
;
27 static LPCWSTR BaseConOutputFileName
= CONSOLE_OUTPUT_FILE_NAME
;
29 PHANDLER_ROUTINE InitialHandler
[1];
30 PHANDLER_ROUTINE
* CtrlHandlers
;
32 ULONG NrAllocatedHandlers
;
34 HANDLE InputWaitHandle
= INVALID_HANDLE_VALUE
;
36 #define INPUTEXENAME_BUFLEN 256
37 static WCHAR InputExeName
[INPUTEXENAME_BUFLEN
];
40 /* Default Console Control Handler ********************************************/
44 DefaultConsoleCtrlHandler(DWORD Event
)
46 DPRINT("Default handler called: %lx\n", Event
);
50 DPRINT("Ctrl-C Event\n");
53 case CTRL_BREAK_EVENT
:
54 DPRINT("Ctrl-Break Event\n");
57 case CTRL_CLOSE_EVENT
:
58 DPRINT("Ctrl Close Event\n");
61 case CTRL_LOGOFF_EVENT
:
62 DPRINT("Ctrl Logoff Event\n");
65 case CTRL_SHUTDOWN_EVENT
:
66 DPRINT("Ctrl Shutdown Event\n");
70 ExitProcess(CONTROL_C_EXIT
);
76 ConsoleControlDispatcher(IN LPVOID lpThreadParameter
)
79 DWORD CodeAndFlag
= PtrToUlong(lpThreadParameter
);
80 DWORD nCode
= CodeAndFlag
& MAXLONG
;
82 EXCEPTION_RECORD erException
;
84 DPRINT1("Console Dispatcher Active: %lx %lx\n", CodeAndFlag
, nCode
);
85 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST
);
90 case CTRL_BREAK_EVENT
:
92 if (IsDebuggerPresent())
94 erException
.ExceptionCode
= (nCode
== CTRL_C_EVENT
?
95 DBG_CONTROL_C
: DBG_CONTROL_BREAK
);
96 erException
.ExceptionFlags
= 0;
97 erException
.ExceptionRecord
= NULL
;
98 erException
.ExceptionAddress
= DefaultConsoleCtrlHandler
;
99 erException
.NumberParameters
= 0;
103 RtlRaiseException(&erException
);
105 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
107 RtlEnterCriticalSection(&ConsoleLock
);
109 if ((nCode
!= CTRL_C_EVENT
) ||
110 (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
112 for (i
= NrCtrlHandlers
; i
> 0; i
--)
114 if (CtrlHandlers
[i
- 1](nCode
)) break;
118 RtlLeaveCriticalSection(&ConsoleLock
);
127 case CTRL_CLOSE_EVENT
:
128 case CTRL_LOGOFF_EVENT
:
129 case CTRL_SHUTDOWN_EVENT
:
137 ExitProcess(CONTROL_C_EXIT
);
145 ASSERT(ConsoleInitialized
);
147 RtlEnterCriticalSection(&ConsoleLock
);
149 if ((nCode
!= CTRL_C_EVENT
) || (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
151 for (i
= NrCtrlHandlers
; i
> 0; i
--)
154 (CodeAndFlag
& MINLONG
) &&
155 ((nCode
== CTRL_LOGOFF_EVENT
) || (nCode
== CTRL_SHUTDOWN_EVENT
)))
157 DPRINT("Skipping system/service apps\n");
161 if (CtrlHandlers
[i
- 1](nCode
))
165 case CTRL_CLOSE_EVENT
:
166 case CTRL_LOGOFF_EVENT
:
167 case CTRL_SHUTDOWN_EVENT
:
169 nExitCode
= CodeAndFlag
;
177 RtlLeaveCriticalSection(&ConsoleLock
);
178 ExitThread(nExitCode
);
179 return STATUS_SUCCESS
;
184 InitConsoleCtrlHandling(VOID
)
186 /* Initialize Console Ctrl Handler */
187 NrAllocatedHandlers
= NrCtrlHandlers
= 1;
188 CtrlHandlers
= InitialHandler
;
189 CtrlHandlers
[0] = DefaultConsoleCtrlHandler
;
193 /* FUNCTIONS ******************************************************************/
196 IntCheckForConsoleFileName(IN LPCWSTR pszName
,
197 IN DWORD dwDesiredAccess
)
199 LPCWSTR ConsoleName
= pszName
;
200 ULONG DeviceNameInfo
;
203 * Check whether we deal with a DOS device, and if so,
204 * strip the path till the file name.
205 * Therefore, things like \\.\CON or C:\some_path\CONIN$
206 * are transformed into CON or CONIN$, for example.
208 DeviceNameInfo
= RtlIsDosDeviceName_U(pszName
);
209 if (DeviceNameInfo
!= 0)
211 ConsoleName
= (LPCWSTR
)((ULONG_PTR
)ConsoleName
+ ((DeviceNameInfo
>> 16) & 0xFFFF));
214 /* Return a standard console "file" name according to what we passed in parameters */
215 if (_wcsicmp(ConsoleName
, BaseConInputFileName
) == 0)
217 return BaseConInputFileName
;
219 else if (_wcsicmp(ConsoleName
, BaseConOutputFileName
) == 0)
221 return BaseConOutputFileName
;
223 else if (_wcsicmp(ConsoleName
, BaseConFileName
) == 0)
225 if ((dwDesiredAccess
& (GENERIC_READ
| GENERIC_WRITE
)) == GENERIC_READ
)
227 return BaseConInputFileName
;
229 else if ((dwDesiredAccess
& (GENERIC_READ
| GENERIC_WRITE
)) == GENERIC_WRITE
)
231 return BaseConOutputFileName
;
235 /* If we are there, that means that either the file name or the desired access are wrong */
241 * @unimplemented (Undocumented)
245 ConsoleMenuControl(HANDLE hConsole
,
249 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
250 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
260 DuplicateConsoleHandle(HANDLE hConsole
,
261 DWORD dwDesiredAccess
,
266 CONSOLE_API_MESSAGE ApiMessage
;
267 PCONSOLE_DUPLICATEHANDLE DuplicateHandleRequest
= &ApiMessage
.Data
.DuplicateHandleRequest
;
269 if ( (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)) ||
270 (!(dwOptions
& DUPLICATE_SAME_ACCESS
) &&
271 (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
))) )
273 SetLastError (ERROR_INVALID_PARAMETER
);
274 return INVALID_HANDLE_VALUE
;
277 DuplicateHandleRequest
->ConsoleHandle
= hConsole
;
278 DuplicateHandleRequest
->Access
= dwDesiredAccess
;
279 DuplicateHandleRequest
->Inheritable
= bInheritHandle
;
280 DuplicateHandleRequest
->Options
= dwOptions
;
282 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
284 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepDuplicateHandle
),
285 sizeof(CONSOLE_DUPLICATEHANDLE
));
286 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
288 BaseSetLastNTError(Status
);
289 return INVALID_HANDLE_VALUE
;
292 return DuplicateHandleRequest
->ConsoleHandle
;
301 GetConsoleDisplayMode(LPDWORD lpdwMode
)
303 * FUNCTION: Get the console display mode
305 * lpdwMode - Address of variable that receives the current value
307 * STATUS: Undocumented
310 DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode
);
311 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
317 * @unimplemented (Undocumented)
321 GetConsoleFontInfo(DWORD Unknown0
,
326 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
327 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
337 GetConsoleFontSize(HANDLE hConsoleOutput
,
340 COORD Empty
= {0, 0};
341 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
342 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
348 * @implemented (Undocumented)
352 GetConsoleHardwareState(HANDLE hConsoleOutput
,
357 CONSOLE_API_MESSAGE ApiMessage
;
358 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &ApiMessage
.Data
.HardwareStateRequest
;
360 HardwareStateRequest
->OutputHandle
= hConsoleOutput
;
362 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
364 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetHardwareState
),
365 sizeof(CONSOLE_GETSETHWSTATE
));
366 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
368 BaseSetLastNTError(Status
);
372 *State
= HardwareStateRequest
->State
;
378 * @implemented (Undocumented)
382 GetConsoleInputWaitHandle(VOID
)
386 CONSOLE_API_MESSAGE ApiMessage
;
388 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
390 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, GET_INPUT_WAIT_HANDLE
),
391 sizeof(CSRSS_GET_INPUT_WAIT_HANDLE
));
392 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
394 BaseSetLastNTError(Status
);
398 return ApiMessage
.Data
.GetConsoleInputWaitHandle
.InputWaitHandle
;
401 return InputWaitHandle
;
410 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
412 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
414 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
415 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
421 * @unimplemented (Undocumented)
425 GetNumberOfConsoleFonts(VOID
)
427 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
428 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
434 * @unimplemented (Undocumented)
438 InvalidateConsoleDIBits(DWORD Unknown0
,
441 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
442 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
448 * @unimplemented (Undocumented)
452 OpenConsoleW(LPCWSTR wsName
,
453 DWORD dwDesiredAccess
,
457 NTSTATUS Status
= STATUS_SUCCESS
;
458 CONSOLE_API_MESSAGE ApiMessage
;
459 PCONSOLE_OPENCONSOLE OpenConsoleRequest
= &ApiMessage
.Data
.OpenConsoleRequest
;
460 CONSOLE_HANDLE_TYPE HandleType
;
462 if (wsName
&& 0 == _wcsicmp(wsName
, BaseConInputFileName
))
464 HandleType
= HANDLE_INPUT
;
466 else if (wsName
&& 0 == _wcsicmp(wsName
, BaseConOutputFileName
))
468 HandleType
= HANDLE_OUTPUT
;
472 SetLastError(ERROR_INVALID_PARAMETER
);
473 return INVALID_HANDLE_VALUE
;
476 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
477 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) )
479 SetLastError(ERROR_INVALID_PARAMETER
);
480 return INVALID_HANDLE_VALUE
;
483 OpenConsoleRequest
->HandleType
= HandleType
;
484 OpenConsoleRequest
->Access
= dwDesiredAccess
;
485 OpenConsoleRequest
->Inheritable
= bInheritHandle
;
486 OpenConsoleRequest
->ShareMode
= dwShareMode
;
488 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
490 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepOpenConsole
),
491 sizeof(CONSOLE_OPENCONSOLE
));
492 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
494 BaseSetLastNTError(Status
);
495 return INVALID_HANDLE_VALUE
;
498 return OpenConsoleRequest
->ConsoleHandle
;
503 * @unimplemented (Undocumented)
507 SetConsoleCursor(DWORD Unknown0
,
510 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
511 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
521 SetConsoleDisplayMode(HANDLE hOut
,
525 * FUNCTION: Set the console display mode.
527 * hOut - Standard output handle.
528 * dwNewMode - New mode.
529 * lpdwOldMode - Address of a variable that receives the old mode.
532 DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut
, dwNewMode
, lpdwOldMode
);
533 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
539 * @unimplemented (Undocumented)
543 SetConsoleFont(DWORD Unknown0
,
546 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
547 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
553 * @implemented (Undocumented)
557 SetConsoleHardwareState(HANDLE hConsoleOutput
,
562 CONSOLE_API_MESSAGE ApiMessage
;
563 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &ApiMessage
.Data
.HardwareStateRequest
;
565 HardwareStateRequest
->OutputHandle
= hConsoleOutput
;
566 HardwareStateRequest
->State
= State
;
568 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
570 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetHardwareState
),
571 sizeof(CONSOLE_GETSETHWSTATE
));
572 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
574 BaseSetLastNTError(Status
);
583 * @unimplemented (Undocumented)
587 SetConsoleKeyShortcuts(DWORD Unknown0
,
592 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
593 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
599 * @unimplemented (Undocumented)
603 SetConsoleMaximumWindowSize(DWORD Unknown0
,
606 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
607 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
613 * @unimplemented (Undocumented)
617 SetConsoleMenuClose(DWORD Unknown0
)
619 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
620 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
626 * @unimplemented (Undocumented)
630 SetConsolePalette(DWORD Unknown0
,
634 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
635 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
640 * @unimplemented (Undocumented)
644 ShowConsoleCursor(DWORD Unknown0
,
647 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
648 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
654 * FUNCTION: Checks whether the given handle is a valid console handle.
657 * Handle - Handle to be checked
660 * TRUE: Handle is a valid console handle
661 * FALSE: Handle is not a valid console handle.
663 * STATUS: Officially undocumented
669 VerifyConsoleIoHandle(HANDLE Handle
)
672 CONSOLE_API_MESSAGE ApiMessage
;
674 ApiMessage
.Data
.VerifyHandleRequest
.ConsoleHandle
= Handle
;
676 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
678 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepVerifyIoHandle
),
679 sizeof(CONSOLE_VERIFYHANDLE
));
680 if (!NT_SUCCESS(Status
))
682 BaseSetLastNTError(Status
);
686 return (BOOL
)NT_SUCCESS(ApiMessage
.Status
);
695 WriteConsoleInputVDMA(DWORD Unknown0
,
700 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
701 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
711 WriteConsoleInputVDMW(DWORD Unknown0
,
716 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
717 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
723 * @implemented (Undocumented)
727 CloseConsoleHandle(HANDLE Handle
)
730 CONSOLE_API_MESSAGE ApiMessage
;
732 ApiMessage
.Data
.CloseHandleRequest
.ConsoleHandle
= Handle
;
734 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
736 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCloseHandle
),
737 sizeof(CONSOLE_CLOSEHANDLE
));
738 if (!NT_SUCCESS(Status
))
740 BaseSetLastNTError(Status
);
753 GetStdHandle(DWORD nStdHandle
)
755 * FUNCTION: Get a handle for the standard input, standard output
756 * and a standard error device.
759 * nStdHandle - Specifies the device for which to return the handle.
761 * RETURNS: If the function succeeds, the return value is the handle
762 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
765 PRTL_USER_PROCESS_PARAMETERS Ppb
= NtCurrentPeb()->ProcessParameters
;
769 case STD_INPUT_HANDLE
:
770 return Ppb
->StandardInput
;
772 case STD_OUTPUT_HANDLE
:
773 return Ppb
->StandardOutput
;
775 case STD_ERROR_HANDLE
:
776 return Ppb
->StandardError
;
779 SetLastError(ERROR_INVALID_HANDLE
);
780 return INVALID_HANDLE_VALUE
;
789 SetStdHandle(DWORD nStdHandle
,
792 * FUNCTION: Set the handle for the standard input, standard output or
793 * the standard error device.
796 * nStdHandle - Specifies the handle to be set.
797 * hHandle - The handle to set.
799 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
802 PRTL_USER_PROCESS_PARAMETERS Ppb
= NtCurrentPeb()->ProcessParameters
;
804 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
808 case STD_INPUT_HANDLE
:
809 Ppb
->StandardInput
= hHandle
;
812 case STD_OUTPUT_HANDLE
:
813 Ppb
->StandardOutput
= hHandle
;
816 case STD_ERROR_HANDLE
:
817 Ppb
->StandardError
= hHandle
;
821 /* Windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
822 SetLastError(ERROR_INVALID_HANDLE
);
827 /*--------------------------------------------------------------
837 PRTL_USER_PROCESS_PARAMETERS Parameters
= NtCurrentPeb()->ProcessParameters
;
838 CONSOLE_API_MESSAGE ApiMessage
;
839 PCONSOLE_ALLOCCONSOLE AllocConsoleRequest
= &ApiMessage
.Data
.AllocConsoleRequest
;
840 PCSR_CAPTURE_BUFFER CaptureBuffer
;
843 if (Parameters
->ConsoleHandle
)
845 DPRINT1("AllocConsole: Allocating a console to a process already having one\n");
846 SetLastError(ERROR_ACCESS_DENIED
);
850 CaptureBuffer
= CsrAllocateCaptureBuffer(2, sizeof(CONSOLE_START_INFO
) +
851 (MAX_PATH
+ 1) * sizeof(WCHAR
));
852 if (CaptureBuffer
== NULL
)
854 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
855 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
859 CsrAllocateMessagePointer(CaptureBuffer
,
860 sizeof(CONSOLE_START_INFO
),
861 (PVOID
*)&AllocConsoleRequest
->ConsoleStartInfo
);
863 CsrAllocateMessagePointer(CaptureBuffer
,
864 (MAX_PATH
+ 1) * sizeof(WCHAR
),
865 (PVOID
*)&AllocConsoleRequest
->AppPath
);
867 /** Copied from BasepInitConsole **********************************************/
868 InitConsoleInfo(AllocConsoleRequest
->ConsoleStartInfo
);
870 Length
= min(MAX_PATH
, Parameters
->ImagePathName
.Length
/ sizeof(WCHAR
));
871 wcsncpy(AllocConsoleRequest
->AppPath
, Parameters
->ImagePathName
.Buffer
, Length
);
872 AllocConsoleRequest
->AppPath
[Length
] = L
'\0';
873 /******************************************************************************/
875 AllocConsoleRequest
->Console
= NULL
;
876 AllocConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
877 AllocConsoleRequest
->PropDispatcher
= PropDialogHandler
;
879 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
881 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAlloc
),
882 sizeof(CONSOLE_ALLOCCONSOLE
));
884 CsrFreeCaptureBuffer(CaptureBuffer
);
886 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
888 BaseSetLastNTError(Status
);
892 Parameters
->ConsoleHandle
= AllocConsoleRequest
->Console
;
893 SetStdHandle(STD_INPUT_HANDLE
, AllocConsoleRequest
->InputHandle
);
894 SetStdHandle(STD_OUTPUT_HANDLE
, AllocConsoleRequest
->OutputHandle
);
895 SetStdHandle(STD_ERROR_HANDLE
, AllocConsoleRequest
->ErrorHandle
);
897 /* Initialize Console Ctrl Handler */
898 InitConsoleCtrlHandling();
900 InputWaitHandle
= AllocConsoleRequest
->InputWaitHandle
;
906 /*--------------------------------------------------------------
915 // AG: I'm not sure if this is correct (what happens to std handles?)
916 // but I just tried to reverse what AllocConsole() does...
919 CONSOLE_API_MESSAGE ApiMessage
;
921 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
923 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFree
),
924 sizeof(CONSOLE_FREECONSOLE
));
925 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
927 BaseSetLastNTError(Status
);
931 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
933 CloseHandle(InputWaitHandle
);
934 InputWaitHandle
= INVALID_HANDLE_VALUE
;
940 /*--------------------------------------------------------------
941 * GetConsoleScreenBufferInfo
947 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
948 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
951 CONSOLE_API_MESSAGE ApiMessage
;
953 if (lpConsoleScreenBufferInfo
== NULL
)
955 SetLastError(ERROR_INVALID_PARAMETER
);
959 ApiMessage
.Data
.ScreenBufferInfoRequest
.OutputHandle
= hConsoleOutput
;
961 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
963 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetScreenBufferInfo
),
964 sizeof(CONSOLE_GETSCREENBUFFERINFO
));
965 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
967 BaseSetLastNTError(Status
);
971 *lpConsoleScreenBufferInfo
= ApiMessage
.Data
.ScreenBufferInfoRequest
.Info
;
977 /*--------------------------------------------------------------
978 * SetConsoleCursorPosition
984 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
985 COORD dwCursorPosition
)
988 CONSOLE_API_MESSAGE ApiMessage
;
990 ApiMessage
.Data
.SetCursorPositionRequest
.OutputHandle
= hConsoleOutput
;
991 ApiMessage
.Data
.SetCursorPositionRequest
.Position
= dwCursorPosition
;
993 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
995 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorPosition
),
996 sizeof(CONSOLE_SETCURSORPOSITION
));
997 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
999 BaseSetLastNTError(Status
);
1007 /*--------------------------------------------------------------
1014 GetConsoleMode(HANDLE hConsoleHandle
,
1018 CONSOLE_API_MESSAGE ApiMessage
;
1019 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1021 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
1023 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1025 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetMode
),
1026 sizeof(CONSOLE_GETSETCONSOLEMODE
));
1027 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1029 BaseSetLastNTError(Status
);
1033 *lpMode
= ConsoleModeRequest
->ConsoleMode
;
1039 /*--------------------------------------------------------------
1040 * GetNumberOfConsoleInputEvents
1046 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
1047 LPDWORD lpNumberOfEvents
)
1050 CONSOLE_API_MESSAGE ApiMessage
;
1051 PCONSOLE_GETNUMINPUTEVENTS GetNumInputEventsRequest
= &ApiMessage
.Data
.GetNumInputEventsRequest
;
1053 GetNumInputEventsRequest
->InputHandle
= hConsoleInput
;
1054 GetNumInputEventsRequest
->NumInputEvents
= 0;
1056 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1058 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetNumberOfInputEvents
),
1059 sizeof(CONSOLE_GETNUMINPUTEVENTS
));
1060 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1062 BaseSetLastNTError(Status
);
1066 if (lpNumberOfEvents
== NULL
)
1068 SetLastError(ERROR_INVALID_ACCESS
);
1072 *lpNumberOfEvents
= GetNumInputEventsRequest
->NumInputEvents
;
1078 /*--------------------------------------------------------------
1079 * GetLargestConsoleWindowSize
1085 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
1087 COORD Coord
= {80,25};
1088 DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput
);
1089 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1094 /*--------------------------------------------------------------
1095 * GetConsoleCursorInfo
1101 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
1102 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
1105 CONSOLE_API_MESSAGE ApiMessage
;
1107 if (!lpConsoleCursorInfo
)
1109 if (!hConsoleOutput
)
1110 SetLastError(ERROR_INVALID_HANDLE
);
1112 SetLastError(ERROR_INVALID_ACCESS
);
1117 ApiMessage
.Data
.CursorInfoRequest
.OutputHandle
= hConsoleOutput
;
1119 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1121 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCursorInfo
),
1122 sizeof(CONSOLE_GETSETCURSORINFO
));
1123 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1125 BaseSetLastNTError(Status
);
1129 *lpConsoleCursorInfo
= ApiMessage
.Data
.CursorInfoRequest
.Info
;
1135 /*--------------------------------------------------------------
1136 * GetNumberOfConsoleMouseButtons
1142 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
1144 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
1145 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1150 /*--------------------------------------------------------------
1157 SetConsoleMode(HANDLE hConsoleHandle
,
1161 CONSOLE_API_MESSAGE ApiMessage
;
1162 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1164 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
1165 ConsoleModeRequest
->ConsoleMode
= dwMode
;
1167 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1169 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetMode
),
1170 sizeof(CONSOLE_GETSETCONSOLEMODE
));
1171 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1173 BaseSetLastNTError(Status
);
1181 /*--------------------------------------------------------------
1182 * SetConsoleActiveScreenBuffer
1188 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
1191 CONSOLE_API_MESSAGE ApiMessage
;
1193 ApiMessage
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
1195 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1197 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetActiveScreenBuffer
),
1198 sizeof(CONSOLE_SETACTIVESCREENBUFFER
));
1199 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1201 BaseSetLastNTError(Status
);
1209 /*--------------------------------------------------------------
1210 * FlushConsoleInputBuffer
1216 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
1219 CONSOLE_API_MESSAGE ApiMessage
;
1221 ApiMessage
.Data
.FlushInputBufferRequest
.InputHandle
= hConsoleInput
;
1223 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1225 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFlushInputBuffer
),
1226 sizeof(CONSOLE_FLUSHINPUTBUFFER
));
1227 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1229 BaseSetLastNTError(Status
);
1237 /*--------------------------------------------------------------
1238 * SetConsoleScreenBufferSize
1244 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
1248 CONSOLE_API_MESSAGE ApiMessage
;
1250 ApiMessage
.Data
.SetScreenBufferSizeRequest
.OutputHandle
= hConsoleOutput
;
1251 ApiMessage
.Data
.SetScreenBufferSizeRequest
.Size
= dwSize
;
1253 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1255 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetScreenBufferSize
),
1256 sizeof(CONSOLE_SETSCREENBUFFERSIZE
));
1257 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1259 BaseSetLastNTError(Status
);
1267 /*--------------------------------------------------------------
1268 * SetConsoleCursorInfo
1274 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
1275 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
1278 CONSOLE_API_MESSAGE ApiMessage
;
1280 ApiMessage
.Data
.CursorInfoRequest
.OutputHandle
= hConsoleOutput
;
1281 ApiMessage
.Data
.CursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
1283 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1285 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorInfo
),
1286 sizeof(CONSOLE_GETSETCURSORINFO
));
1287 if(!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1289 BaseSetLastNTError(Status
);
1299 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
1300 const SMALL_RECT
*lpScrollRectangle
,
1301 const SMALL_RECT
*lpClipRectangle
,
1302 COORD dwDestinationOrigin
,
1303 const CHAR_INFO
*lpFill
,
1307 CONSOLE_API_MESSAGE ApiMessage
;
1308 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &ApiMessage
.Data
.ScrollScreenBufferRequest
;
1310 ScrollScreenBufferRequest
->OutputHandle
= hConsoleOutput
;
1311 ScrollScreenBufferRequest
->Unicode
= bUnicode
;
1312 ScrollScreenBufferRequest
->ScrollRectangle
= *lpScrollRectangle
;
1314 if (lpClipRectangle
!= NULL
)
1316 ScrollScreenBufferRequest
->UseClipRectangle
= TRUE
;
1317 ScrollScreenBufferRequest
->ClipRectangle
= *lpClipRectangle
;
1321 ScrollScreenBufferRequest
->UseClipRectangle
= FALSE
;
1324 ScrollScreenBufferRequest
->DestinationOrigin
= dwDestinationOrigin
;
1325 ScrollScreenBufferRequest
->Fill
= *lpFill
;
1327 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1329 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepScrollScreenBuffer
),
1330 sizeof(CONSOLE_SCROLLSCREENBUFFER
));
1332 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1334 BaseSetLastNTError(Status
);
1342 /*--------------------------------------------------------------
1343 * ScrollConsoleScreenBufferA
1349 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
1350 CONST SMALL_RECT
*lpScrollRectangle
,
1351 CONST SMALL_RECT
*lpClipRectangle
,
1352 COORD dwDestinationOrigin
,
1353 CONST CHAR_INFO
*lpFill
)
1355 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1356 (PSMALL_RECT
)lpScrollRectangle
,
1357 (PSMALL_RECT
)lpClipRectangle
,
1358 dwDestinationOrigin
,
1364 /*--------------------------------------------------------------
1365 * ScrollConsoleScreenBufferW
1371 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
1372 CONST SMALL_RECT
*lpScrollRectangle
,
1373 CONST SMALL_RECT
*lpClipRectangle
,
1374 COORD dwDestinationOrigin
,
1375 CONST CHAR_INFO
*lpFill
)
1377 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1380 dwDestinationOrigin
,
1386 /*--------------------------------------------------------------
1387 * SetConsoleWindowInfo
1393 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
1395 CONST SMALL_RECT
*lpConsoleWindow
)
1397 DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bAbsolute
, lpConsoleWindow
);
1398 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1403 /*--------------------------------------------------------------
1404 * SetConsoleTextAttribute
1410 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
1414 CONSOLE_API_MESSAGE ApiMessage
;
1416 ApiMessage
.Data
.SetTextAttribRequest
.OutputHandle
= hConsoleOutput
;
1417 ApiMessage
.Data
.SetTextAttribRequest
.Attrib
= wAttributes
;
1419 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1421 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTextAttribute
),
1422 sizeof(CONSOLE_SETTEXTATTRIB
));
1423 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1425 BaseSetLastNTError(Status
);
1435 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1437 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
1439 if (HandlerRoutine
== NULL
)
1441 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
1445 if (NrCtrlHandlers
== NrAllocatedHandlers
)
1447 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
1449 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
1450 if (NewCtrlHandlers
== NULL
)
1452 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1456 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
1458 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
1460 CtrlHandlers
= NewCtrlHandlers
;
1461 NrAllocatedHandlers
+= 4;
1464 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
1466 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
1473 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1477 if (HandlerRoutine
== NULL
)
1479 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
1483 for (i
= 0; i
< NrCtrlHandlers
; i
++)
1485 if (CtrlHandlers
[i
] == HandlerRoutine
)
1487 if (i
< (NrCtrlHandlers
- 1))
1489 memmove(&CtrlHandlers
[i
],
1491 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
1499 SetLastError(ERROR_INVALID_PARAMETER
);
1509 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
1514 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
1517 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
1521 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
1524 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
1529 /*--------------------------------------------------------------
1530 * GenerateConsoleCtrlEvent
1536 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
1537 DWORD dwProcessGroupId
)
1540 CONSOLE_API_MESSAGE ApiMessage
;
1542 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
1544 SetLastError(ERROR_INVALID_PARAMETER
);
1548 ApiMessage
.Data
.GenerateCtrlEventRequest
.Event
= dwCtrlEvent
;
1549 ApiMessage
.Data
.GenerateCtrlEventRequest
.ProcessGroup
= dwProcessGroupId
;
1551 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1553 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGenerateCtrlEvent
),
1554 sizeof(CONSOLE_GENERATECTRLEVENT
));
1555 if(!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= ApiMessage
.Status
)))
1557 BaseSetLastNTError(Status
);
1566 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD nSize
, BOOL bUnicode
)
1569 CONSOLE_API_MESSAGE ApiMessage
;
1570 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1571 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1573 if (nSize
== 0) return 0;
1575 TitleRequest
->Length
= nSize
* (bUnicode
? 1 : sizeof(WCHAR
));
1576 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1577 if (CaptureBuffer
== NULL
)
1579 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1580 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1584 CsrAllocateMessagePointer(CaptureBuffer
,
1585 TitleRequest
->Length
,
1586 (PVOID
*)&TitleRequest
->Title
);
1588 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1590 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetTitle
),
1591 sizeof(CONSOLE_GETSETCONSOLETITLE
));
1592 if (!NT_SUCCESS(Status
) || !(NT_SUCCESS(Status
= ApiMessage
.Status
)))
1594 CsrFreeCaptureBuffer(CaptureBuffer
);
1595 BaseSetLastNTError(Status
);
1601 if (nSize
>= sizeof(WCHAR
))
1602 wcscpy((LPWSTR
)lpConsoleTitle
, TitleRequest
->Title
);
1606 if (nSize
< TitleRequest
->Length
/ sizeof(WCHAR
) ||
1607 !WideCharToMultiByte(CP_ACP
, // ANSI code page
1608 0, // performance and mapping flags
1609 TitleRequest
->Title
, // address of wide-character string
1610 -1, // number of characters in string
1611 (LPSTR
)lpConsoleTitle
, // address of buffer for new string
1612 nSize
, // size of buffer
1616 /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
1617 *(LPSTR
)lpConsoleTitle
= '\0';
1618 TitleRequest
->Length
= 0;
1621 CsrFreeCaptureBuffer(CaptureBuffer
);
1623 return TitleRequest
->Length
/ sizeof(WCHAR
);
1627 /*--------------------------------------------------------------
1634 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
1637 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
1641 /*--------------------------------------------------------------
1648 GetConsoleTitleA(LPSTR lpConsoleTitle
,
1651 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
1655 /*--------------------------------------------------------------
1662 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
1665 CONSOLE_API_MESSAGE ApiMessage
;
1666 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1667 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1669 TitleRequest
->Length
= wcslen(lpConsoleTitle
) * sizeof(WCHAR
);
1671 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1672 if (CaptureBuffer
== NULL
)
1674 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1675 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1679 CsrCaptureMessageBuffer(CaptureBuffer
,
1680 (PVOID
)lpConsoleTitle
,
1681 TitleRequest
->Length
,
1682 (PVOID
*)&TitleRequest
->Title
);
1684 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1686 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTitle
),
1687 sizeof(CONSOLE_GETSETCONSOLETITLE
));
1689 CsrFreeCaptureBuffer(CaptureBuffer
);
1691 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1693 BaseSetLastNTError(Status
);
1701 /*--------------------------------------------------------------
1708 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
1711 ULONG Length
= strlen(lpConsoleTitle
) + 1;
1712 LPWSTR WideTitle
= HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
1716 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1720 MultiByteToWideChar(CP_ACP
, 0, lpConsoleTitle
, -1, WideTitle
, Length
);
1722 Ret
= SetConsoleTitleW(WideTitle
);
1724 HeapFree(GetProcessHeap(), 0, WideTitle
);
1729 /*--------------------------------------------------------------
1730 * CreateConsoleScreenBuffer
1736 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
1738 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1740 LPVOID lpScreenBufferData
)
1743 CONSOLE_API_MESSAGE ApiMessage
;
1745 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
1746 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) ||
1747 (dwFlags
!= CONSOLE_TEXTMODE_BUFFER
) )
1749 SetLastError(ERROR_INVALID_PARAMETER
);
1750 return INVALID_HANDLE_VALUE
;
1753 ApiMessage
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
1754 ApiMessage
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
1755 ApiMessage
.Data
.CreateScreenBufferRequest
.Inheritable
=
1756 (lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
);
1758 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1760 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCreateScreenBuffer
),
1761 sizeof(CONSOLE_CREATESCREENBUFFER
));
1762 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1764 BaseSetLastNTError(Status
);
1765 return INVALID_HANDLE_VALUE
;
1768 return ApiMessage
.Data
.CreateScreenBufferRequest
.OutputHandle
;
1772 /*--------------------------------------------------------------
1782 CONSOLE_API_MESSAGE ApiMessage
;
1784 /* Get the Input Code Page */
1785 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= TRUE
;
1787 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1789 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
1790 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1791 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1793 BaseSetLastNTError(Status
);
1797 return ApiMessage
.Data
.ConsoleCPRequest
.CodePage
;
1801 /*--------------------------------------------------------------
1808 SetConsoleCP(UINT wCodePageID
)
1811 CONSOLE_API_MESSAGE ApiMessage
;
1813 /* Set the Input Code Page */
1814 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= TRUE
;
1815 ApiMessage
.Data
.ConsoleCPRequest
.CodePage
= wCodePageID
;
1817 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1819 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
1820 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1821 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1823 BaseSetLastNTError(Status
);
1826 return NT_SUCCESS(Status
);
1830 /*--------------------------------------------------------------
1831 * GetConsoleOutputCP
1837 GetConsoleOutputCP(VOID
)
1840 CONSOLE_API_MESSAGE ApiMessage
;
1842 /* Get the Output Code Page */
1843 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= FALSE
;
1845 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1847 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
1848 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1849 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1851 BaseSetLastNTError (Status
);
1855 return ApiMessage
.Data
.ConsoleCPRequest
.CodePage
;
1859 /*--------------------------------------------------------------
1860 * SetConsoleOutputCP
1866 SetConsoleOutputCP(UINT wCodePageID
)
1869 CONSOLE_API_MESSAGE ApiMessage
;
1871 /* Set the Output Code Page */
1872 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= FALSE
;
1873 ApiMessage
.Data
.ConsoleCPRequest
.CodePage
= wCodePageID
;
1875 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1877 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
1878 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1879 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1881 BaseSetLastNTError(Status
);
1884 return NT_SUCCESS(Status
);
1888 /*--------------------------------------------------------------
1889 * GetConsoleProcessList
1895 GetConsoleProcessList(LPDWORD lpdwProcessList
,
1896 DWORD dwProcessCount
)
1899 CONSOLE_API_MESSAGE ApiMessage
;
1900 PCONSOLE_GETPROCESSLIST GetProcessListRequest
= &ApiMessage
.Data
.GetProcessListRequest
;
1901 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1904 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
1906 SetLastError(ERROR_INVALID_PARAMETER
);
1910 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
1911 if (CaptureBuffer
== NULL
)
1913 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1914 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1918 GetProcessListRequest
->nMaxIds
= dwProcessCount
;
1920 CsrAllocateMessagePointer(CaptureBuffer
,
1921 dwProcessCount
* sizeof(DWORD
),
1922 (PVOID
*)&GetProcessListRequest
->pProcessIds
);
1924 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1926 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetProcessList
),
1927 sizeof(CONSOLE_GETPROCESSLIST
));
1928 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1930 BaseSetLastNTError (Status
);
1935 nProcesses
= GetProcessListRequest
->nProcessIdsTotal
;
1936 if (dwProcessCount
>= nProcesses
)
1938 memcpy(lpdwProcessList
, GetProcessListRequest
->pProcessIds
, nProcesses
* sizeof(DWORD
));
1942 CsrFreeCaptureBuffer(CaptureBuffer
);
1947 /*--------------------------------------------------------------
1948 * GetConsoleSelectionInfo
1954 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
1957 CONSOLE_API_MESSAGE ApiMessage
;
1959 if (lpConsoleSelectionInfo
== NULL
)
1961 SetLastError(ERROR_INVALID_PARAMETER
);
1965 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1967 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetSelectionInfo
),
1968 sizeof(CONSOLE_GETSELECTIONINFO
));
1969 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
1971 BaseSetLastNTError(Status
);
1975 *lpConsoleSelectionInfo
= ApiMessage
.Data
.GetSelectionInfoRequest
.Info
;
1980 /*--------------------------------------------------------------
1985 * @note Strongly inspired by AllocConsole.
1989 AttachConsole(DWORD dwProcessId
)
1992 PRTL_USER_PROCESS_PARAMETERS Parameters
= NtCurrentPeb()->ProcessParameters
;
1993 CONSOLE_API_MESSAGE ApiMessage
;
1994 PCONSOLE_ATTACHCONSOLE AttachConsoleRequest
= &ApiMessage
.Data
.AttachConsoleRequest
;
1996 if (Parameters
->ConsoleHandle
)
1998 DPRINT1("AttachConsole: Attaching a console to a process already having one\n");
1999 SetLastError(ERROR_ACCESS_DENIED
);
2003 AttachConsoleRequest
->ProcessId
= dwProcessId
;
2004 AttachConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
2005 AttachConsoleRequest
->PropDispatcher
= PropDialogHandler
;
2007 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2009 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAttach
),
2010 sizeof(CONSOLE_ATTACHCONSOLE
));
2011 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
2013 BaseSetLastNTError(Status
);
2017 Parameters
->ConsoleHandle
= AttachConsoleRequest
->Console
;
2018 SetStdHandle(STD_INPUT_HANDLE
, AttachConsoleRequest
->InputHandle
);
2019 SetStdHandle(STD_OUTPUT_HANDLE
, AttachConsoleRequest
->OutputHandle
);
2020 SetStdHandle(STD_ERROR_HANDLE
, AttachConsoleRequest
->ErrorHandle
);
2022 /* Initialize Console Ctrl Handler */
2023 InitConsoleCtrlHandling();
2025 InputWaitHandle
= AttachConsoleRequest
->InputWaitHandle
;
2031 /*--------------------------------------------------------------
2038 GetConsoleWindow(VOID
)
2041 CONSOLE_API_MESSAGE ApiMessage
;
2043 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2045 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetConsoleWindow
),
2046 sizeof(CONSOLE_GETWINDOW
));
2047 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
2049 BaseSetLastNTError(Status
);
2053 return ApiMessage
.Data
.GetWindowRequest
.WindowHandle
;
2057 /*--------------------------------------------------------------
2064 SetConsoleIcon(HICON hicon
)
2067 CONSOLE_API_MESSAGE ApiMessage
;
2069 ApiMessage
.Data
.SetIconRequest
.WindowIcon
= hicon
;
2071 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2073 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetIcon
),
2074 sizeof(CONSOLE_SETICON
));
2075 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Status
= ApiMessage
.Status
))
2077 BaseSetLastNTError(Status
);
2081 return NT_SUCCESS(Status
);
2085 /******************************************************************************
2086 * \name SetConsoleInputExeNameW
2087 * \brief Sets the console input file name from a unicode string.
2088 * \param lpInputExeName Pointer to a unicode string with the name.
2089 * \return TRUE if successful, FALSE if unsuccsedful.
2090 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2091 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2095 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
2099 if ( !lpInputExeName
||
2100 (lenName
= lstrlenW(lpInputExeName
)) == 0 ||
2101 lenName
> INPUTEXENAME_BUFLEN
- 1 )
2103 /* Fail if string is empty or too long */
2104 SetLastError(ERROR_INVALID_PARAMETER
);
2108 RtlEnterCriticalSection(&ConsoleLock
);
2111 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
2112 InputExeName
[lenName
] = L
'\0';
2116 RtlLeaveCriticalSection(&ConsoleLock
);
2124 /******************************************************************************
2125 * \name SetConsoleInputExeNameA
2126 * \brief Sets the console input file name from an ansi string.
2127 * \param lpInputExeName Pointer to an ansi string with the name.
2128 * \return TRUE if successful, FALSE if unsuccsedful.
2129 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2130 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2134 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
2136 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2137 ANSI_STRING InputExeNameA
;
2138 UNICODE_STRING InputExeNameU
;
2141 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
2143 if ( InputExeNameA
.Length
== 0 ||
2144 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1 )
2146 /* Fail if string is empty or too long */
2147 SetLastError(ERROR_INVALID_PARAMETER
);
2151 InputExeNameU
.Buffer
= Buffer
;
2152 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
2153 InputExeNameU
.Length
= 0;
2155 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
2156 if (!NT_SUCCESS(Status
))
2158 BaseSetLastNTError(Status
);
2162 return SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
2166 /******************************************************************************
2167 * \name GetConsoleInputExeNameW
2168 * \brief Retrieves the console input file name as unicode string.
2169 * \param nBufferLength Length of the buffer in WCHARs.
2170 * Specify 0 to recieve the needed buffer length.
2171 * \param lpBuffer Pointer to a buffer that recieves the string.
2172 * \return Needed buffer size if \p nBufferLength is 0.
2173 * Otherwise 1 if successful, 2 if buffer is too small.
2174 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2175 * is not big enough.
2179 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
2181 int lenName
= lstrlenW(InputExeName
);
2183 if (nBufferLength
== 0)
2185 /* Buffer size is requested, return it */
2189 if (lenName
+ 1 > nBufferLength
)
2191 /* Buffer is not large enough! */
2192 SetLastError(ERROR_BUFFER_OVERFLOW
);
2196 RtlEnterCriticalSection(&ConsoleLock
);
2199 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
2200 lpBuffer
[lenName
] = '\0';
2204 RtlLeaveCriticalSection(&ConsoleLock
);
2208 /* Success, return 1 */
2213 /******************************************************************************
2214 * \name GetConsoleInputExeNameA
2215 * \brief Retrieves the console input file name as ansi string.
2216 * \param nBufferLength Length of the buffer in CHARs.
2217 * \param lpBuffer Pointer to a buffer that recieves the string.
2218 * \return 1 if successful, 2 if buffer is too small.
2219 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2220 * is not big enough. The buffer recieves as much characters as fit.
2224 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
2226 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2228 UNICODE_STRING BufferU
;
2229 ANSI_STRING BufferA
;
2231 /* Get the unicode name */
2232 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
2234 /* Initialize strings for conversion */
2235 RtlInitUnicodeString(&BufferU
, Buffer
);
2237 BufferA
.MaximumLength
= nBufferLength
;
2238 BufferA
.Buffer
= lpBuffer
;
2240 /* Convert unicode name to ansi, copying as much chars as fit */
2241 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
2243 /* Error handling */
2244 if (nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
2246 SetLastError(ERROR_BUFFER_OVERFLOW
);
2255 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
2263 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
2271 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
2279 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
2287 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
2295 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
2303 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
2311 RegisterConsoleOS2(BOOL bUnknown
)
2319 SetConsoleOS2OemFormat(BOOL bUnknown
)
2327 UnregisterConsoleIME(VOID
)
2337 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
2346 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
2357 SetLastConsoleEventActive(VOID
)