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 * PROGRAMMERS: 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
);
150 if ((nCode
!= CTRL_C_EVENT
) || (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
152 for (i
= NrCtrlHandlers
; i
> 0; i
--)
155 (CodeAndFlag
& MINLONG
) &&
156 ((nCode
== CTRL_LOGOFF_EVENT
) || (nCode
== CTRL_SHUTDOWN_EVENT
)))
158 DPRINT("Skipping system/service apps\n");
162 if (CtrlHandlers
[i
- 1](nCode
))
166 case CTRL_CLOSE_EVENT
:
167 case CTRL_LOGOFF_EVENT
:
168 case CTRL_SHUTDOWN_EVENT
:
170 nExitCode
= CodeAndFlag
;
178 RtlLeaveCriticalSection(&ConsoleLock
);
180 ExitThread(nExitCode
);
181 return STATUS_SUCCESS
;
186 InitConsoleCtrlHandling(VOID
)
188 /* Initialize Console Ctrl Handler */
189 NrAllocatedHandlers
= NrCtrlHandlers
= 1;
190 CtrlHandlers
= InitialHandler
;
191 CtrlHandlers
[0] = DefaultConsoleCtrlHandler
;
195 /* FUNCTIONS ******************************************************************/
198 IntCheckForConsoleFileName(IN LPCWSTR pszName
,
199 IN DWORD dwDesiredAccess
)
201 LPCWSTR ConsoleName
= pszName
;
202 ULONG DeviceNameInfo
;
205 * Check whether we deal with a DOS device, and if so,
206 * strip the path till the file name.
207 * Therefore, things like \\.\CON or C:\some_path\CONIN$
208 * are transformed into CON or CONIN$, for example.
210 DeviceNameInfo
= RtlIsDosDeviceName_U(pszName
);
211 if (DeviceNameInfo
!= 0)
213 ConsoleName
= (LPCWSTR
)((ULONG_PTR
)ConsoleName
+ ((DeviceNameInfo
>> 16) & 0xFFFF));
216 /* Return a standard console "file" name according to what we passed in parameters */
217 if (_wcsicmp(ConsoleName
, BaseConInputFileName
) == 0)
219 return BaseConInputFileName
;
221 else if (_wcsicmp(ConsoleName
, BaseConOutputFileName
) == 0)
223 return BaseConOutputFileName
;
225 else if (_wcsicmp(ConsoleName
, BaseConFileName
) == 0)
227 if ((dwDesiredAccess
& (GENERIC_READ
| GENERIC_WRITE
)) == GENERIC_READ
)
229 return BaseConInputFileName
;
231 else if ((dwDesiredAccess
& (GENERIC_READ
| GENERIC_WRITE
)) == GENERIC_WRITE
)
233 return BaseConOutputFileName
;
237 /* If we are there, that means that either the file name or the desired access are wrong */
243 * @unimplemented (Undocumented)
247 ConsoleMenuControl(HANDLE hConsole
,
251 DPRINT1("ConsoleMenuControl(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsole
, Unknown1
, Unknown2
);
252 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
262 DuplicateConsoleHandle(HANDLE hConsole
,
263 DWORD dwDesiredAccess
,
268 CONSOLE_API_MESSAGE ApiMessage
;
269 PCONSOLE_DUPLICATEHANDLE DuplicateHandleRequest
= &ApiMessage
.Data
.DuplicateHandleRequest
;
271 if ( (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)) ||
272 (!(dwOptions
& DUPLICATE_SAME_ACCESS
) &&
273 (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
))) )
275 SetLastError (ERROR_INVALID_PARAMETER
);
276 return INVALID_HANDLE_VALUE
;
279 DuplicateHandleRequest
->ConsoleHandle
= hConsole
;
280 DuplicateHandleRequest
->Access
= dwDesiredAccess
;
281 DuplicateHandleRequest
->Inheritable
= bInheritHandle
;
282 DuplicateHandleRequest
->Options
= dwOptions
;
284 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
286 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepDuplicateHandle
),
287 sizeof(CONSOLE_DUPLICATEHANDLE
));
288 if (!NT_SUCCESS(Status
))
290 BaseSetLastNTError(Status
);
291 return INVALID_HANDLE_VALUE
;
294 return DuplicateHandleRequest
->ConsoleHandle
;
303 GetConsoleDisplayMode(LPDWORD lpModeFlags
)
306 CONSOLE_API_MESSAGE ApiMessage
;
307 PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest
= &ApiMessage
.Data
.GetDisplayModeRequest
;
309 if (lpModeFlags
== NULL
)
311 SetLastError(ERROR_INVALID_PARAMETER
);
315 // GetDisplayModeRequest->OutputHandle = hConsoleOutput;
317 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
319 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetDisplayMode
),
320 sizeof(CONSOLE_GETDISPLAYMODE
));
321 if (!NT_SUCCESS(Status
))
323 BaseSetLastNTError(Status
);
327 *lpModeFlags
= GetDisplayModeRequest
->DisplayMode
;
333 * @unimplemented (Undocumented)
337 GetConsoleFontInfo(DWORD Unknown0
,
342 DPRINT1("GetConsoleFontInfo(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
343 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
353 GetConsoleFontSize(HANDLE hConsoleOutput
,
356 COORD Empty
= {0, 0};
357 DPRINT1("GetConsoleFontSize(0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
358 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
364 * @implemented (Undocumented)
368 GetConsoleHardwareState(HANDLE hConsoleOutput
,
373 CONSOLE_API_MESSAGE ApiMessage
;
374 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &ApiMessage
.Data
.HardwareStateRequest
;
376 DPRINT1("GetConsoleHardwareState(%d, 0x%p) UNIMPLEMENTED!\n", Flags
, State
);
380 SetLastError(ERROR_INVALID_PARAMETER
);
384 HardwareStateRequest
->OutputHandle
= hConsoleOutput
;
386 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
388 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetHardwareState
),
389 sizeof(CONSOLE_GETSETHWSTATE
));
390 if (!NT_SUCCESS(Status
))
392 BaseSetLastNTError(Status
);
396 *State
= HardwareStateRequest
->State
;
402 * @implemented (Undocumented)
406 GetConsoleInputWaitHandle(VOID
)
408 return InputWaitHandle
;
417 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
419 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
421 DPRINT1("GetCurrentConsoleFont(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
422 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
428 * @unimplemented (Undocumented)
432 GetNumberOfConsoleFonts(VOID
)
434 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
435 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
441 * @unimplemented (Undocumented)
445 InvalidateConsoleDIBits(DWORD Unknown0
,
448 DPRINT1("InvalidateConsoleDIBits(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
449 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
455 * @unimplemented (Undocumented)
459 OpenConsoleW(LPCWSTR wsName
,
460 DWORD dwDesiredAccess
,
464 NTSTATUS Status
= STATUS_SUCCESS
;
465 CONSOLE_API_MESSAGE ApiMessage
;
466 PCONSOLE_OPENCONSOLE OpenConsoleRequest
= &ApiMessage
.Data
.OpenConsoleRequest
;
467 CONSOLE_HANDLE_TYPE HandleType
;
469 if (wsName
&& 0 == _wcsicmp(wsName
, BaseConInputFileName
))
471 HandleType
= HANDLE_INPUT
;
473 else if (wsName
&& 0 == _wcsicmp(wsName
, BaseConOutputFileName
))
475 HandleType
= HANDLE_OUTPUT
;
479 SetLastError(ERROR_INVALID_PARAMETER
);
480 return INVALID_HANDLE_VALUE
;
483 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
484 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) )
486 SetLastError(ERROR_INVALID_PARAMETER
);
487 return INVALID_HANDLE_VALUE
;
490 OpenConsoleRequest
->HandleType
= HandleType
;
491 OpenConsoleRequest
->Access
= dwDesiredAccess
;
492 OpenConsoleRequest
->Inheritable
= bInheritHandle
;
493 OpenConsoleRequest
->ShareMode
= dwShareMode
;
495 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
497 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepOpenConsole
),
498 sizeof(CONSOLE_OPENCONSOLE
));
499 if (!NT_SUCCESS(Status
))
501 BaseSetLastNTError(Status
);
502 return INVALID_HANDLE_VALUE
;
505 return OpenConsoleRequest
->ConsoleHandle
;
510 * @unimplemented (Undocumented)
514 SetConsoleCursor(DWORD Unknown0
,
517 DPRINT1("SetConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
518 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
528 SetConsoleDisplayMode(HANDLE hConsoleOutput
,
530 PCOORD lpNewScreenBufferDimensions
)
533 CONSOLE_API_MESSAGE ApiMessage
;
534 PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest
= &ApiMessage
.Data
.SetDisplayModeRequest
;
536 SetDisplayModeRequest
->OutputHandle
= hConsoleOutput
;
537 SetDisplayModeRequest
->DisplayMode
= dwFlags
;
538 SetDisplayModeRequest
->NewSBDim
.X
= 0;
539 SetDisplayModeRequest
->NewSBDim
.Y
= 0;
541 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
543 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetDisplayMode
),
544 sizeof(CONSOLE_SETDISPLAYMODE
));
545 if (!NT_SUCCESS(Status
))
547 BaseSetLastNTError(Status
);
551 if (lpNewScreenBufferDimensions
)
552 *lpNewScreenBufferDimensions
= SetDisplayModeRequest
->NewSBDim
;
559 * @unimplemented (Undocumented)
563 SetConsoleFont(DWORD Unknown0
,
566 DPRINT1("SetConsoleFont(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
567 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
573 * @implemented (Undocumented)
577 SetConsoleHardwareState(HANDLE hConsoleOutput
,
582 CONSOLE_API_MESSAGE ApiMessage
;
583 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &ApiMessage
.Data
.HardwareStateRequest
;
585 DPRINT1("SetConsoleHardwareState(%d, %d) UNIMPLEMENTED!\n", Flags
, State
);
587 HardwareStateRequest
->OutputHandle
= hConsoleOutput
;
588 HardwareStateRequest
->State
= State
;
590 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
592 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetHardwareState
),
593 sizeof(CONSOLE_GETSETHWSTATE
));
594 if (!NT_SUCCESS(Status
))
596 BaseSetLastNTError(Status
);
605 * @unimplemented (Undocumented)
609 SetConsoleKeyShortcuts(DWORD Unknown0
,
614 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
615 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
621 * @unimplemented (Undocumented)
625 SetConsoleMaximumWindowSize(DWORD Unknown0
,
628 DPRINT1("SetConsoleMaximumWindowSize(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
629 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
635 * @unimplemented (Undocumented)
639 SetConsoleMenuClose(DWORD Unknown0
)
641 DPRINT1("SetConsoleMenuClose(0x%x) UNIMPLEMENTED!\n", Unknown0
);
642 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
648 * @unimplemented (Undocumented)
652 SetConsolePalette(DWORD Unknown0
,
656 DPRINT1("SetConsolePalette(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
);
657 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
662 * @unimplemented (Undocumented)
666 ShowConsoleCursor(DWORD Unknown0
,
669 DPRINT1("ShowConsoleCursor(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
);
670 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
676 * FUNCTION: Checks whether the given handle is a valid console handle.
679 * Handle - Handle to be checked
682 * TRUE: Handle is a valid console handle
683 * FALSE: Handle is not a valid console handle.
685 * STATUS: Officially undocumented
691 VerifyConsoleIoHandle(HANDLE Handle
)
694 CONSOLE_API_MESSAGE ApiMessage
;
696 ApiMessage
.Data
.VerifyHandleRequest
.ConsoleHandle
= Handle
;
698 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
700 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepVerifyIoHandle
),
701 sizeof(CONSOLE_VERIFYHANDLE
));
702 if (!NT_SUCCESS(Status
))
704 BaseSetLastNTError(Status
);
717 WriteConsoleInputVDMA(DWORD Unknown0
,
722 DPRINT1("WriteConsoleInputVDMA(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
723 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
733 WriteConsoleInputVDMW(DWORD Unknown0
,
738 DPRINT1("WriteConsoleInputVDMW(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
739 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
745 * @implemented (Undocumented)
749 CloseConsoleHandle(HANDLE Handle
)
752 CONSOLE_API_MESSAGE ApiMessage
;
754 ApiMessage
.Data
.CloseHandleRequest
.ConsoleHandle
= Handle
;
756 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
758 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCloseHandle
),
759 sizeof(CONSOLE_CLOSEHANDLE
));
760 if (!NT_SUCCESS(Status
))
762 BaseSetLastNTError(Status
);
775 GetStdHandle(DWORD nStdHandle
)
777 * FUNCTION: Get a handle for the standard input, standard output
778 * and a standard error device.
781 * nStdHandle - Specifies the device for which to return the handle.
783 * RETURNS: If the function succeeds, the return value is the handle
784 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
787 PRTL_USER_PROCESS_PARAMETERS Ppb
= NtCurrentPeb()->ProcessParameters
;
791 case STD_INPUT_HANDLE
:
792 return Ppb
->StandardInput
;
794 case STD_OUTPUT_HANDLE
:
795 return Ppb
->StandardOutput
;
797 case STD_ERROR_HANDLE
:
798 return Ppb
->StandardError
;
801 SetLastError(ERROR_INVALID_HANDLE
);
802 return INVALID_HANDLE_VALUE
;
811 SetStdHandle(DWORD nStdHandle
,
814 * FUNCTION: Set the handle for the standard input, standard output or
815 * the standard error device.
818 * nStdHandle - Specifies the handle to be set.
819 * hHandle - The handle to set.
821 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
824 PRTL_USER_PROCESS_PARAMETERS Ppb
= NtCurrentPeb()->ProcessParameters
;
826 /* no need to check if hHandle == INVALID_HANDLE_VALUE */
830 case STD_INPUT_HANDLE
:
831 Ppb
->StandardInput
= hHandle
;
834 case STD_OUTPUT_HANDLE
:
835 Ppb
->StandardOutput
= hHandle
;
838 case STD_ERROR_HANDLE
:
839 Ppb
->StandardError
= hHandle
;
843 /* Windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */
844 SetLastError(ERROR_INVALID_HANDLE
);
849 /*--------------------------------------------------------------
859 PRTL_USER_PROCESS_PARAMETERS Parameters
= NtCurrentPeb()->ProcessParameters
;
860 CONSOLE_API_MESSAGE ApiMessage
;
861 PCONSOLE_ALLOCCONSOLE AllocConsoleRequest
= &ApiMessage
.Data
.AllocConsoleRequest
;
862 PCSR_CAPTURE_BUFFER CaptureBuffer
;
863 LPWSTR AppPath
= NULL
;
866 if (Parameters
->ConsoleHandle
)
868 DPRINT1("AllocConsole: Allocating a console to a process already having one\n");
869 SetLastError(ERROR_ACCESS_DENIED
);
873 CaptureBuffer
= CsrAllocateCaptureBuffer(1, sizeof(CONSOLE_START_INFO
));
874 if (CaptureBuffer
== NULL
)
876 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
877 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
881 CsrAllocateMessagePointer(CaptureBuffer
,
882 sizeof(CONSOLE_START_INFO
),
883 (PVOID
*)&AllocConsoleRequest
->ConsoleStartInfo
);
885 /** Copied from BasepInitConsole **********************************************/
886 InitConsoleInfo(AllocConsoleRequest
->ConsoleStartInfo
);
888 AppPath
= AllocConsoleRequest
->ConsoleStartInfo
->AppPath
;
889 Length
= min(MAX_PATH
, Parameters
->ImagePathName
.Length
/ sizeof(WCHAR
));
890 wcsncpy(AppPath
, Parameters
->ImagePathName
.Buffer
, Length
);
891 AppPath
[Length
] = L
'\0';
892 /******************************************************************************/
894 AllocConsoleRequest
->Console
= NULL
;
895 AllocConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
896 AllocConsoleRequest
->PropDispatcher
= PropDialogHandler
;
898 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
900 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAlloc
),
901 sizeof(CONSOLE_ALLOCCONSOLE
));
903 CsrFreeCaptureBuffer(CaptureBuffer
);
905 if (!NT_SUCCESS(Status
))
907 BaseSetLastNTError(Status
);
911 Parameters
->ConsoleHandle
= AllocConsoleRequest
->Console
;
912 SetStdHandle(STD_INPUT_HANDLE
, AllocConsoleRequest
->InputHandle
);
913 SetStdHandle(STD_OUTPUT_HANDLE
, AllocConsoleRequest
->OutputHandle
);
914 SetStdHandle(STD_ERROR_HANDLE
, AllocConsoleRequest
->ErrorHandle
);
916 /* Initialize Console Ctrl Handler */
917 InitConsoleCtrlHandling();
919 InputWaitHandle
= AllocConsoleRequest
->InputWaitHandle
;
925 /*--------------------------------------------------------------
934 // AG: I'm not sure if this is correct (what happens to std handles?)
935 // but I just tried to reverse what AllocConsole() does...
938 CONSOLE_API_MESSAGE ApiMessage
;
940 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
942 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFree
),
943 sizeof(CONSOLE_FREECONSOLE
));
944 if (!NT_SUCCESS(Status
))
946 BaseSetLastNTError(Status
);
950 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
952 CloseHandle(InputWaitHandle
);
953 InputWaitHandle
= INVALID_HANDLE_VALUE
;
959 /*--------------------------------------------------------------
960 * GetConsoleScreenBufferInfo
966 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
967 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
970 CONSOLE_API_MESSAGE ApiMessage
;
972 if (lpConsoleScreenBufferInfo
== NULL
)
974 SetLastError(ERROR_INVALID_PARAMETER
);
978 ApiMessage
.Data
.ScreenBufferInfoRequest
.OutputHandle
= hConsoleOutput
;
980 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
982 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetScreenBufferInfo
),
983 sizeof(CONSOLE_GETSCREENBUFFERINFO
));
984 if (!NT_SUCCESS(Status
))
986 BaseSetLastNTError(Status
);
990 *lpConsoleScreenBufferInfo
= ApiMessage
.Data
.ScreenBufferInfoRequest
.Info
;
996 /*--------------------------------------------------------------
997 * SetConsoleCursorPosition
1003 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
1004 COORD dwCursorPosition
)
1007 CONSOLE_API_MESSAGE ApiMessage
;
1009 ApiMessage
.Data
.SetCursorPositionRequest
.OutputHandle
= hConsoleOutput
;
1010 ApiMessage
.Data
.SetCursorPositionRequest
.Position
= dwCursorPosition
;
1012 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1014 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorPosition
),
1015 sizeof(CONSOLE_SETCURSORPOSITION
));
1016 if (!NT_SUCCESS(Status
))
1018 BaseSetLastNTError(Status
);
1026 /*--------------------------------------------------------------
1033 GetConsoleMode(HANDLE hConsoleHandle
,
1037 CONSOLE_API_MESSAGE ApiMessage
;
1038 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1042 SetLastError(ERROR_INVALID_PARAMETER
);
1046 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
1048 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1050 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetMode
),
1051 sizeof(CONSOLE_GETSETCONSOLEMODE
));
1052 if (!NT_SUCCESS(Status
))
1054 BaseSetLastNTError(Status
);
1058 *lpMode
= ConsoleModeRequest
->ConsoleMode
;
1064 /*--------------------------------------------------------------
1065 * GetNumberOfConsoleInputEvents
1071 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
1072 LPDWORD lpNumberOfEvents
)
1075 CONSOLE_API_MESSAGE ApiMessage
;
1076 PCONSOLE_GETNUMINPUTEVENTS GetNumInputEventsRequest
= &ApiMessage
.Data
.GetNumInputEventsRequest
;
1078 GetNumInputEventsRequest
->InputHandle
= hConsoleInput
;
1079 GetNumInputEventsRequest
->NumInputEvents
= 0;
1081 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1083 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetNumberOfInputEvents
),
1084 sizeof(CONSOLE_GETNUMINPUTEVENTS
));
1085 if (!NT_SUCCESS(Status
))
1087 BaseSetLastNTError(Status
);
1091 if (lpNumberOfEvents
== NULL
)
1093 SetLastError(ERROR_INVALID_ACCESS
);
1097 *lpNumberOfEvents
= GetNumInputEventsRequest
->NumInputEvents
;
1103 /*--------------------------------------------------------------
1104 * GetLargestConsoleWindowSize
1110 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
1113 CONSOLE_API_MESSAGE ApiMessage
;
1114 PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest
= &ApiMessage
.Data
.GetLargestWindowSizeRequest
;
1116 GetLargestWindowSizeRequest
->OutputHandle
= hConsoleOutput
;
1117 GetLargestWindowSizeRequest
->Size
.X
= 0;
1118 GetLargestWindowSizeRequest
->Size
.Y
= 0;
1120 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1122 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetLargestWindowSize
),
1123 sizeof(CONSOLE_GETLARGESTWINDOWSIZE
));
1124 if (!NT_SUCCESS(Status
))
1126 BaseSetLastNTError(Status
);
1129 DPRINT1("GetLargestConsoleWindowSize, X = %d, Y = %d\n", GetLargestWindowSizeRequest
->Size
.X
, GetLargestWindowSizeRequest
->Size
.Y
);
1130 return GetLargestWindowSizeRequest
->Size
;
1134 /*--------------------------------------------------------------
1135 * GetConsoleCursorInfo
1141 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
1142 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
1145 CONSOLE_API_MESSAGE ApiMessage
;
1147 if (!lpConsoleCursorInfo
)
1149 if (!hConsoleOutput
)
1150 SetLastError(ERROR_INVALID_HANDLE
);
1152 SetLastError(ERROR_INVALID_ACCESS
);
1157 ApiMessage
.Data
.CursorInfoRequest
.OutputHandle
= hConsoleOutput
;
1159 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1161 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCursorInfo
),
1162 sizeof(CONSOLE_GETSETCURSORINFO
));
1163 if (!NT_SUCCESS(Status
))
1165 BaseSetLastNTError(Status
);
1169 *lpConsoleCursorInfo
= ApiMessage
.Data
.CursorInfoRequest
.Info
;
1175 /*--------------------------------------------------------------
1176 * GetNumberOfConsoleMouseButtons
1182 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
1184 DPRINT1("GetNumberOfConsoleMouseButtons(0x%x) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
1185 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1190 /*--------------------------------------------------------------
1197 SetConsoleMode(HANDLE hConsoleHandle
,
1201 CONSOLE_API_MESSAGE ApiMessage
;
1202 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1204 ConsoleModeRequest
->ConsoleHandle
= hConsoleHandle
;
1205 ConsoleModeRequest
->ConsoleMode
= dwMode
;
1207 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1209 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetMode
),
1210 sizeof(CONSOLE_GETSETCONSOLEMODE
));
1211 if (!NT_SUCCESS(Status
))
1213 BaseSetLastNTError(Status
);
1221 /*--------------------------------------------------------------
1222 * SetConsoleActiveScreenBuffer
1228 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
1231 CONSOLE_API_MESSAGE ApiMessage
;
1233 ApiMessage
.Data
.SetScreenBufferRequest
.OutputHandle
= hConsoleOutput
;
1235 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1237 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetActiveScreenBuffer
),
1238 sizeof(CONSOLE_SETACTIVESCREENBUFFER
));
1239 if (!NT_SUCCESS(Status
))
1241 BaseSetLastNTError(Status
);
1249 /*--------------------------------------------------------------
1250 * FlushConsoleInputBuffer
1256 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
1259 CONSOLE_API_MESSAGE ApiMessage
;
1261 ApiMessage
.Data
.FlushInputBufferRequest
.InputHandle
= hConsoleInput
;
1263 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1265 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFlushInputBuffer
),
1266 sizeof(CONSOLE_FLUSHINPUTBUFFER
));
1267 if (!NT_SUCCESS(Status
))
1269 BaseSetLastNTError(Status
);
1277 /*--------------------------------------------------------------
1278 * SetConsoleScreenBufferSize
1284 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
1288 CONSOLE_API_MESSAGE ApiMessage
;
1290 ApiMessage
.Data
.SetScreenBufferSizeRequest
.OutputHandle
= hConsoleOutput
;
1291 ApiMessage
.Data
.SetScreenBufferSizeRequest
.Size
= dwSize
;
1293 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1295 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetScreenBufferSize
),
1296 sizeof(CONSOLE_SETSCREENBUFFERSIZE
));
1297 if (!NT_SUCCESS(Status
))
1299 BaseSetLastNTError(Status
);
1307 /*--------------------------------------------------------------
1308 * SetConsoleCursorInfo
1314 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
1315 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
1318 CONSOLE_API_MESSAGE ApiMessage
;
1320 ApiMessage
.Data
.CursorInfoRequest
.OutputHandle
= hConsoleOutput
;
1321 ApiMessage
.Data
.CursorInfoRequest
.Info
= *lpConsoleCursorInfo
;
1323 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1325 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorInfo
),
1326 sizeof(CONSOLE_GETSETCURSORINFO
));
1327 if (!NT_SUCCESS(Status
))
1329 BaseSetLastNTError(Status
);
1339 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
1340 const SMALL_RECT
*lpScrollRectangle
,
1341 const SMALL_RECT
*lpClipRectangle
,
1342 COORD dwDestinationOrigin
,
1343 const CHAR_INFO
*lpFill
,
1347 CONSOLE_API_MESSAGE ApiMessage
;
1348 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &ApiMessage
.Data
.ScrollScreenBufferRequest
;
1350 ScrollScreenBufferRequest
->OutputHandle
= hConsoleOutput
;
1351 ScrollScreenBufferRequest
->Unicode
= bUnicode
;
1352 ScrollScreenBufferRequest
->ScrollRectangle
= *lpScrollRectangle
;
1354 if (lpClipRectangle
!= NULL
)
1356 ScrollScreenBufferRequest
->UseClipRectangle
= TRUE
;
1357 ScrollScreenBufferRequest
->ClipRectangle
= *lpClipRectangle
;
1361 ScrollScreenBufferRequest
->UseClipRectangle
= FALSE
;
1364 ScrollScreenBufferRequest
->DestinationOrigin
= dwDestinationOrigin
;
1365 ScrollScreenBufferRequest
->Fill
= *lpFill
;
1367 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1369 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepScrollScreenBuffer
),
1370 sizeof(CONSOLE_SCROLLSCREENBUFFER
));
1372 if (!NT_SUCCESS(Status
))
1374 BaseSetLastNTError(Status
);
1382 /*--------------------------------------------------------------
1383 * ScrollConsoleScreenBufferA
1389 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
1390 CONST SMALL_RECT
*lpScrollRectangle
,
1391 CONST SMALL_RECT
*lpClipRectangle
,
1392 COORD dwDestinationOrigin
,
1393 CONST CHAR_INFO
*lpFill
)
1395 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1396 (PSMALL_RECT
)lpScrollRectangle
,
1397 (PSMALL_RECT
)lpClipRectangle
,
1398 dwDestinationOrigin
,
1404 /*--------------------------------------------------------------
1405 * ScrollConsoleScreenBufferW
1411 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
1412 CONST SMALL_RECT
*lpScrollRectangle
,
1413 CONST SMALL_RECT
*lpClipRectangle
,
1414 COORD dwDestinationOrigin
,
1415 CONST CHAR_INFO
*lpFill
)
1417 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1420 dwDestinationOrigin
,
1426 /*--------------------------------------------------------------
1427 * SetConsoleWindowInfo
1433 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
1435 CONST SMALL_RECT
*lpConsoleWindow
)
1438 CONSOLE_API_MESSAGE ApiMessage
;
1439 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &ApiMessage
.Data
.SetWindowInfoRequest
;
1441 if (lpConsoleWindow
== NULL
)
1443 SetLastError(ERROR_INVALID_PARAMETER
);
1447 SetWindowInfoRequest
->OutputHandle
= hConsoleOutput
;
1448 SetWindowInfoRequest
->Absolute
= bAbsolute
;
1449 SetWindowInfoRequest
->WindowRect
= *lpConsoleWindow
;
1451 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1453 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetWindowInfo
),
1454 sizeof(CONSOLE_SETWINDOWINFO
));
1455 if (!NT_SUCCESS(Status
))
1457 BaseSetLastNTError(Status
);
1465 /*--------------------------------------------------------------
1466 * SetConsoleTextAttribute
1472 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
1476 CONSOLE_API_MESSAGE ApiMessage
;
1478 ApiMessage
.Data
.SetTextAttribRequest
.OutputHandle
= hConsoleOutput
;
1479 ApiMessage
.Data
.SetTextAttribRequest
.Attrib
= wAttributes
;
1481 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1483 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTextAttribute
),
1484 sizeof(CONSOLE_SETTEXTATTRIB
));
1485 if (!NT_SUCCESS(Status
))
1487 BaseSetLastNTError(Status
);
1497 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1499 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
1501 if (HandlerRoutine
== NULL
)
1503 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
1507 if (NrCtrlHandlers
== NrAllocatedHandlers
)
1509 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
1511 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
1512 if (NewCtrlHandlers
== NULL
)
1514 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1518 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
1520 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
1522 CtrlHandlers
= NewCtrlHandlers
;
1523 NrAllocatedHandlers
+= 4;
1526 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
1528 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
1535 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1539 if (HandlerRoutine
== NULL
)
1541 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
1545 for (i
= 0; i
< NrCtrlHandlers
; i
++)
1547 if (CtrlHandlers
[i
] == HandlerRoutine
)
1549 if (i
< (NrCtrlHandlers
- 1))
1551 memmove(&CtrlHandlers
[i
],
1553 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
1561 SetLastError(ERROR_INVALID_PARAMETER
);
1571 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
1576 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
1579 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
1583 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
1586 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
1591 /*--------------------------------------------------------------
1592 * GenerateConsoleCtrlEvent
1598 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
1599 DWORD dwProcessGroupId
)
1602 CONSOLE_API_MESSAGE ApiMessage
;
1604 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
1606 SetLastError(ERROR_INVALID_PARAMETER
);
1610 ApiMessage
.Data
.GenerateCtrlEventRequest
.Event
= dwCtrlEvent
;
1611 ApiMessage
.Data
.GenerateCtrlEventRequest
.ProcessGroup
= dwProcessGroupId
;
1613 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1615 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGenerateCtrlEvent
),
1616 sizeof(CONSOLE_GENERATECTRLEVENT
));
1617 if (!NT_SUCCESS(Status
))
1619 BaseSetLastNTError(Status
);
1628 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD nSize
, BOOL bUnicode
)
1631 CONSOLE_API_MESSAGE ApiMessage
;
1632 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1633 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1635 if (nSize
== 0) return 0;
1637 TitleRequest
->Length
= nSize
* (bUnicode
? 1 : sizeof(WCHAR
));
1638 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1639 if (CaptureBuffer
== NULL
)
1641 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1642 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1646 CsrAllocateMessagePointer(CaptureBuffer
,
1647 TitleRequest
->Length
,
1648 (PVOID
*)&TitleRequest
->Title
);
1650 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1652 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetTitle
),
1653 sizeof(CONSOLE_GETSETCONSOLETITLE
));
1654 if (!NT_SUCCESS(Status
))
1656 CsrFreeCaptureBuffer(CaptureBuffer
);
1657 BaseSetLastNTError(Status
);
1663 if (nSize
>= sizeof(WCHAR
))
1664 wcscpy((LPWSTR
)lpConsoleTitle
, TitleRequest
->Title
);
1668 if (nSize
< TitleRequest
->Length
/ sizeof(WCHAR
) ||
1669 !WideCharToMultiByte(CP_ACP
, // ANSI code page
1670 0, // performance and mapping flags
1671 TitleRequest
->Title
, // address of wide-character string
1672 -1, // number of characters in string
1673 (LPSTR
)lpConsoleTitle
, // address of buffer for new string
1674 nSize
, // size of buffer
1678 /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
1679 *(LPSTR
)lpConsoleTitle
= '\0';
1680 TitleRequest
->Length
= 0;
1683 CsrFreeCaptureBuffer(CaptureBuffer
);
1685 return TitleRequest
->Length
/ sizeof(WCHAR
);
1689 /*--------------------------------------------------------------
1696 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
1699 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
1703 /*--------------------------------------------------------------
1710 GetConsoleTitleA(LPSTR lpConsoleTitle
,
1713 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
1717 /*--------------------------------------------------------------
1724 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
1727 CONSOLE_API_MESSAGE ApiMessage
;
1728 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1729 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1731 TitleRequest
->Length
= wcslen(lpConsoleTitle
) * sizeof(WCHAR
);
1733 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1734 if (CaptureBuffer
== NULL
)
1736 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1737 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1741 CsrCaptureMessageBuffer(CaptureBuffer
,
1742 (PVOID
)lpConsoleTitle
,
1743 TitleRequest
->Length
,
1744 (PVOID
*)&TitleRequest
->Title
);
1746 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1748 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTitle
),
1749 sizeof(CONSOLE_GETSETCONSOLETITLE
));
1751 CsrFreeCaptureBuffer(CaptureBuffer
);
1753 if (!NT_SUCCESS(Status
))
1755 BaseSetLastNTError(Status
);
1763 /*--------------------------------------------------------------
1770 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
1773 ULONG Length
= strlen(lpConsoleTitle
) + 1;
1774 LPWSTR WideTitle
= HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
1778 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1782 MultiByteToWideChar(CP_ACP
, 0, lpConsoleTitle
, -1, WideTitle
, Length
);
1784 Ret
= SetConsoleTitleW(WideTitle
);
1786 HeapFree(GetProcessHeap(), 0, WideTitle
);
1791 /*--------------------------------------------------------------
1792 * CreateConsoleScreenBuffer
1798 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
1800 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1802 LPVOID lpScreenBufferData
)
1805 CONSOLE_API_MESSAGE ApiMessage
;
1807 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
1808 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) ||
1809 (dwFlags
!= CONSOLE_TEXTMODE_BUFFER
) )
1811 SetLastError(ERROR_INVALID_PARAMETER
);
1812 return INVALID_HANDLE_VALUE
;
1815 ApiMessage
.Data
.CreateScreenBufferRequest
.Access
= dwDesiredAccess
;
1816 ApiMessage
.Data
.CreateScreenBufferRequest
.ShareMode
= dwShareMode
;
1817 ApiMessage
.Data
.CreateScreenBufferRequest
.Inheritable
=
1818 (lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
);
1820 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1822 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCreateScreenBuffer
),
1823 sizeof(CONSOLE_CREATESCREENBUFFER
));
1824 if (!NT_SUCCESS(Status
))
1826 BaseSetLastNTError(Status
);
1827 return INVALID_HANDLE_VALUE
;
1830 return ApiMessage
.Data
.CreateScreenBufferRequest
.OutputHandle
;
1834 /*--------------------------------------------------------------
1844 CONSOLE_API_MESSAGE ApiMessage
;
1846 /* Get the Input Code Page */
1847 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= TRUE
;
1849 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1851 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
1852 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1853 if (!NT_SUCCESS(Status
))
1855 BaseSetLastNTError(Status
);
1859 return ApiMessage
.Data
.ConsoleCPRequest
.CodePage
;
1863 /*--------------------------------------------------------------
1870 SetConsoleCP(UINT wCodePageID
)
1873 CONSOLE_API_MESSAGE ApiMessage
;
1875 /* Set the Input Code Page */
1876 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= TRUE
;
1877 ApiMessage
.Data
.ConsoleCPRequest
.CodePage
= wCodePageID
;
1879 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1881 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
1882 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1883 if (!NT_SUCCESS(Status
))
1885 BaseSetLastNTError(Status
);
1888 return NT_SUCCESS(Status
);
1892 /*--------------------------------------------------------------
1893 * GetConsoleOutputCP
1899 GetConsoleOutputCP(VOID
)
1902 CONSOLE_API_MESSAGE ApiMessage
;
1904 /* Get the Output Code Page */
1905 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= FALSE
;
1907 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1909 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
1910 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1911 if (!NT_SUCCESS(Status
))
1913 BaseSetLastNTError (Status
);
1917 return ApiMessage
.Data
.ConsoleCPRequest
.CodePage
;
1921 /*--------------------------------------------------------------
1922 * SetConsoleOutputCP
1928 SetConsoleOutputCP(UINT wCodePageID
)
1931 CONSOLE_API_MESSAGE ApiMessage
;
1933 /* Set the Output Code Page */
1934 ApiMessage
.Data
.ConsoleCPRequest
.InputCP
= FALSE
;
1935 ApiMessage
.Data
.ConsoleCPRequest
.CodePage
= wCodePageID
;
1937 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1939 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
1940 sizeof(CONSOLE_GETSETINPUTOUTPUTCP
));
1941 if (!NT_SUCCESS(Status
))
1943 BaseSetLastNTError(Status
);
1946 return NT_SUCCESS(Status
);
1950 /*--------------------------------------------------------------
1951 * GetConsoleProcessList
1957 GetConsoleProcessList(LPDWORD lpdwProcessList
,
1958 DWORD dwProcessCount
)
1961 CONSOLE_API_MESSAGE ApiMessage
;
1962 PCONSOLE_GETPROCESSLIST GetProcessListRequest
= &ApiMessage
.Data
.GetProcessListRequest
;
1963 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1966 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
1968 SetLastError(ERROR_INVALID_PARAMETER
);
1972 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
1973 if (CaptureBuffer
== NULL
)
1975 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1976 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1980 GetProcessListRequest
->nMaxIds
= dwProcessCount
;
1982 CsrAllocateMessagePointer(CaptureBuffer
,
1983 dwProcessCount
* sizeof(DWORD
),
1984 (PVOID
*)&GetProcessListRequest
->pProcessIds
);
1986 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1988 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetProcessList
),
1989 sizeof(CONSOLE_GETPROCESSLIST
));
1990 if (!NT_SUCCESS(Status
))
1992 BaseSetLastNTError (Status
);
1997 nProcesses
= GetProcessListRequest
->nProcessIdsTotal
;
1998 if (dwProcessCount
>= nProcesses
)
2000 memcpy(lpdwProcessList
, GetProcessListRequest
->pProcessIds
, nProcesses
* sizeof(DWORD
));
2004 CsrFreeCaptureBuffer(CaptureBuffer
);
2009 /*--------------------------------------------------------------
2010 * GetConsoleSelectionInfo
2016 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
2019 CONSOLE_API_MESSAGE ApiMessage
;
2021 if (lpConsoleSelectionInfo
== NULL
)
2023 SetLastError(ERROR_INVALID_PARAMETER
);
2027 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2029 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetSelectionInfo
),
2030 sizeof(CONSOLE_GETSELECTIONINFO
));
2031 if (!NT_SUCCESS(Status
))
2033 BaseSetLastNTError(Status
);
2037 *lpConsoleSelectionInfo
= ApiMessage
.Data
.GetSelectionInfoRequest
.Info
;
2042 /*--------------------------------------------------------------
2047 * @note Strongly inspired by AllocConsole.
2051 AttachConsole(DWORD dwProcessId
)
2054 PRTL_USER_PROCESS_PARAMETERS Parameters
= NtCurrentPeb()->ProcessParameters
;
2055 CONSOLE_API_MESSAGE ApiMessage
;
2056 PCONSOLE_ATTACHCONSOLE AttachConsoleRequest
= &ApiMessage
.Data
.AttachConsoleRequest
;
2058 if (Parameters
->ConsoleHandle
)
2060 DPRINT1("AttachConsole: Attaching a console to a process already having one\n");
2061 SetLastError(ERROR_ACCESS_DENIED
);
2065 AttachConsoleRequest
->ProcessId
= dwProcessId
;
2066 AttachConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
2067 AttachConsoleRequest
->PropDispatcher
= PropDialogHandler
;
2069 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2071 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAttach
),
2072 sizeof(CONSOLE_ATTACHCONSOLE
));
2073 if (!NT_SUCCESS(Status
))
2075 BaseSetLastNTError(Status
);
2079 Parameters
->ConsoleHandle
= AttachConsoleRequest
->Console
;
2080 SetStdHandle(STD_INPUT_HANDLE
, AttachConsoleRequest
->InputHandle
);
2081 SetStdHandle(STD_OUTPUT_HANDLE
, AttachConsoleRequest
->OutputHandle
);
2082 SetStdHandle(STD_ERROR_HANDLE
, AttachConsoleRequest
->ErrorHandle
);
2084 /* Initialize Console Ctrl Handler */
2085 InitConsoleCtrlHandling();
2087 InputWaitHandle
= AttachConsoleRequest
->InputWaitHandle
;
2093 /*--------------------------------------------------------------
2100 GetConsoleWindow(VOID
)
2103 CONSOLE_API_MESSAGE ApiMessage
;
2105 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2107 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetConsoleWindow
),
2108 sizeof(CONSOLE_GETWINDOW
));
2109 if (!NT_SUCCESS(Status
))
2111 BaseSetLastNTError(Status
);
2115 return ApiMessage
.Data
.GetWindowRequest
.WindowHandle
;
2119 /*--------------------------------------------------------------
2126 SetConsoleIcon(HICON hicon
)
2129 CONSOLE_API_MESSAGE ApiMessage
;
2131 ApiMessage
.Data
.SetIconRequest
.WindowIcon
= hicon
;
2133 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2135 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetIcon
),
2136 sizeof(CONSOLE_SETICON
));
2137 if (!NT_SUCCESS(Status
))
2139 BaseSetLastNTError(Status
);
2143 return NT_SUCCESS(Status
);
2147 /******************************************************************************
2148 * \name SetConsoleInputExeNameW
2149 * \brief Sets the console input file name from a unicode string.
2150 * \param lpInputExeName Pointer to a unicode string with the name.
2151 * \return TRUE if successful, FALSE if unsuccsedful.
2152 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2153 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2157 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
2161 if ( !lpInputExeName
||
2162 (lenName
= lstrlenW(lpInputExeName
)) == 0 ||
2163 lenName
> INPUTEXENAME_BUFLEN
- 1 )
2165 /* Fail if string is empty or too long */
2166 SetLastError(ERROR_INVALID_PARAMETER
);
2170 RtlEnterCriticalSection(&ConsoleLock
);
2173 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
2174 InputExeName
[lenName
] = L
'\0';
2178 RtlLeaveCriticalSection(&ConsoleLock
);
2186 /******************************************************************************
2187 * \name SetConsoleInputExeNameA
2188 * \brief Sets the console input file name from an ansi string.
2189 * \param lpInputExeName Pointer to an ansi string with the name.
2190 * \return TRUE if successful, FALSE if unsuccsedful.
2191 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2192 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2196 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
2198 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2199 ANSI_STRING InputExeNameA
;
2200 UNICODE_STRING InputExeNameU
;
2203 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
2205 if ( InputExeNameA
.Length
== 0 ||
2206 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1 )
2208 /* Fail if string is empty or too long */
2209 SetLastError(ERROR_INVALID_PARAMETER
);
2213 InputExeNameU
.Buffer
= Buffer
;
2214 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
2215 InputExeNameU
.Length
= 0;
2217 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
2218 if (!NT_SUCCESS(Status
))
2220 BaseSetLastNTError(Status
);
2224 return SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
2228 /******************************************************************************
2229 * \name GetConsoleInputExeNameW
2230 * \brief Retrieves the console input file name as unicode string.
2231 * \param nBufferLength Length of the buffer in WCHARs.
2232 * Specify 0 to receive the needed buffer length.
2233 * \param lpBuffer Pointer to a buffer that receives the string.
2234 * \return Needed buffer size if \p nBufferLength is 0.
2235 * Otherwise 1 if successful, 2 if buffer is too small.
2236 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2237 * is not big enough.
2241 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
2243 ULONG lenName
= lstrlenW(InputExeName
);
2245 if (nBufferLength
== 0)
2247 /* Buffer size is requested, return it */
2251 if (lenName
+ 1 > nBufferLength
)
2253 /* Buffer is not large enough! */
2254 SetLastError(ERROR_BUFFER_OVERFLOW
);
2258 RtlEnterCriticalSection(&ConsoleLock
);
2261 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
2262 lpBuffer
[lenName
] = '\0';
2266 RtlLeaveCriticalSection(&ConsoleLock
);
2270 /* Success, return 1 */
2275 /******************************************************************************
2276 * \name GetConsoleInputExeNameA
2277 * \brief Retrieves the console input file name as ansi string.
2278 * \param nBufferLength Length of the buffer in CHARs.
2279 * \param lpBuffer Pointer to a buffer that receives the string.
2280 * \return 1 if successful, 2 if buffer is too small.
2281 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2282 * is not big enough. The buffer receives as much characters as fit.
2286 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
2288 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2290 UNICODE_STRING BufferU
;
2291 ANSI_STRING BufferA
;
2293 /* Get the unicode name */
2294 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
2296 /* Initialize strings for conversion */
2297 RtlInitUnicodeString(&BufferU
, Buffer
);
2299 BufferA
.MaximumLength
= nBufferLength
;
2300 BufferA
.Buffer
= lpBuffer
;
2302 /* Convert unicode name to ansi, copying as much chars as fit */
2303 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
2305 /* Error handling */
2306 if (nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
2308 SetLastError(ERROR_BUFFER_OVERFLOW
);
2317 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
2325 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
2333 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
2341 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
2349 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
2357 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
2365 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
2373 RegisterConsoleOS2(BOOL bUnknown
)
2381 SetConsoleOS2OemFormat(BOOL bUnknown
)
2389 UnregisterConsoleIME(VOID
)
2399 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
2408 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
2419 SetLastConsoleEventActive(VOID
)