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
;
33 BOOL LastCloseNotify
= FALSE
;
35 HANDLE InputWaitHandle
= INVALID_HANDLE_VALUE
;
37 #define INPUTEXENAME_BUFLEN 256
38 static WCHAR InputExeName
[INPUTEXENAME_BUFLEN
];
41 /* Default Console Control Handler ********************************************/
45 DefaultConsoleCtrlHandler(DWORD Event
)
47 DPRINT("Default handler called: %lx\n", Event
);
51 DPRINT("Ctrl-C Event\n");
54 case CTRL_BREAK_EVENT
:
55 DPRINT("Ctrl-Break Event\n");
58 case CTRL_CLOSE_EVENT
:
59 DPRINT("Ctrl Close Event\n");
62 case CTRL_LAST_CLOSE_EVENT
:
63 DPRINT("Ctrl Last Close Event\n");
66 case CTRL_LOGOFF_EVENT
:
67 DPRINT("Ctrl Logoff Event\n");
70 case CTRL_SHUTDOWN_EVENT
:
71 DPRINT("Ctrl Shutdown Event\n");
75 ExitProcess(CONTROL_C_EXIT
);
81 ConsoleControlDispatcher(IN LPVOID lpThreadParameter
)
84 DWORD CodeAndFlag
= PtrToUlong(lpThreadParameter
);
85 DWORD nCode
= CodeAndFlag
& MAXLONG
;
87 EXCEPTION_RECORD erException
;
89 DPRINT1("Console Dispatcher Active: %lx %lx\n", CodeAndFlag
, nCode
);
90 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST
);
95 case CTRL_BREAK_EVENT
:
97 if (IsDebuggerPresent())
99 erException
.ExceptionCode
= (nCode
== CTRL_C_EVENT
?
100 DBG_CONTROL_C
: DBG_CONTROL_BREAK
);
101 erException
.ExceptionFlags
= 0;
102 erException
.ExceptionRecord
= NULL
;
103 erException
.ExceptionAddress
= DefaultConsoleCtrlHandler
;
104 erException
.NumberParameters
= 0;
108 RtlRaiseException(&erException
);
110 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
112 RtlEnterCriticalSection(&ConsoleLock
);
114 if ((nCode
!= CTRL_C_EVENT
) ||
115 (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
117 for (i
= NrCtrlHandlers
; i
> 0; i
--)
119 if (CtrlHandlers
[i
- 1](nCode
)) break;
123 RtlLeaveCriticalSection(&ConsoleLock
);
132 case CTRL_CLOSE_EVENT
:
133 case CTRL_LOGOFF_EVENT
:
134 case CTRL_SHUTDOWN_EVENT
:
137 case CTRL_LAST_CLOSE_EVENT
:
139 * In case the console app hasn't register for last close notification,
140 * just kill this console handler thread. We don't want that such apps
141 * get killed for unexpected reasons. On the contrary apps that registered
142 * can be killed because they expect to be.
144 if (!LastCloseNotify
) ExitThread(0);
148 ExitProcess(CONTROL_C_EXIT
);
156 ASSERT(ConsoleInitialized
);
158 RtlEnterCriticalSection(&ConsoleLock
);
161 if ((nCode
!= CTRL_C_EVENT
) || (NtCurrentPeb()->ProcessParameters
->ConsoleFlags
!= 1))
163 for (i
= NrCtrlHandlers
; i
> 0; i
--)
166 (CodeAndFlag
& MINLONG
) &&
167 ((nCode
== CTRL_LOGOFF_EVENT
) || (nCode
== CTRL_SHUTDOWN_EVENT
)))
169 DPRINT("Skipping system/service apps\n");
173 if (CtrlHandlers
[i
- 1](nCode
))
177 case CTRL_CLOSE_EVENT
:
178 case CTRL_LAST_CLOSE_EVENT
:
179 case CTRL_LOGOFF_EVENT
:
180 case CTRL_SHUTDOWN_EVENT
:
181 nExitCode
= CodeAndFlag
;
189 RtlLeaveCriticalSection(&ConsoleLock
);
191 ExitThread(nExitCode
);
192 return STATUS_SUCCESS
;
197 InitConsoleCtrlHandling(VOID
)
199 /* Initialize Console Ctrl Handler */
200 NrAllocatedHandlers
= NrCtrlHandlers
= 1;
201 CtrlHandlers
= InitialHandler
;
202 CtrlHandlers
[0] = DefaultConsoleCtrlHandler
;
206 /* FUNCTIONS ******************************************************************/
209 IntCheckForConsoleFileName(IN LPCWSTR pszName
,
210 IN DWORD dwDesiredAccess
)
212 LPCWSTR ConsoleName
= pszName
;
213 ULONG DeviceNameInfo
;
216 * Check whether we deal with a DOS device, and if so,
217 * strip the path till the file name.
218 * Therefore, things like \\.\CON or C:\some_path\CONIN$
219 * are transformed into CON or CONIN$, for example.
221 DeviceNameInfo
= RtlIsDosDeviceName_U(pszName
);
222 if (DeviceNameInfo
!= 0)
224 ConsoleName
= (LPCWSTR
)((ULONG_PTR
)ConsoleName
+ ((DeviceNameInfo
>> 16) & 0xFFFF));
227 /* Return a standard console "file" name according to what we passed in parameters */
228 if (_wcsicmp(ConsoleName
, BaseConInputFileName
) == 0)
230 return BaseConInputFileName
;
232 else if (_wcsicmp(ConsoleName
, BaseConOutputFileName
) == 0)
234 return BaseConOutputFileName
;
236 else if (_wcsicmp(ConsoleName
, BaseConFileName
) == 0)
238 if ((dwDesiredAccess
& (GENERIC_READ
| GENERIC_WRITE
)) == GENERIC_READ
)
240 return BaseConInputFileName
;
242 else if ((dwDesiredAccess
& (GENERIC_READ
| GENERIC_WRITE
)) == GENERIC_WRITE
)
244 return BaseConOutputFileName
;
248 /* If we are there, that means that either the file name or the desired access are wrong */
254 * @implemented (Undocumented)
255 * @note See http://undoc.airesoft.co.uk/kernel32.dll/ConsoleMenuControl.php
259 ConsoleMenuControl(HANDLE hConsoleOutput
,
263 CONSOLE_API_MESSAGE ApiMessage
;
264 PCONSOLE_MENUCONTROL MenuControlRequest
= &ApiMessage
.Data
.MenuControlRequest
;
266 MenuControlRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
267 MenuControlRequest
->OutputHandle
= hConsoleOutput
;
268 MenuControlRequest
->CmdIdLow
= dwCmdIdLow
;
269 MenuControlRequest
->CmdIdHigh
= dwCmdIdHigh
;
270 MenuControlRequest
->MenuHandle
= NULL
;
272 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
274 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepMenuControl
),
275 sizeof(*MenuControlRequest
));
277 return MenuControlRequest
->MenuHandle
;
286 DuplicateConsoleHandle(HANDLE hConsole
,
287 DWORD dwDesiredAccess
,
291 CONSOLE_API_MESSAGE ApiMessage
;
292 PCONSOLE_DUPLICATEHANDLE DuplicateHandleRequest
= &ApiMessage
.Data
.DuplicateHandleRequest
;
294 if ( (dwOptions
& ~(DUPLICATE_CLOSE_SOURCE
| DUPLICATE_SAME_ACCESS
)) ||
295 (!(dwOptions
& DUPLICATE_SAME_ACCESS
) &&
296 (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
))) )
298 SetLastError(ERROR_INVALID_PARAMETER
);
299 return INVALID_HANDLE_VALUE
;
302 DuplicateHandleRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
303 DuplicateHandleRequest
->SourceHandle
= hConsole
;
304 DuplicateHandleRequest
->DesiredAccess
= dwDesiredAccess
;
305 DuplicateHandleRequest
->InheritHandle
= bInheritHandle
;
306 DuplicateHandleRequest
->Options
= dwOptions
;
308 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
310 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepDuplicateHandle
),
311 sizeof(*DuplicateHandleRequest
));
312 if (!NT_SUCCESS(ApiMessage
.Status
))
314 BaseSetLastNTError(ApiMessage
.Status
);
315 return INVALID_HANDLE_VALUE
;
318 return DuplicateHandleRequest
->TargetHandle
;
327 GetConsoleHandleInformation(IN HANDLE hHandle
,
328 OUT LPDWORD lpdwFlags
)
330 CONSOLE_API_MESSAGE ApiMessage
;
331 PCONSOLE_GETHANDLEINFO GetHandleInfoRequest
= &ApiMessage
.Data
.GetHandleInfoRequest
;
333 GetHandleInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
334 GetHandleInfoRequest
->Handle
= hHandle
;
336 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
338 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetHandleInformation
),
339 sizeof(*GetHandleInfoRequest
));
340 if (!NT_SUCCESS(ApiMessage
.Status
))
342 BaseSetLastNTError(ApiMessage
.Status
);
346 *lpdwFlags
= GetHandleInfoRequest
->Flags
;
357 SetConsoleHandleInformation(IN HANDLE hHandle
,
361 CONSOLE_API_MESSAGE ApiMessage
;
362 PCONSOLE_SETHANDLEINFO SetHandleInfoRequest
= &ApiMessage
.Data
.SetHandleInfoRequest
;
364 SetHandleInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
365 SetHandleInfoRequest
->Handle
= hHandle
;
366 SetHandleInfoRequest
->Mask
= dwMask
;
367 SetHandleInfoRequest
->Flags
= dwFlags
;
369 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
371 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetHandleInformation
),
372 sizeof(*SetHandleInfoRequest
));
373 if (!NT_SUCCESS(ApiMessage
.Status
))
375 BaseSetLastNTError(ApiMessage
.Status
);
388 GetConsoleDisplayMode(LPDWORD lpModeFlags
)
390 CONSOLE_API_MESSAGE ApiMessage
;
391 PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest
= &ApiMessage
.Data
.GetDisplayModeRequest
;
393 if (lpModeFlags
== NULL
)
395 SetLastError(ERROR_INVALID_PARAMETER
);
399 GetDisplayModeRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
401 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
403 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetDisplayMode
),
404 sizeof(*GetDisplayModeRequest
));
405 if (!NT_SUCCESS(ApiMessage
.Status
))
407 BaseSetLastNTError(ApiMessage
.Status
);
411 *lpModeFlags
= GetDisplayModeRequest
->DisplayMode
; // ModeFlags
418 * @unimplemented (Undocumented)
422 GetConsoleFontInfo(HANDLE hConsoleOutput
,
425 PCONSOLE_FONT_INFO lpConsoleFontInfo
)
427 DPRINT1("GetConsoleFontInfo(0x%p, %d, %lu, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, nFontCount
, lpConsoleFontInfo
);
428 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
438 GetConsoleFontSize(HANDLE hConsoleOutput
,
441 COORD Empty
= {0, 0};
442 DPRINT1("GetConsoleFontSize(0x%p, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
443 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
449 * @implemented (Undocumented)
453 GetConsoleHardwareState(HANDLE hConsoleOutput
,
457 CONSOLE_API_MESSAGE ApiMessage
;
458 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &ApiMessage
.Data
.HardwareStateRequest
;
460 DPRINT1("GetConsoleHardwareState(%lu, 0x%p) UNIMPLEMENTED!\n", Flags
, State
);
462 if (Flags
== NULL
|| State
== NULL
)
464 SetLastError(ERROR_INVALID_PARAMETER
);
468 HardwareStateRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
469 HardwareStateRequest
->OutputHandle
= hConsoleOutput
;
471 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
473 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetHardwareState
),
474 sizeof(*HardwareStateRequest
));
475 if (!NT_SUCCESS(ApiMessage
.Status
))
477 BaseSetLastNTError(ApiMessage
.Status
);
481 *Flags
= HardwareStateRequest
->Flags
;
482 *State
= HardwareStateRequest
->State
;
489 * @implemented (Undocumented)
493 GetConsoleInputWaitHandle(VOID
)
495 return InputWaitHandle
;
504 GetCurrentConsoleFont(HANDLE hConsoleOutput
,
506 PCONSOLE_FONT_INFO lpConsoleCurrentFont
)
508 DPRINT1("GetCurrentConsoleFont(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput
, bMaximumWindow
, lpConsoleCurrentFont
);
509 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
515 * @unimplemented (Undocumented)
519 GetNumberOfConsoleFonts(VOID
)
521 DPRINT1("GetNumberOfConsoleFonts() UNIMPLEMENTED!\n");
522 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
528 * @implemented (Undocumented)
529 * @note See http://blog.airesoft.co.uk/2012/10/things-ms-can-do-that-they-dont-tell-you-about-console-graphics/
533 InvalidateConsoleDIBits(IN HANDLE hConsoleOutput
,
534 IN PSMALL_RECT lpRect
)
536 CONSOLE_API_MESSAGE ApiMessage
;
537 PCONSOLE_INVALIDATEDIBITS InvalidateDIBitsRequest
= &ApiMessage
.Data
.InvalidateDIBitsRequest
;
541 SetLastError(ERROR_INVALID_PARAMETER
);
545 InvalidateDIBitsRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
546 InvalidateDIBitsRequest
->OutputHandle
= hConsoleOutput
;
547 InvalidateDIBitsRequest
->Region
= *lpRect
;
549 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
551 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepInvalidateBitMapRect
),
552 sizeof(*InvalidateDIBitsRequest
));
553 if (!NT_SUCCESS(ApiMessage
.Status
))
555 BaseSetLastNTError(ApiMessage
.Status
);
564 * @unimplemented (Undocumented)
568 OpenConsoleW(LPCWSTR wsName
,
569 DWORD dwDesiredAccess
,
573 CONSOLE_API_MESSAGE ApiMessage
;
574 PCONSOLE_OPENCONSOLE OpenConsoleRequest
= &ApiMessage
.Data
.OpenConsoleRequest
;
575 CONSOLE_HANDLE_TYPE HandleType
;
577 if (wsName
&& (_wcsicmp(wsName
, BaseConInputFileName
) == 0))
579 HandleType
= HANDLE_INPUT
;
581 else if (wsName
&& (_wcsicmp(wsName
, BaseConOutputFileName
) == 0))
583 HandleType
= HANDLE_OUTPUT
;
587 SetLastError(ERROR_INVALID_PARAMETER
);
588 return INVALID_HANDLE_VALUE
;
591 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
592 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) )
594 SetLastError(ERROR_INVALID_PARAMETER
);
595 return INVALID_HANDLE_VALUE
;
598 OpenConsoleRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
599 OpenConsoleRequest
->HandleType
= HandleType
;
600 OpenConsoleRequest
->DesiredAccess
= dwDesiredAccess
;
601 OpenConsoleRequest
->InheritHandle
= bInheritHandle
;
602 OpenConsoleRequest
->ShareMode
= dwShareMode
;
604 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
606 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepOpenConsole
),
607 sizeof(*OpenConsoleRequest
));
608 if (!NT_SUCCESS(ApiMessage
.Status
))
610 BaseSetLastNTError(ApiMessage
.Status
);
611 return INVALID_HANDLE_VALUE
;
614 return OpenConsoleRequest
->Handle
;
619 * @implemented (Undocumented)
620 * @note See http://undoc.airesoft.co.uk/kernel32.dll/SetConsoleCursor.php
624 SetConsoleCursor(HANDLE hConsoleOutput
,
627 CONSOLE_API_MESSAGE ApiMessage
;
628 PCONSOLE_SETCURSOR SetCursorRequest
= &ApiMessage
.Data
.SetCursorRequest
;
630 SetCursorRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
631 SetCursorRequest
->OutputHandle
= hConsoleOutput
;
632 SetCursorRequest
->CursorHandle
= hCursor
;
634 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
636 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursor
),
637 sizeof(*SetCursorRequest
));
638 if (!NT_SUCCESS(ApiMessage
.Status
))
640 BaseSetLastNTError(ApiMessage
.Status
);
653 SetConsoleDisplayMode(HANDLE hConsoleOutput
,
654 DWORD dwFlags
, // dwModeFlags
655 PCOORD lpNewScreenBufferDimensions
)
657 CONSOLE_API_MESSAGE ApiMessage
;
658 PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest
= &ApiMessage
.Data
.SetDisplayModeRequest
;
660 SetDisplayModeRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
661 SetDisplayModeRequest
->OutputHandle
= hConsoleOutput
;
662 SetDisplayModeRequest
->DisplayMode
= dwFlags
; // ModeFlags ; dwModeFlags
663 SetDisplayModeRequest
->NewSBDim
.X
= 0;
664 SetDisplayModeRequest
->NewSBDim
.Y
= 0;
665 /* SetDisplayModeRequest->EventHandle; */
667 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
669 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetDisplayMode
),
670 sizeof(*SetDisplayModeRequest
));
671 if (!NT_SUCCESS(ApiMessage
.Status
))
673 BaseSetLastNTError(ApiMessage
.Status
);
677 if (lpNewScreenBufferDimensions
)
678 *lpNewScreenBufferDimensions
= SetDisplayModeRequest
->NewSBDim
;
685 * @unimplemented (Undocumented)
689 SetConsoleFont(HANDLE hConsoleOutput
,
692 DPRINT1("SetConsoleFont(0x%p, %lu) UNIMPLEMENTED!\n", hConsoleOutput
, nFont
);
693 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
699 * @implemented (Undocumented)
703 SetConsoleHardwareState(HANDLE hConsoleOutput
,
707 CONSOLE_API_MESSAGE ApiMessage
;
708 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &ApiMessage
.Data
.HardwareStateRequest
;
710 DPRINT1("SetConsoleHardwareState(%lu, %lu) UNIMPLEMENTED!\n", Flags
, State
);
712 HardwareStateRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
713 HardwareStateRequest
->OutputHandle
= hConsoleOutput
;
714 HardwareStateRequest
->Flags
= Flags
;
715 HardwareStateRequest
->State
= State
;
717 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
719 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetHardwareState
),
720 sizeof(*HardwareStateRequest
));
721 if (!NT_SUCCESS(ApiMessage
.Status
))
723 BaseSetLastNTError(ApiMessage
.Status
);
732 * @unimplemented (Undocumented)
736 SetConsoleKeyShortcuts(DWORD Unknown0
,
741 DPRINT1("SetConsoleKeyShortcuts(0x%x, 0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0
, Unknown1
, Unknown2
, Unknown3
);
742 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
748 * @implemented (Undocumented)
749 * @note See http://undoc.airesoft.co.uk/kernel32.dll/SetConsoleMaximumWindowSize.php
750 * Does nothing, returns TRUE only. Checked on Windows Server 2003.
754 SetConsoleMaximumWindowSize(HANDLE hConsoleOutput
,
757 DPRINT1("SetConsoleMaximumWindowSize(0x%p, {%d, %d}) does nothing\n",
758 hConsoleOutput
, dwMaximumSize
.X
, dwMaximumSize
.Y
);
764 * @implemented (Undocumented)
768 SetConsoleMenuClose(BOOL bEnable
)
770 CONSOLE_API_MESSAGE ApiMessage
;
771 PCONSOLE_SETMENUCLOSE SetMenuCloseRequest
= &ApiMessage
.Data
.SetMenuCloseRequest
;
773 SetMenuCloseRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
774 SetMenuCloseRequest
->Enable
= bEnable
;
776 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
778 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetMenuClose
),
779 sizeof(*SetMenuCloseRequest
));
780 if (!NT_SUCCESS(ApiMessage
.Status
))
782 BaseSetLastNTError(ApiMessage
.Status
);
791 * @implemented (Undocumented)
792 * @note See http://comments.gmane.org/gmane.comp.lang.harbour.devel/27844
793 * Usage example: https://github.com/harbour/core/commit/d79a1b7b812cbde6ddf718ebfd6939a24f633e52
797 SetConsolePalette(HANDLE hConsoleOutput
,
801 CONSOLE_API_MESSAGE ApiMessage
;
802 PCONSOLE_SETPALETTE SetPaletteRequest
= &ApiMessage
.Data
.SetPaletteRequest
;
804 SetPaletteRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
805 SetPaletteRequest
->OutputHandle
= hConsoleOutput
;
806 SetPaletteRequest
->PaletteHandle
= hPalette
;
807 SetPaletteRequest
->Usage
= dwUsage
;
809 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
811 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetPalette
),
812 sizeof(*SetPaletteRequest
));
813 if (!NT_SUCCESS(ApiMessage
.Status
))
815 BaseSetLastNTError(ApiMessage
.Status
);
823 * @implemented (Undocumented)
824 * @note See http://undoc.airesoft.co.uk/kernel32.dll/ShowConsoleCursor.php
828 ShowConsoleCursor(HANDLE hConsoleOutput
,
831 CONSOLE_API_MESSAGE ApiMessage
;
832 PCONSOLE_SHOWCURSOR ShowCursorRequest
= &ApiMessage
.Data
.ShowCursorRequest
;
834 ShowCursorRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
835 ShowCursorRequest
->OutputHandle
= hConsoleOutput
;
836 ShowCursorRequest
->Show
= bShow
;
837 ShowCursorRequest
->RefCount
= 0;
839 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
841 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepShowCursor
),
842 sizeof(*ShowCursorRequest
));
844 return ShowCursorRequest
->RefCount
;
849 * FUNCTION: Checks whether the given handle is a valid console handle.
852 * hIoHandle - Handle to be checked.
855 * TRUE : Handle is a valid console handle.
856 * FALSE: Handle is not a valid console handle.
858 * STATUS: Officially undocumented
864 VerifyConsoleIoHandle(HANDLE hIoHandle
)
866 CONSOLE_API_MESSAGE ApiMessage
;
867 PCONSOLE_VERIFYHANDLE VerifyHandleRequest
= &ApiMessage
.Data
.VerifyHandleRequest
;
869 VerifyHandleRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
870 VerifyHandleRequest
->Handle
= hIoHandle
;
871 VerifyHandleRequest
->IsValid
= FALSE
;
873 /* If the process is not attached to a console, return invalid handle */
874 if (VerifyHandleRequest
->ConsoleHandle
== NULL
) return FALSE
;
876 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
878 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepVerifyIoHandle
),
879 sizeof(*VerifyHandleRequest
));
880 if (!NT_SUCCESS(ApiMessage
.Status
))
882 BaseSetLastNTError(ApiMessage
.Status
);
886 return VerifyHandleRequest
->IsValid
;
891 * @implemented (Undocumented)
895 CloseConsoleHandle(HANDLE hHandle
)
897 CONSOLE_API_MESSAGE ApiMessage
;
898 PCONSOLE_CLOSEHANDLE CloseHandleRequest
= &ApiMessage
.Data
.CloseHandleRequest
;
900 CloseHandleRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
901 CloseHandleRequest
->Handle
= hHandle
;
903 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
905 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCloseHandle
),
906 sizeof(*CloseHandleRequest
));
907 if (!NT_SUCCESS(ApiMessage
.Status
))
909 BaseSetLastNTError(ApiMessage
.Status
);
922 GetStdHandle(DWORD nStdHandle
)
924 * FUNCTION: Get a handle for the standard input, standard output
925 * and a standard error device.
928 * nStdHandle - Specifies the device for which to return the handle.
930 * RETURNS: If the function succeeds, the return value is the handle
931 * of the specified device. Otherwise the value is INVALID_HANDLE_VALUE.
934 PRTL_USER_PROCESS_PARAMETERS Ppb
= NtCurrentPeb()->ProcessParameters
;
935 HANDLE Handle
= INVALID_HANDLE_VALUE
;
939 case STD_INPUT_HANDLE
:
940 Handle
= Ppb
->StandardInput
;
943 case STD_OUTPUT_HANDLE
:
944 Handle
= Ppb
->StandardOutput
;
947 case STD_ERROR_HANDLE
:
948 Handle
= Ppb
->StandardError
;
952 /* If the returned handle is invalid, set last error */
953 if (Handle
== INVALID_HANDLE_VALUE
) SetLastError(ERROR_INVALID_HANDLE
);
964 SetStdHandle(DWORD nStdHandle
,
967 * FUNCTION: Set the handle for the standard input, standard output or
968 * the standard error device.
971 * nStdHandle - Specifies the handle to be set.
972 * hHandle - The handle to set.
974 * RETURNS: TRUE if the function succeeds, FALSE otherwise.
977 PRTL_USER_PROCESS_PARAMETERS Ppb
= NtCurrentPeb()->ProcessParameters
;
979 /* No need to check if hHandle == INVALID_HANDLE_VALUE */
983 case STD_INPUT_HANDLE
:
984 Ppb
->StandardInput
= hHandle
;
987 case STD_OUTPUT_HANDLE
:
988 Ppb
->StandardOutput
= hHandle
;
991 case STD_ERROR_HANDLE
:
992 Ppb
->StandardError
= hHandle
;
996 /* nStdHandle was invalid, bail out */
997 SetLastError(ERROR_INVALID_HANDLE
);
1002 /*--------------------------------------------------------------
1012 PRTL_USER_PROCESS_PARAMETERS Parameters
= NtCurrentPeb()->ProcessParameters
;
1013 CONSOLE_API_MESSAGE ApiMessage
;
1014 PCONSOLE_ALLOCCONSOLE AllocConsoleRequest
= &ApiMessage
.Data
.AllocConsoleRequest
;
1015 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1017 if (Parameters
->ConsoleHandle
)
1019 DPRINT1("AllocConsole: Allocating a console to a process already having one\n");
1020 SetLastError(ERROR_ACCESS_DENIED
);
1024 CaptureBuffer
= CsrAllocateCaptureBuffer(1, sizeof(CONSOLE_START_INFO
));
1025 if (CaptureBuffer
== NULL
)
1027 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1028 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1032 CsrAllocateMessagePointer(CaptureBuffer
,
1033 sizeof(CONSOLE_START_INFO
),
1034 (PVOID
*)&AllocConsoleRequest
->ConsoleStartInfo
);
1036 InitConsoleInfo(AllocConsoleRequest
->ConsoleStartInfo
,
1037 &Parameters
->ImagePathName
);
1039 AllocConsoleRequest
->ConsoleHandle
= NULL
;
1040 AllocConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
1041 AllocConsoleRequest
->PropDispatcher
= PropDialogHandler
;
1043 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1045 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAlloc
),
1046 sizeof(CONSOLE_ALLOCCONSOLE
));
1048 CsrFreeCaptureBuffer(CaptureBuffer
);
1050 if (!NT_SUCCESS(Status
))
1052 BaseSetLastNTError(Status
);
1056 Parameters
->ConsoleHandle
= AllocConsoleRequest
->ConsoleHandle
;
1057 SetStdHandle(STD_INPUT_HANDLE
, AllocConsoleRequest
->InputHandle
);
1058 SetStdHandle(STD_OUTPUT_HANDLE
, AllocConsoleRequest
->OutputHandle
);
1059 SetStdHandle(STD_ERROR_HANDLE
, AllocConsoleRequest
->ErrorHandle
);
1061 /* Initialize Console Ctrl Handler */
1062 InitConsoleCtrlHandling();
1064 InputWaitHandle
= AllocConsoleRequest
->InputWaitHandle
;
1070 /*--------------------------------------------------------------
1079 // AG: I'm not sure if this is correct (what happens to std handles?)
1080 // but I just tried to reverse what AllocConsole() does...
1083 CONSOLE_API_MESSAGE ApiMessage
;
1085 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1087 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFree
),
1088 sizeof(CONSOLE_FREECONSOLE
));
1089 if (!NT_SUCCESS(Status
))
1091 BaseSetLastNTError(Status
);
1095 NtCurrentPeb()->ProcessParameters
->ConsoleHandle
= NULL
;
1097 CloseHandle(InputWaitHandle
);
1098 InputWaitHandle
= INVALID_HANDLE_VALUE
;
1104 /*--------------------------------------------------------------
1105 * GetConsoleScreenBufferInfo
1111 GetConsoleScreenBufferInfo(HANDLE hConsoleOutput
,
1112 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
1114 CONSOLE_API_MESSAGE ApiMessage
;
1115 PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest
= &ApiMessage
.Data
.ScreenBufferInfoRequest
;
1117 if (lpConsoleScreenBufferInfo
== NULL
)
1119 SetLastError(ERROR_INVALID_PARAMETER
);
1123 ScreenBufferInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1124 ScreenBufferInfoRequest
->OutputHandle
= hConsoleOutput
;
1126 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1128 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetScreenBufferInfo
),
1129 sizeof(*ScreenBufferInfoRequest
));
1130 if (!NT_SUCCESS(ApiMessage
.Status
))
1132 BaseSetLastNTError(ApiMessage
.Status
);
1136 lpConsoleScreenBufferInfo
->dwSize
= ScreenBufferInfoRequest
->ScreenBufferSize
;
1137 lpConsoleScreenBufferInfo
->dwCursorPosition
= ScreenBufferInfoRequest
->CursorPosition
;
1138 lpConsoleScreenBufferInfo
->wAttributes
= ScreenBufferInfoRequest
->Attributes
;
1139 lpConsoleScreenBufferInfo
->srWindow
.Left
= ScreenBufferInfoRequest
->ViewOrigin
.X
;
1140 lpConsoleScreenBufferInfo
->srWindow
.Top
= ScreenBufferInfoRequest
->ViewOrigin
.Y
;
1141 lpConsoleScreenBufferInfo
->srWindow
.Right
= ScreenBufferInfoRequest
->ViewOrigin
.X
+ ScreenBufferInfoRequest
->ViewSize
.X
- 1;
1142 lpConsoleScreenBufferInfo
->srWindow
.Bottom
= ScreenBufferInfoRequest
->ViewOrigin
.Y
+ ScreenBufferInfoRequest
->ViewSize
.Y
- 1;
1143 lpConsoleScreenBufferInfo
->dwMaximumWindowSize
= ScreenBufferInfoRequest
->MaximumViewSize
;
1149 /*--------------------------------------------------------------
1150 * SetConsoleCursorPosition
1156 SetConsoleCursorPosition(HANDLE hConsoleOutput
,
1157 COORD dwCursorPosition
)
1159 CONSOLE_API_MESSAGE ApiMessage
;
1160 PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest
= &ApiMessage
.Data
.SetCursorPositionRequest
;
1162 SetCursorPositionRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1163 SetCursorPositionRequest
->OutputHandle
= hConsoleOutput
;
1164 SetCursorPositionRequest
->Position
= dwCursorPosition
;
1166 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1168 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorPosition
),
1169 sizeof(*SetCursorPositionRequest
));
1170 if (!NT_SUCCESS(ApiMessage
.Status
))
1172 BaseSetLastNTError(ApiMessage
.Status
);
1180 /*--------------------------------------------------------------
1187 GetConsoleMode(HANDLE hConsoleHandle
,
1190 CONSOLE_API_MESSAGE ApiMessage
;
1191 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1195 SetLastError(ERROR_INVALID_PARAMETER
);
1199 ConsoleModeRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1200 ConsoleModeRequest
->Handle
= hConsoleHandle
;
1202 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1204 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetMode
),
1205 sizeof(*ConsoleModeRequest
));
1206 if (!NT_SUCCESS(ApiMessage
.Status
))
1208 BaseSetLastNTError(ApiMessage
.Status
);
1212 *lpMode
= ConsoleModeRequest
->Mode
;
1218 /*--------------------------------------------------------------
1225 SetConsoleMode(HANDLE hConsoleHandle
,
1228 CONSOLE_API_MESSAGE ApiMessage
;
1229 PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest
= &ApiMessage
.Data
.ConsoleModeRequest
;
1231 ConsoleModeRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1232 ConsoleModeRequest
->Handle
= hConsoleHandle
;
1233 ConsoleModeRequest
->Mode
= dwMode
;
1235 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1237 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetMode
),
1238 sizeof(*ConsoleModeRequest
));
1239 if (!NT_SUCCESS(ApiMessage
.Status
))
1241 BaseSetLastNTError(ApiMessage
.Status
);
1249 /*--------------------------------------------------------------
1250 * GetNumberOfConsoleInputEvents
1256 GetNumberOfConsoleInputEvents(HANDLE hConsoleInput
,
1257 LPDWORD lpNumberOfEvents
)
1259 CONSOLE_API_MESSAGE ApiMessage
;
1260 PCONSOLE_GETNUMINPUTEVENTS GetNumInputEventsRequest
= &ApiMessage
.Data
.GetNumInputEventsRequest
;
1262 GetNumInputEventsRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1263 GetNumInputEventsRequest
->InputHandle
= hConsoleInput
;
1264 GetNumInputEventsRequest
->NumberOfEvents
= 0;
1266 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1268 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetNumberOfInputEvents
),
1269 sizeof(*GetNumInputEventsRequest
));
1270 if (!NT_SUCCESS(ApiMessage
.Status
))
1272 BaseSetLastNTError(ApiMessage
.Status
);
1276 if (lpNumberOfEvents
== NULL
)
1278 SetLastError(ERROR_INVALID_ACCESS
);
1282 *lpNumberOfEvents
= GetNumInputEventsRequest
->NumberOfEvents
;
1288 /*--------------------------------------------------------------
1289 * GetLargestConsoleWindowSize
1295 GetLargestConsoleWindowSize(HANDLE hConsoleOutput
)
1297 CONSOLE_API_MESSAGE ApiMessage
;
1298 PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest
= &ApiMessage
.Data
.GetLargestWindowSizeRequest
;
1300 GetLargestWindowSizeRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1301 GetLargestWindowSizeRequest
->OutputHandle
= hConsoleOutput
;
1302 GetLargestWindowSizeRequest
->Size
.X
= 0;
1303 GetLargestWindowSizeRequest
->Size
.Y
= 0;
1305 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1307 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetLargestWindowSize
),
1308 sizeof(*GetLargestWindowSizeRequest
));
1309 if (!NT_SUCCESS(ApiMessage
.Status
))
1311 BaseSetLastNTError(ApiMessage
.Status
);
1314 DPRINT1("GetLargestConsoleWindowSize, X = %d, Y = %d\n", GetLargestWindowSizeRequest
->Size
.X
, GetLargestWindowSizeRequest
->Size
.Y
);
1315 return GetLargestWindowSizeRequest
->Size
;
1319 /*--------------------------------------------------------------
1320 * GetConsoleCursorInfo
1326 GetConsoleCursorInfo(HANDLE hConsoleOutput
,
1327 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
1329 CONSOLE_API_MESSAGE ApiMessage
;
1330 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &ApiMessage
.Data
.CursorInfoRequest
;
1332 if (!lpConsoleCursorInfo
)
1334 if (!hConsoleOutput
)
1335 SetLastError(ERROR_INVALID_HANDLE
);
1337 SetLastError(ERROR_INVALID_ACCESS
);
1342 CursorInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1343 CursorInfoRequest
->OutputHandle
= hConsoleOutput
;
1345 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1347 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCursorInfo
),
1348 sizeof(*CursorInfoRequest
));
1349 if (!NT_SUCCESS(ApiMessage
.Status
))
1351 BaseSetLastNTError(ApiMessage
.Status
);
1355 *lpConsoleCursorInfo
= CursorInfoRequest
->Info
;
1361 /*--------------------------------------------------------------
1362 * SetConsoleCursorInfo
1368 SetConsoleCursorInfo(HANDLE hConsoleOutput
,
1369 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
1371 CONSOLE_API_MESSAGE ApiMessage
;
1372 PCONSOLE_GETSETCURSORINFO CursorInfoRequest
= &ApiMessage
.Data
.CursorInfoRequest
;
1374 CursorInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1375 CursorInfoRequest
->OutputHandle
= hConsoleOutput
;
1376 CursorInfoRequest
->Info
= *lpConsoleCursorInfo
;
1378 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1380 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCursorInfo
),
1381 sizeof(*CursorInfoRequest
));
1382 if (!NT_SUCCESS(ApiMessage
.Status
))
1384 BaseSetLastNTError(ApiMessage
.Status
);
1392 /*--------------------------------------------------------------
1393 * GetNumberOfConsoleMouseButtons
1399 GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons
)
1401 DPRINT1("GetNumberOfConsoleMouseButtons(0x%p) UNIMPLEMENTED!\n", lpNumberOfMouseButtons
);
1402 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1407 /*--------------------------------------------------------------
1408 * SetConsoleActiveScreenBuffer
1414 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
1416 CONSOLE_API_MESSAGE ApiMessage
;
1417 PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest
= &ApiMessage
.Data
.SetScreenBufferRequest
;
1419 SetScreenBufferRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1420 SetScreenBufferRequest
->OutputHandle
= hConsoleOutput
;
1422 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1424 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetActiveScreenBuffer
),
1425 sizeof(*SetScreenBufferRequest
));
1426 if (!NT_SUCCESS(ApiMessage
.Status
))
1428 BaseSetLastNTError(ApiMessage
.Status
);
1436 /*--------------------------------------------------------------
1437 * FlushConsoleInputBuffer
1443 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
1445 CONSOLE_API_MESSAGE ApiMessage
;
1446 PCONSOLE_FLUSHINPUTBUFFER FlushInputBufferRequest
= &ApiMessage
.Data
.FlushInputBufferRequest
;
1448 FlushInputBufferRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1449 FlushInputBufferRequest
->InputHandle
= hConsoleInput
;
1451 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1453 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFlushInputBuffer
),
1454 sizeof(*FlushInputBufferRequest
));
1455 if (!NT_SUCCESS(ApiMessage
.Status
))
1457 BaseSetLastNTError(ApiMessage
.Status
);
1465 /*--------------------------------------------------------------
1466 * SetConsoleScreenBufferSize
1472 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
1475 CONSOLE_API_MESSAGE ApiMessage
;
1476 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &ApiMessage
.Data
.SetScreenBufferSizeRequest
;
1478 SetScreenBufferSizeRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1479 SetScreenBufferSizeRequest
->OutputHandle
= hConsoleOutput
;
1480 SetScreenBufferSizeRequest
->Size
= dwSize
;
1482 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1484 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetScreenBufferSize
),
1485 sizeof(*SetScreenBufferSizeRequest
));
1486 if (!NT_SUCCESS(ApiMessage
.Status
))
1488 BaseSetLastNTError(ApiMessage
.Status
);
1498 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
1499 const SMALL_RECT
*lpScrollRectangle
,
1500 const SMALL_RECT
*lpClipRectangle
,
1501 COORD dwDestinationOrigin
,
1502 const CHAR_INFO
*lpFill
,
1506 CONSOLE_API_MESSAGE ApiMessage
;
1507 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &ApiMessage
.Data
.ScrollScreenBufferRequest
;
1509 ScrollScreenBufferRequest
->OutputHandle
= hConsoleOutput
;
1510 ScrollScreenBufferRequest
->Unicode
= bUnicode
;
1511 ScrollScreenBufferRequest
->ScrollRectangle
= *lpScrollRectangle
;
1513 if (lpClipRectangle
!= NULL
)
1515 ScrollScreenBufferRequest
->UseClipRectangle
= TRUE
;
1516 ScrollScreenBufferRequest
->ClipRectangle
= *lpClipRectangle
;
1520 ScrollScreenBufferRequest
->UseClipRectangle
= FALSE
;
1523 ScrollScreenBufferRequest
->DestinationOrigin
= dwDestinationOrigin
;
1524 ScrollScreenBufferRequest
->Fill
= *lpFill
;
1526 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1528 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepScrollScreenBuffer
),
1529 sizeof(CONSOLE_SCROLLSCREENBUFFER
));
1531 if (!NT_SUCCESS(Status
))
1533 BaseSetLastNTError(Status
);
1541 /*--------------------------------------------------------------
1542 * ScrollConsoleScreenBufferA
1548 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
1549 CONST SMALL_RECT
*lpScrollRectangle
,
1550 CONST SMALL_RECT
*lpClipRectangle
,
1551 COORD dwDestinationOrigin
,
1552 CONST CHAR_INFO
*lpFill
)
1554 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1555 (PSMALL_RECT
)lpScrollRectangle
,
1556 (PSMALL_RECT
)lpClipRectangle
,
1557 dwDestinationOrigin
,
1563 /*--------------------------------------------------------------
1564 * ScrollConsoleScreenBufferW
1570 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
1571 CONST SMALL_RECT
*lpScrollRectangle
,
1572 CONST SMALL_RECT
*lpClipRectangle
,
1573 COORD dwDestinationOrigin
,
1574 CONST CHAR_INFO
*lpFill
)
1576 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1579 dwDestinationOrigin
,
1585 /*--------------------------------------------------------------
1586 * SetConsoleWindowInfo
1592 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
1594 CONST SMALL_RECT
*lpConsoleWindow
)
1596 CONSOLE_API_MESSAGE ApiMessage
;
1597 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &ApiMessage
.Data
.SetWindowInfoRequest
;
1599 if (lpConsoleWindow
== NULL
)
1601 SetLastError(ERROR_INVALID_PARAMETER
);
1605 SetWindowInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1606 SetWindowInfoRequest
->OutputHandle
= hConsoleOutput
;
1607 SetWindowInfoRequest
->Absolute
= bAbsolute
;
1608 SetWindowInfoRequest
->WindowRect
= *lpConsoleWindow
;
1610 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1612 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetWindowInfo
),
1613 sizeof(*SetWindowInfoRequest
));
1614 if (!NT_SUCCESS(ApiMessage
.Status
))
1616 BaseSetLastNTError(ApiMessage
.Status
);
1624 /*--------------------------------------------------------------
1625 * SetConsoleTextAttribute
1631 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
1634 CONSOLE_API_MESSAGE ApiMessage
;
1635 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &ApiMessage
.Data
.SetTextAttribRequest
;
1637 SetTextAttribRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1638 SetTextAttribRequest
->OutputHandle
= hConsoleOutput
;
1639 SetTextAttribRequest
->Attributes
= wAttributes
;
1641 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1643 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTextAttribute
),
1644 sizeof(*SetTextAttribRequest
));
1645 if (!NT_SUCCESS(ApiMessage
.Status
))
1647 BaseSetLastNTError(ApiMessage
.Status
);
1657 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1659 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
1661 if (HandlerRoutine
== NULL
)
1663 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
1667 if (NrCtrlHandlers
== NrAllocatedHandlers
)
1669 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
1671 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
1672 if (NewCtrlHandlers
== NULL
)
1674 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1678 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
1680 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
1682 CtrlHandlers
= NewCtrlHandlers
;
1683 NrAllocatedHandlers
+= 4;
1686 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
1688 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
1695 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1699 if (HandlerRoutine
== NULL
)
1701 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
1705 for (i
= 0; i
< NrCtrlHandlers
; i
++)
1707 if (CtrlHandlers
[i
] == HandlerRoutine
)
1709 if (i
< (NrCtrlHandlers
- 1))
1711 memmove(&CtrlHandlers
[i
],
1713 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
1721 SetLastError(ERROR_INVALID_PARAMETER
);
1731 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
1736 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
1739 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
1743 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
1746 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
1751 /*--------------------------------------------------------------
1752 * GenerateConsoleCtrlEvent
1758 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
1759 DWORD dwProcessGroupId
)
1761 CONSOLE_API_MESSAGE ApiMessage
;
1762 PCONSOLE_GENERATECTRLEVENT GenerateCtrlEventRequest
= &ApiMessage
.Data
.GenerateCtrlEventRequest
;
1764 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
1766 SetLastError(ERROR_INVALID_PARAMETER
);
1770 GenerateCtrlEventRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1771 GenerateCtrlEventRequest
->CtrlEvent
= dwCtrlEvent
;
1772 GenerateCtrlEventRequest
->ProcessGroupId
= dwProcessGroupId
;
1774 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1776 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGenerateCtrlEvent
),
1777 sizeof(*GenerateCtrlEventRequest
));
1778 if (!NT_SUCCESS(ApiMessage
.Status
))
1780 BaseSetLastNTError(ApiMessage
.Status
);
1789 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD dwNumChars
, BOOLEAN bUnicode
)
1791 CONSOLE_API_MESSAGE ApiMessage
;
1792 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1793 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1795 if (dwNumChars
== 0) return 0;
1797 TitleRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1798 TitleRequest
->Length
= dwNumChars
* (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1799 TitleRequest
->Unicode
= bUnicode
;
1801 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1802 if (CaptureBuffer
== NULL
)
1804 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1805 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1809 CsrAllocateMessagePointer(CaptureBuffer
,
1810 TitleRequest
->Length
,
1811 (PVOID
*)&TitleRequest
->Title
);
1813 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1815 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetTitle
),
1816 sizeof(*TitleRequest
));
1817 if (!NT_SUCCESS(ApiMessage
.Status
))
1819 CsrFreeCaptureBuffer(CaptureBuffer
);
1820 BaseSetLastNTError(ApiMessage
.Status
);
1824 dwNumChars
= TitleRequest
->Length
/ (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1828 memcpy(lpConsoleTitle
, TitleRequest
->Title
, TitleRequest
->Length
);
1831 ((LPWSTR
)lpConsoleTitle
)[dwNumChars
] = L
'\0';
1833 ((LPSTR
)lpConsoleTitle
)[dwNumChars
] = '\0';
1836 CsrFreeCaptureBuffer(CaptureBuffer
);
1842 /*--------------------------------------------------------------
1849 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
1852 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
1856 /*--------------------------------------------------------------
1863 GetConsoleTitleA(LPSTR lpConsoleTitle
,
1866 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
1871 IntSetConsoleTitle(CONST VOID
*lpConsoleTitle
, DWORD dwNumChars
, BOOLEAN bUnicode
)
1873 CONSOLE_API_MESSAGE ApiMessage
;
1874 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1875 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1877 TitleRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1878 TitleRequest
->Length
= dwNumChars
* (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1879 TitleRequest
->Unicode
= bUnicode
;
1881 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1882 if (CaptureBuffer
== NULL
)
1884 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1885 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1889 CsrCaptureMessageBuffer(CaptureBuffer
,
1890 (PVOID
)lpConsoleTitle
,
1891 TitleRequest
->Length
,
1892 (PVOID
*)&TitleRequest
->Title
);
1894 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1896 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTitle
),
1897 sizeof(*TitleRequest
));
1899 CsrFreeCaptureBuffer(CaptureBuffer
);
1901 if (!NT_SUCCESS(ApiMessage
.Status
))
1903 BaseSetLastNTError(ApiMessage
.Status
);
1910 /*--------------------------------------------------------------
1917 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
1919 return IntSetConsoleTitle(lpConsoleTitle
, wcslen(lpConsoleTitle
), TRUE
);
1923 /*--------------------------------------------------------------
1930 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
1932 return IntSetConsoleTitle(lpConsoleTitle
, strlen(lpConsoleTitle
), FALSE
);
1936 /*--------------------------------------------------------------
1937 * CreateConsoleScreenBuffer
1943 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
1945 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1947 LPVOID lpScreenBufferData
)
1949 CONSOLE_API_MESSAGE ApiMessage
;
1950 PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest
= &ApiMessage
.Data
.CreateScreenBufferRequest
;
1951 PCSR_CAPTURE_BUFFER CaptureBuffer
= NULL
;
1952 PCONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo
= lpScreenBufferData
;
1954 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
1955 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) ||
1956 (dwFlags
!= CONSOLE_TEXTMODE_BUFFER
&& dwFlags
!= CONSOLE_GRAPHICS_BUFFER
) )
1958 SetLastError(ERROR_INVALID_PARAMETER
);
1959 return INVALID_HANDLE_VALUE
;
1962 CreateScreenBufferRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1963 CreateScreenBufferRequest
->DesiredAccess
= dwDesiredAccess
;
1964 CreateScreenBufferRequest
->InheritHandle
=
1965 (lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
);
1966 CreateScreenBufferRequest
->ShareMode
= dwShareMode
;
1967 CreateScreenBufferRequest
->ScreenBufferType
= dwFlags
;
1969 if (dwFlags
== CONSOLE_GRAPHICS_BUFFER
)
1971 if (CreateScreenBufferRequest
->InheritHandle
|| GraphicsBufferInfo
== NULL
)
1973 SetLastError(ERROR_INVALID_PARAMETER
);
1974 return INVALID_HANDLE_VALUE
;
1977 CreateScreenBufferRequest
->GraphicsBufferInfo
= *GraphicsBufferInfo
;
1979 CaptureBuffer
= CsrAllocateCaptureBuffer(1, GraphicsBufferInfo
->dwBitMapInfoLength
);
1980 if (CaptureBuffer
== NULL
)
1982 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1983 return INVALID_HANDLE_VALUE
;
1986 CsrCaptureMessageBuffer(CaptureBuffer
,
1987 (PVOID
)GraphicsBufferInfo
->lpBitMapInfo
,
1988 GraphicsBufferInfo
->dwBitMapInfoLength
,
1989 (PVOID
*)&CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMapInfo
);
1992 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1994 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCreateScreenBuffer
),
1995 sizeof(*CreateScreenBufferRequest
));
1997 if (CaptureBuffer
) CsrFreeCaptureBuffer(CaptureBuffer
);
1999 if (!NT_SUCCESS(ApiMessage
.Status
))
2001 BaseSetLastNTError(ApiMessage
.Status
);
2002 return INVALID_HANDLE_VALUE
;
2005 if (dwFlags
== CONSOLE_GRAPHICS_BUFFER
&& GraphicsBufferInfo
)
2007 GraphicsBufferInfo
->hMutex
= CreateScreenBufferRequest
->hMutex
; // CreateScreenBufferRequest->GraphicsBufferInfo.hMutex ;
2008 GraphicsBufferInfo
->lpBitMap
= CreateScreenBufferRequest
->lpBitMap
; // CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap;
2011 return CreateScreenBufferRequest
->OutputHandle
;
2015 /*--------------------------------------------------------------
2024 CONSOLE_API_MESSAGE ApiMessage
;
2025 PCONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest
= &ApiMessage
.Data
.GetConsoleCPRequest
;
2027 /* Get the Input Code Page */
2028 GetConsoleCPRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2029 GetConsoleCPRequest
->OutputCP
= FALSE
;
2031 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2033 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
2034 sizeof(*GetConsoleCPRequest
));
2035 if (!NT_SUCCESS(ApiMessage
.Status
))
2037 BaseSetLastNTError(ApiMessage
.Status
);
2041 return GetConsoleCPRequest
->CodePage
;
2045 /*--------------------------------------------------------------
2052 SetConsoleCP(UINT wCodePageID
)
2054 CONSOLE_API_MESSAGE ApiMessage
;
2055 PCONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest
= &ApiMessage
.Data
.SetConsoleCPRequest
;
2057 /* Set the Input Code Page */
2058 SetConsoleCPRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2059 SetConsoleCPRequest
->CodePage
= wCodePageID
;
2060 SetConsoleCPRequest
->OutputCP
= FALSE
;
2061 /* SetConsoleCPRequest->EventHandle; */
2063 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2065 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
2066 sizeof(*SetConsoleCPRequest
));
2067 if (!NT_SUCCESS(ApiMessage
.Status
))
2069 BaseSetLastNTError(ApiMessage
.Status
);
2077 /*--------------------------------------------------------------
2078 * GetConsoleOutputCP
2084 GetConsoleOutputCP(VOID
)
2086 CONSOLE_API_MESSAGE ApiMessage
;
2087 PCONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest
= &ApiMessage
.Data
.GetConsoleCPRequest
;
2089 /* Get the Output Code Page */
2090 GetConsoleCPRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2091 GetConsoleCPRequest
->OutputCP
= TRUE
;
2093 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2095 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
2096 sizeof(*GetConsoleCPRequest
));
2097 if (!NT_SUCCESS(ApiMessage
.Status
))
2099 BaseSetLastNTError(ApiMessage
.Status
);
2103 return GetConsoleCPRequest
->CodePage
;
2107 /*--------------------------------------------------------------
2108 * SetConsoleOutputCP
2114 SetConsoleOutputCP(UINT wCodePageID
)
2116 CONSOLE_API_MESSAGE ApiMessage
;
2117 PCONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest
= &ApiMessage
.Data
.SetConsoleCPRequest
;
2119 /* Set the Output Code Page */
2120 SetConsoleCPRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2121 SetConsoleCPRequest
->CodePage
= wCodePageID
;
2122 SetConsoleCPRequest
->OutputCP
= TRUE
;
2123 /* SetConsoleCPRequest->EventHandle; */
2125 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2127 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
2128 sizeof(*SetConsoleCPRequest
));
2129 if (!NT_SUCCESS(ApiMessage
.Status
))
2131 BaseSetLastNTError(ApiMessage
.Status
);
2139 /*--------------------------------------------------------------
2140 * GetConsoleProcessList
2146 GetConsoleProcessList(LPDWORD lpdwProcessList
,
2147 DWORD dwProcessCount
)
2149 CONSOLE_API_MESSAGE ApiMessage
;
2150 PCONSOLE_GETPROCESSLIST GetProcessListRequest
= &ApiMessage
.Data
.GetProcessListRequest
;
2151 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2152 ULONG nProcesses
= 0;
2154 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
2156 SetLastError(ERROR_INVALID_PARAMETER
);
2160 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
2161 if (CaptureBuffer
== NULL
)
2163 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
2164 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2168 GetProcessListRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2169 GetProcessListRequest
->ProcessCount
= dwProcessCount
;
2171 CsrAllocateMessagePointer(CaptureBuffer
,
2172 dwProcessCount
* sizeof(DWORD
),
2173 (PVOID
*)&GetProcessListRequest
->ProcessIdsList
);
2175 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2177 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetProcessList
),
2178 sizeof(*GetProcessListRequest
));
2179 if (!NT_SUCCESS(ApiMessage
.Status
))
2181 BaseSetLastNTError(ApiMessage
.Status
);
2185 nProcesses
= GetProcessListRequest
->ProcessCount
;
2186 if (dwProcessCount
>= nProcesses
)
2188 memcpy(lpdwProcessList
, GetProcessListRequest
->ProcessIdsList
, nProcesses
* sizeof(DWORD
));
2192 CsrFreeCaptureBuffer(CaptureBuffer
);
2197 /*--------------------------------------------------------------
2198 * GetConsoleSelectionInfo
2204 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
2206 CONSOLE_API_MESSAGE ApiMessage
;
2207 PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest
= &ApiMessage
.Data
.GetSelectionInfoRequest
;
2209 if (lpConsoleSelectionInfo
== NULL
)
2211 SetLastError(ERROR_INVALID_PARAMETER
);
2215 GetSelectionInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2217 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2219 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetSelectionInfo
),
2220 sizeof(*GetSelectionInfoRequest
));
2221 if (!NT_SUCCESS(ApiMessage
.Status
))
2223 BaseSetLastNTError(ApiMessage
.Status
);
2227 *lpConsoleSelectionInfo
= GetSelectionInfoRequest
->Info
;
2233 /*--------------------------------------------------------------
2238 * @note Strongly inspired by AllocConsole.
2242 AttachConsole(DWORD dwProcessId
)
2245 PRTL_USER_PROCESS_PARAMETERS Parameters
= NtCurrentPeb()->ProcessParameters
;
2246 CONSOLE_API_MESSAGE ApiMessage
;
2247 PCONSOLE_ATTACHCONSOLE AttachConsoleRequest
= &ApiMessage
.Data
.AttachConsoleRequest
;
2249 if (Parameters
->ConsoleHandle
)
2251 DPRINT1("AttachConsole: Attaching a console to a process already having one\n");
2252 SetLastError(ERROR_ACCESS_DENIED
);
2256 AttachConsoleRequest
->ProcessId
= dwProcessId
;
2257 AttachConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
2258 AttachConsoleRequest
->PropDispatcher
= PropDialogHandler
;
2260 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2262 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAttach
),
2263 sizeof(CONSOLE_ATTACHCONSOLE
));
2264 if (!NT_SUCCESS(Status
))
2266 BaseSetLastNTError(Status
);
2270 Parameters
->ConsoleHandle
= AttachConsoleRequest
->ConsoleHandle
;
2271 SetStdHandle(STD_INPUT_HANDLE
, AttachConsoleRequest
->InputHandle
);
2272 SetStdHandle(STD_OUTPUT_HANDLE
, AttachConsoleRequest
->OutputHandle
);
2273 SetStdHandle(STD_ERROR_HANDLE
, AttachConsoleRequest
->ErrorHandle
);
2275 /* Initialize Console Ctrl Handler */
2276 InitConsoleCtrlHandling();
2278 InputWaitHandle
= AttachConsoleRequest
->InputWaitHandle
;
2284 /*--------------------------------------------------------------
2291 GetConsoleWindow(VOID
)
2293 CONSOLE_API_MESSAGE ApiMessage
;
2294 PCONSOLE_GETWINDOW GetWindowRequest
= &ApiMessage
.Data
.GetWindowRequest
;
2296 GetWindowRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2298 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2300 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetConsoleWindow
),
2301 sizeof(*GetWindowRequest
));
2302 if (!NT_SUCCESS(ApiMessage
.Status
))
2304 BaseSetLastNTError(ApiMessage
.Status
);
2308 return GetWindowRequest
->WindowHandle
;
2312 /*--------------------------------------------------------------
2319 SetConsoleIcon(HICON hIcon
)
2321 CONSOLE_API_MESSAGE ApiMessage
;
2322 PCONSOLE_SETICON SetIconRequest
= &ApiMessage
.Data
.SetIconRequest
;
2324 SetIconRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2325 SetIconRequest
->IconHandle
= hIcon
;
2327 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2329 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetIcon
),
2330 sizeof(*SetIconRequest
));
2331 if (!NT_SUCCESS(ApiMessage
.Status
))
2333 BaseSetLastNTError(ApiMessage
.Status
);
2341 /******************************************************************************
2342 * \name SetConsoleInputExeNameW
2343 * \brief Sets the console input file name from a unicode string.
2344 * \param lpInputExeName Pointer to a unicode string with the name.
2345 * \return TRUE if successful, FALSE if unsuccsedful.
2346 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2347 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2351 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
2355 if ( !lpInputExeName
||
2356 (lenName
= lstrlenW(lpInputExeName
)) == 0 ||
2357 lenName
> INPUTEXENAME_BUFLEN
- 1 )
2359 /* Fail if string is empty or too long */
2360 SetLastError(ERROR_INVALID_PARAMETER
);
2364 RtlEnterCriticalSection(&ConsoleLock
);
2367 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
2368 InputExeName
[lenName
] = L
'\0';
2372 RtlLeaveCriticalSection(&ConsoleLock
);
2380 /******************************************************************************
2381 * \name SetConsoleInputExeNameA
2382 * \brief Sets the console input file name from an ansi string.
2383 * \param lpInputExeName Pointer to an ansi string with the name.
2384 * \return TRUE if successful, FALSE if unsuccsedful.
2385 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2386 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2390 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
2392 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2393 ANSI_STRING InputExeNameA
;
2394 UNICODE_STRING InputExeNameU
;
2397 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
2399 if ( InputExeNameA
.Length
== 0 ||
2400 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1 )
2402 /* Fail if string is empty or too long */
2403 SetLastError(ERROR_INVALID_PARAMETER
);
2407 InputExeNameU
.Buffer
= Buffer
;
2408 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
2409 InputExeNameU
.Length
= 0;
2411 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
2412 if (!NT_SUCCESS(Status
))
2414 BaseSetLastNTError(Status
);
2418 return SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
2422 /******************************************************************************
2423 * \name GetConsoleInputExeNameW
2424 * \brief Retrieves the console input file name as unicode string.
2425 * \param nBufferLength Length of the buffer in WCHARs.
2426 * Specify 0 to receive the needed buffer length.
2427 * \param lpBuffer Pointer to a buffer that receives the string.
2428 * \return Needed buffer size if \p nBufferLength is 0.
2429 * Otherwise 1 if successful, 2 if buffer is too small.
2430 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2431 * is not big enough.
2435 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
2437 ULONG lenName
= lstrlenW(InputExeName
);
2439 if (nBufferLength
== 0)
2441 /* Buffer size is requested, return it */
2445 if (lenName
+ 1 > nBufferLength
)
2447 /* Buffer is not large enough! */
2448 SetLastError(ERROR_BUFFER_OVERFLOW
);
2452 RtlEnterCriticalSection(&ConsoleLock
);
2455 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
2456 lpBuffer
[lenName
] = '\0';
2460 RtlLeaveCriticalSection(&ConsoleLock
);
2464 /* Success, return 1 */
2469 /******************************************************************************
2470 * \name GetConsoleInputExeNameA
2471 * \brief Retrieves the console input file name as ansi string.
2472 * \param nBufferLength Length of the buffer in CHARs.
2473 * \param lpBuffer Pointer to a buffer that receives the string.
2474 * \return 1 if successful, 2 if buffer is too small.
2475 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2476 * is not big enough. The buffer receives as much characters as fit.
2480 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
2482 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2484 UNICODE_STRING BufferU
;
2485 ANSI_STRING BufferA
;
2487 /* Get the unicode name */
2488 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
2490 /* Initialize strings for conversion */
2491 RtlInitUnicodeString(&BufferU
, Buffer
);
2493 BufferA
.MaximumLength
= (USHORT
)nBufferLength
;
2494 BufferA
.Buffer
= lpBuffer
;
2496 /* Convert unicode name to ansi, copying as much chars as fit */
2497 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
2499 /* Error handling */
2500 if (nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
2502 SetLastError(ERROR_BUFFER_OVERFLOW
);
2511 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
2519 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
2527 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
2535 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
2543 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
2551 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
2559 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
2567 RegisterConsoleOS2(BOOL bUnknown
)
2575 SetConsoleOS2OemFormat(BOOL bUnknown
)
2583 UnregisterConsoleIME(VOID
)
2593 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
2602 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
2613 SetLastConsoleEventActive(VOID
)
2615 CONSOLE_API_MESSAGE ApiMessage
;
2616 PCONSOLE_NOTIFYLASTCLOSE NotifyLastCloseRequest
= &ApiMessage
.Data
.NotifyLastCloseRequest
;
2618 /* Set the flag used by the console control dispatcher */
2619 LastCloseNotify
= TRUE
;
2621 /* Set up the input arguments */
2622 NotifyLastCloseRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2624 /* Call CSRSS; just return the NTSTATUS cast to DWORD */
2625 return CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2627 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepNotifyLastClose
),
2628 sizeof(*NotifyLastCloseRequest
));