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 CONSOLE_API_MESSAGE ApiMessage
;
1402 PCONSOLE_GETMOUSEINFO GetMouseInfoRequest
= &ApiMessage
.Data
.GetMouseInfoRequest
;
1404 GetMouseInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1406 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1408 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetMouseInfo
),
1409 sizeof(*GetMouseInfoRequest
));
1410 if (!NT_SUCCESS(ApiMessage
.Status
))
1412 BaseSetLastNTError(ApiMessage
.Status
);
1416 *lpNumberOfMouseButtons
= GetMouseInfoRequest
->NumButtons
;
1421 /*--------------------------------------------------------------
1422 * SetConsoleActiveScreenBuffer
1428 SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput
)
1430 CONSOLE_API_MESSAGE ApiMessage
;
1431 PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest
= &ApiMessage
.Data
.SetScreenBufferRequest
;
1433 SetScreenBufferRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1434 SetScreenBufferRequest
->OutputHandle
= hConsoleOutput
;
1436 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1438 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetActiveScreenBuffer
),
1439 sizeof(*SetScreenBufferRequest
));
1440 if (!NT_SUCCESS(ApiMessage
.Status
))
1442 BaseSetLastNTError(ApiMessage
.Status
);
1450 /*--------------------------------------------------------------
1451 * FlushConsoleInputBuffer
1457 FlushConsoleInputBuffer(HANDLE hConsoleInput
)
1459 CONSOLE_API_MESSAGE ApiMessage
;
1460 PCONSOLE_FLUSHINPUTBUFFER FlushInputBufferRequest
= &ApiMessage
.Data
.FlushInputBufferRequest
;
1462 FlushInputBufferRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1463 FlushInputBufferRequest
->InputHandle
= hConsoleInput
;
1465 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1467 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepFlushInputBuffer
),
1468 sizeof(*FlushInputBufferRequest
));
1469 if (!NT_SUCCESS(ApiMessage
.Status
))
1471 BaseSetLastNTError(ApiMessage
.Status
);
1479 /*--------------------------------------------------------------
1480 * SetConsoleScreenBufferSize
1486 SetConsoleScreenBufferSize(HANDLE hConsoleOutput
,
1489 CONSOLE_API_MESSAGE ApiMessage
;
1490 PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest
= &ApiMessage
.Data
.SetScreenBufferSizeRequest
;
1492 SetScreenBufferSizeRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1493 SetScreenBufferSizeRequest
->OutputHandle
= hConsoleOutput
;
1494 SetScreenBufferSizeRequest
->Size
= dwSize
;
1496 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1498 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetScreenBufferSize
),
1499 sizeof(*SetScreenBufferSizeRequest
));
1500 if (!NT_SUCCESS(ApiMessage
.Status
))
1502 BaseSetLastNTError(ApiMessage
.Status
);
1512 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput
,
1513 CONST SMALL_RECT
* lpScrollRectangle
,
1514 CONST SMALL_RECT
* lpClipRectangle
,
1515 COORD dwDestinationOrigin
,
1516 CONST CHAR_INFO
* lpFill
,
1519 CONSOLE_API_MESSAGE ApiMessage
;
1520 PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest
= &ApiMessage
.Data
.ScrollScreenBufferRequest
;
1522 ScrollScreenBufferRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1523 ScrollScreenBufferRequest
->OutputHandle
= hConsoleOutput
;
1524 ScrollScreenBufferRequest
->ScrollRectangle
= *lpScrollRectangle
;
1526 if (lpClipRectangle
!= NULL
)
1528 ScrollScreenBufferRequest
->UseClipRectangle
= TRUE
;
1529 ScrollScreenBufferRequest
->ClipRectangle
= *lpClipRectangle
;
1533 ScrollScreenBufferRequest
->UseClipRectangle
= FALSE
;
1536 ScrollScreenBufferRequest
->DestinationOrigin
= dwDestinationOrigin
;
1537 ScrollScreenBufferRequest
->Fill
= *lpFill
;
1538 ScrollScreenBufferRequest
->Unicode
= bUnicode
;
1540 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1542 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepScrollScreenBuffer
),
1543 sizeof(*ScrollScreenBufferRequest
));
1544 if (!NT_SUCCESS(ApiMessage
.Status
))
1546 BaseSetLastNTError(ApiMessage
.Status
);
1554 /*--------------------------------------------------------------
1555 * ScrollConsoleScreenBufferA
1561 ScrollConsoleScreenBufferA(HANDLE hConsoleOutput
,
1562 CONST SMALL_RECT
* lpScrollRectangle
,
1563 CONST SMALL_RECT
* lpClipRectangle
,
1564 COORD dwDestinationOrigin
,
1565 CONST CHAR_INFO
* lpFill
)
1567 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1570 dwDestinationOrigin
,
1576 /*--------------------------------------------------------------
1577 * ScrollConsoleScreenBufferW
1583 ScrollConsoleScreenBufferW(HANDLE hConsoleOutput
,
1584 CONST SMALL_RECT
*lpScrollRectangle
,
1585 CONST SMALL_RECT
*lpClipRectangle
,
1586 COORD dwDestinationOrigin
,
1587 CONST CHAR_INFO
*lpFill
)
1589 return IntScrollConsoleScreenBuffer(hConsoleOutput
,
1592 dwDestinationOrigin
,
1598 /*--------------------------------------------------------------
1599 * SetConsoleWindowInfo
1605 SetConsoleWindowInfo(HANDLE hConsoleOutput
,
1607 CONST SMALL_RECT
*lpConsoleWindow
)
1609 CONSOLE_API_MESSAGE ApiMessage
;
1610 PCONSOLE_SETWINDOWINFO SetWindowInfoRequest
= &ApiMessage
.Data
.SetWindowInfoRequest
;
1612 if (lpConsoleWindow
== NULL
)
1614 SetLastError(ERROR_INVALID_PARAMETER
);
1618 SetWindowInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1619 SetWindowInfoRequest
->OutputHandle
= hConsoleOutput
;
1620 SetWindowInfoRequest
->Absolute
= bAbsolute
;
1621 SetWindowInfoRequest
->WindowRect
= *lpConsoleWindow
;
1623 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1625 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetWindowInfo
),
1626 sizeof(*SetWindowInfoRequest
));
1627 if (!NT_SUCCESS(ApiMessage
.Status
))
1629 BaseSetLastNTError(ApiMessage
.Status
);
1637 /*--------------------------------------------------------------
1638 * SetConsoleTextAttribute
1644 SetConsoleTextAttribute(HANDLE hConsoleOutput
,
1647 CONSOLE_API_MESSAGE ApiMessage
;
1648 PCONSOLE_SETTEXTATTRIB SetTextAttribRequest
= &ApiMessage
.Data
.SetTextAttribRequest
;
1650 SetTextAttribRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1651 SetTextAttribRequest
->OutputHandle
= hConsoleOutput
;
1652 SetTextAttribRequest
->Attributes
= wAttributes
;
1654 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1656 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTextAttribute
),
1657 sizeof(*SetTextAttribRequest
));
1658 if (!NT_SUCCESS(ApiMessage
.Status
))
1660 BaseSetLastNTError(ApiMessage
.Status
);
1670 AddConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1672 PHANDLER_ROUTINE
* NewCtrlHandlers
= NULL
;
1674 if (HandlerRoutine
== NULL
)
1676 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= TRUE
;
1680 if (NrCtrlHandlers
== NrAllocatedHandlers
)
1682 NewCtrlHandlers
= RtlAllocateHeap(RtlGetProcessHeap(),
1684 (NrCtrlHandlers
+ 4) * sizeof(PHANDLER_ROUTINE
));
1685 if (NewCtrlHandlers
== NULL
)
1687 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1691 memmove(NewCtrlHandlers
, CtrlHandlers
, sizeof(PHANDLER_ROUTINE
) * NrCtrlHandlers
);
1693 if (NrAllocatedHandlers
> 1) RtlFreeHeap(RtlGetProcessHeap(), 0, CtrlHandlers
);
1695 CtrlHandlers
= NewCtrlHandlers
;
1696 NrAllocatedHandlers
+= 4;
1699 ASSERT(NrCtrlHandlers
< NrAllocatedHandlers
);
1701 CtrlHandlers
[NrCtrlHandlers
++] = HandlerRoutine
;
1708 RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
)
1712 if (HandlerRoutine
== NULL
)
1714 NtCurrentPeb()->ProcessParameters
->ConsoleFlags
= FALSE
;
1718 for (i
= 0; i
< NrCtrlHandlers
; i
++)
1720 if (CtrlHandlers
[i
] == HandlerRoutine
)
1722 if (i
< (NrCtrlHandlers
- 1))
1724 memmove(&CtrlHandlers
[i
],
1726 (NrCtrlHandlers
- i
+ 1) * sizeof(PHANDLER_ROUTINE
));
1734 SetLastError(ERROR_INVALID_PARAMETER
);
1744 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine
,
1749 RtlEnterCriticalSection(&BaseDllDirectoryLock
);
1752 Ret
= AddConsoleCtrlHandler(HandlerRoutine
);
1756 Ret
= RemoveConsoleCtrlHandler(HandlerRoutine
);
1759 RtlLeaveCriticalSection(&BaseDllDirectoryLock
);
1764 /*--------------------------------------------------------------
1765 * GenerateConsoleCtrlEvent
1771 GenerateConsoleCtrlEvent(DWORD dwCtrlEvent
,
1772 DWORD dwProcessGroupId
)
1774 CONSOLE_API_MESSAGE ApiMessage
;
1775 PCONSOLE_GENERATECTRLEVENT GenerateCtrlEventRequest
= &ApiMessage
.Data
.GenerateCtrlEventRequest
;
1777 if (dwCtrlEvent
!= CTRL_C_EVENT
&& dwCtrlEvent
!= CTRL_BREAK_EVENT
)
1779 SetLastError(ERROR_INVALID_PARAMETER
);
1783 GenerateCtrlEventRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1784 GenerateCtrlEventRequest
->CtrlEvent
= dwCtrlEvent
;
1785 GenerateCtrlEventRequest
->ProcessGroupId
= dwProcessGroupId
;
1787 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1789 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGenerateCtrlEvent
),
1790 sizeof(*GenerateCtrlEventRequest
));
1791 if (!NT_SUCCESS(ApiMessage
.Status
))
1793 BaseSetLastNTError(ApiMessage
.Status
);
1802 IntGetConsoleTitle(LPVOID lpConsoleTitle
, DWORD dwNumChars
, BOOLEAN bUnicode
)
1804 CONSOLE_API_MESSAGE ApiMessage
;
1805 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1806 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1808 if (dwNumChars
== 0) return 0;
1810 TitleRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1811 TitleRequest
->Length
= dwNumChars
* (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1812 TitleRequest
->Unicode
= bUnicode
;
1814 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1815 if (CaptureBuffer
== NULL
)
1817 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1818 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1822 CsrAllocateMessagePointer(CaptureBuffer
,
1823 TitleRequest
->Length
,
1824 (PVOID
*)&TitleRequest
->Title
);
1826 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1828 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetTitle
),
1829 sizeof(*TitleRequest
));
1830 if (!NT_SUCCESS(ApiMessage
.Status
))
1832 CsrFreeCaptureBuffer(CaptureBuffer
);
1833 BaseSetLastNTError(ApiMessage
.Status
);
1837 dwNumChars
= TitleRequest
->Length
/ (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1841 memcpy(lpConsoleTitle
, TitleRequest
->Title
, TitleRequest
->Length
);
1844 ((LPWSTR
)lpConsoleTitle
)[dwNumChars
] = L
'\0';
1846 ((LPSTR
)lpConsoleTitle
)[dwNumChars
] = '\0';
1849 CsrFreeCaptureBuffer(CaptureBuffer
);
1855 /*--------------------------------------------------------------
1862 GetConsoleTitleW(LPWSTR lpConsoleTitle
,
1865 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, TRUE
);
1869 /*--------------------------------------------------------------
1876 GetConsoleTitleA(LPSTR lpConsoleTitle
,
1879 return IntGetConsoleTitle(lpConsoleTitle
, nSize
, FALSE
);
1884 IntSetConsoleTitle(CONST VOID
*lpConsoleTitle
, BOOLEAN bUnicode
)
1886 CONSOLE_API_MESSAGE ApiMessage
;
1887 PCONSOLE_GETSETCONSOLETITLE TitleRequest
= &ApiMessage
.Data
.TitleRequest
;
1888 PCSR_CAPTURE_BUFFER CaptureBuffer
;
1890 ULONG NumChars
= (ULONG
)(lpConsoleTitle
? (bUnicode
? wcslen(lpConsoleTitle
) : strlen(lpConsoleTitle
)) : 0);
1892 TitleRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1893 TitleRequest
->Length
= NumChars
* (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
1894 TitleRequest
->Unicode
= bUnicode
;
1896 CaptureBuffer
= CsrAllocateCaptureBuffer(1, TitleRequest
->Length
);
1897 if (CaptureBuffer
== NULL
)
1899 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
1900 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1904 CsrCaptureMessageBuffer(CaptureBuffer
,
1905 (PVOID
)lpConsoleTitle
,
1906 TitleRequest
->Length
,
1907 (PVOID
*)&TitleRequest
->Title
);
1909 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
1911 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetTitle
),
1912 sizeof(*TitleRequest
));
1914 CsrFreeCaptureBuffer(CaptureBuffer
);
1916 if (!NT_SUCCESS(ApiMessage
.Status
))
1918 BaseSetLastNTError(ApiMessage
.Status
);
1925 /*--------------------------------------------------------------
1932 SetConsoleTitleW(LPCWSTR lpConsoleTitle
)
1934 return IntSetConsoleTitle(lpConsoleTitle
, TRUE
);
1938 /*--------------------------------------------------------------
1945 SetConsoleTitleA(LPCSTR lpConsoleTitle
)
1947 return IntSetConsoleTitle(lpConsoleTitle
, FALSE
);
1951 /*--------------------------------------------------------------
1952 * CreateConsoleScreenBuffer
1958 CreateConsoleScreenBuffer(DWORD dwDesiredAccess
,
1960 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1962 LPVOID lpScreenBufferData
)
1964 CONSOLE_API_MESSAGE ApiMessage
;
1965 PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest
= &ApiMessage
.Data
.CreateScreenBufferRequest
;
1966 PCSR_CAPTURE_BUFFER CaptureBuffer
= NULL
;
1967 PCONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo
= lpScreenBufferData
;
1969 if ( (dwDesiredAccess
& ~(GENERIC_READ
| GENERIC_WRITE
)) ||
1970 (dwShareMode
& ~(FILE_SHARE_READ
| FILE_SHARE_WRITE
)) ||
1971 (dwFlags
!= CONSOLE_TEXTMODE_BUFFER
&& dwFlags
!= CONSOLE_GRAPHICS_BUFFER
) )
1973 SetLastError(ERROR_INVALID_PARAMETER
);
1974 return INVALID_HANDLE_VALUE
;
1977 CreateScreenBufferRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
1978 CreateScreenBufferRequest
->DesiredAccess
= dwDesiredAccess
;
1979 CreateScreenBufferRequest
->InheritHandle
=
1980 (lpSecurityAttributes
? lpSecurityAttributes
->bInheritHandle
: FALSE
);
1981 CreateScreenBufferRequest
->ShareMode
= dwShareMode
;
1982 CreateScreenBufferRequest
->ScreenBufferType
= dwFlags
;
1984 if (dwFlags
== CONSOLE_GRAPHICS_BUFFER
)
1986 if (CreateScreenBufferRequest
->InheritHandle
|| GraphicsBufferInfo
== NULL
)
1988 SetLastError(ERROR_INVALID_PARAMETER
);
1989 return INVALID_HANDLE_VALUE
;
1992 CreateScreenBufferRequest
->GraphicsBufferInfo
= *GraphicsBufferInfo
;
1994 CaptureBuffer
= CsrAllocateCaptureBuffer(1, GraphicsBufferInfo
->dwBitMapInfoLength
);
1995 if (CaptureBuffer
== NULL
)
1997 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1998 return INVALID_HANDLE_VALUE
;
2001 CsrCaptureMessageBuffer(CaptureBuffer
,
2002 (PVOID
)GraphicsBufferInfo
->lpBitMapInfo
,
2003 GraphicsBufferInfo
->dwBitMapInfoLength
,
2004 (PVOID
*)&CreateScreenBufferRequest
->GraphicsBufferInfo
.lpBitMapInfo
);
2007 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2009 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepCreateScreenBuffer
),
2010 sizeof(*CreateScreenBufferRequest
));
2012 if (CaptureBuffer
) CsrFreeCaptureBuffer(CaptureBuffer
);
2014 if (!NT_SUCCESS(ApiMessage
.Status
))
2016 BaseSetLastNTError(ApiMessage
.Status
);
2017 return INVALID_HANDLE_VALUE
;
2020 if (dwFlags
== CONSOLE_GRAPHICS_BUFFER
&& GraphicsBufferInfo
)
2022 GraphicsBufferInfo
->hMutex
= CreateScreenBufferRequest
->hMutex
; // CreateScreenBufferRequest->GraphicsBufferInfo.hMutex ;
2023 GraphicsBufferInfo
->lpBitMap
= CreateScreenBufferRequest
->lpBitMap
; // CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap;
2026 return CreateScreenBufferRequest
->OutputHandle
;
2030 /*--------------------------------------------------------------
2039 CONSOLE_API_MESSAGE ApiMessage
;
2040 PCONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest
= &ApiMessage
.Data
.GetConsoleCPRequest
;
2042 /* Get the Input Code Page */
2043 GetConsoleCPRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2044 GetConsoleCPRequest
->OutputCP
= FALSE
;
2046 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2048 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
2049 sizeof(*GetConsoleCPRequest
));
2050 if (!NT_SUCCESS(ApiMessage
.Status
))
2052 BaseSetLastNTError(ApiMessage
.Status
);
2056 return GetConsoleCPRequest
->CodePage
;
2060 /*--------------------------------------------------------------
2067 SetConsoleCP(UINT wCodePageID
)
2069 CONSOLE_API_MESSAGE ApiMessage
;
2070 PCONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest
= &ApiMessage
.Data
.SetConsoleCPRequest
;
2072 /* Set the Input Code Page */
2073 SetConsoleCPRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2074 SetConsoleCPRequest
->CodePage
= wCodePageID
;
2075 SetConsoleCPRequest
->OutputCP
= FALSE
;
2076 /* SetConsoleCPRequest->EventHandle; */
2078 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2080 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
2081 sizeof(*SetConsoleCPRequest
));
2082 if (!NT_SUCCESS(ApiMessage
.Status
))
2084 BaseSetLastNTError(ApiMessage
.Status
);
2092 /*--------------------------------------------------------------
2093 * GetConsoleOutputCP
2099 GetConsoleOutputCP(VOID
)
2101 CONSOLE_API_MESSAGE ApiMessage
;
2102 PCONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest
= &ApiMessage
.Data
.GetConsoleCPRequest
;
2104 /* Get the Output Code Page */
2105 GetConsoleCPRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2106 GetConsoleCPRequest
->OutputCP
= TRUE
;
2108 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2110 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetCP
),
2111 sizeof(*GetConsoleCPRequest
));
2112 if (!NT_SUCCESS(ApiMessage
.Status
))
2114 BaseSetLastNTError(ApiMessage
.Status
);
2118 return GetConsoleCPRequest
->CodePage
;
2122 /*--------------------------------------------------------------
2123 * SetConsoleOutputCP
2129 SetConsoleOutputCP(UINT wCodePageID
)
2131 CONSOLE_API_MESSAGE ApiMessage
;
2132 PCONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest
= &ApiMessage
.Data
.SetConsoleCPRequest
;
2134 /* Set the Output Code Page */
2135 SetConsoleCPRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2136 SetConsoleCPRequest
->CodePage
= wCodePageID
;
2137 SetConsoleCPRequest
->OutputCP
= TRUE
;
2138 /* SetConsoleCPRequest->EventHandle; */
2140 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2142 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetCP
),
2143 sizeof(*SetConsoleCPRequest
));
2144 if (!NT_SUCCESS(ApiMessage
.Status
))
2146 BaseSetLastNTError(ApiMessage
.Status
);
2154 /*--------------------------------------------------------------
2155 * GetConsoleProcessList
2161 GetConsoleProcessList(LPDWORD lpdwProcessList
,
2162 DWORD dwProcessCount
)
2164 CONSOLE_API_MESSAGE ApiMessage
;
2165 PCONSOLE_GETPROCESSLIST GetProcessListRequest
= &ApiMessage
.Data
.GetProcessListRequest
;
2166 PCSR_CAPTURE_BUFFER CaptureBuffer
;
2167 ULONG nProcesses
= 0;
2169 if (lpdwProcessList
== NULL
|| dwProcessCount
== 0)
2171 SetLastError(ERROR_INVALID_PARAMETER
);
2175 CaptureBuffer
= CsrAllocateCaptureBuffer(1, dwProcessCount
* sizeof(DWORD
));
2176 if (CaptureBuffer
== NULL
)
2178 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
2179 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2183 GetProcessListRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2184 GetProcessListRequest
->ProcessCount
= dwProcessCount
;
2186 CsrAllocateMessagePointer(CaptureBuffer
,
2187 dwProcessCount
* sizeof(DWORD
),
2188 (PVOID
*)&GetProcessListRequest
->ProcessIdsList
);
2190 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2192 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetProcessList
),
2193 sizeof(*GetProcessListRequest
));
2194 if (!NT_SUCCESS(ApiMessage
.Status
))
2196 BaseSetLastNTError(ApiMessage
.Status
);
2200 nProcesses
= GetProcessListRequest
->ProcessCount
;
2201 if (dwProcessCount
>= nProcesses
)
2203 memcpy(lpdwProcessList
, GetProcessListRequest
->ProcessIdsList
, nProcesses
* sizeof(DWORD
));
2207 CsrFreeCaptureBuffer(CaptureBuffer
);
2212 /*--------------------------------------------------------------
2213 * GetConsoleSelectionInfo
2219 GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
)
2221 CONSOLE_API_MESSAGE ApiMessage
;
2222 PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest
= &ApiMessage
.Data
.GetSelectionInfoRequest
;
2224 if (lpConsoleSelectionInfo
== NULL
)
2226 SetLastError(ERROR_INVALID_PARAMETER
);
2230 GetSelectionInfoRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2232 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2234 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetSelectionInfo
),
2235 sizeof(*GetSelectionInfoRequest
));
2236 if (!NT_SUCCESS(ApiMessage
.Status
))
2238 BaseSetLastNTError(ApiMessage
.Status
);
2242 *lpConsoleSelectionInfo
= GetSelectionInfoRequest
->Info
;
2248 /*--------------------------------------------------------------
2253 * @note Strongly inspired by AllocConsole.
2257 AttachConsole(DWORD dwProcessId
)
2260 PRTL_USER_PROCESS_PARAMETERS Parameters
= NtCurrentPeb()->ProcessParameters
;
2261 CONSOLE_API_MESSAGE ApiMessage
;
2262 PCONSOLE_ATTACHCONSOLE AttachConsoleRequest
= &ApiMessage
.Data
.AttachConsoleRequest
;
2264 if (Parameters
->ConsoleHandle
)
2266 DPRINT1("AttachConsole: Attaching a console to a process already having one\n");
2267 SetLastError(ERROR_ACCESS_DENIED
);
2271 AttachConsoleRequest
->ProcessId
= dwProcessId
;
2272 AttachConsoleRequest
->CtrlDispatcher
= ConsoleControlDispatcher
;
2273 AttachConsoleRequest
->PropDispatcher
= PropDialogHandler
;
2275 Status
= CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2277 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAttach
),
2278 sizeof(CONSOLE_ATTACHCONSOLE
));
2279 if (!NT_SUCCESS(Status
))
2281 BaseSetLastNTError(Status
);
2285 Parameters
->ConsoleHandle
= AttachConsoleRequest
->ConsoleHandle
;
2286 SetStdHandle(STD_INPUT_HANDLE
, AttachConsoleRequest
->InputHandle
);
2287 SetStdHandle(STD_OUTPUT_HANDLE
, AttachConsoleRequest
->OutputHandle
);
2288 SetStdHandle(STD_ERROR_HANDLE
, AttachConsoleRequest
->ErrorHandle
);
2290 /* Initialize Console Ctrl Handler */
2291 InitConsoleCtrlHandling();
2293 InputWaitHandle
= AttachConsoleRequest
->InputWaitHandle
;
2299 /*--------------------------------------------------------------
2306 GetConsoleWindow(VOID
)
2308 CONSOLE_API_MESSAGE ApiMessage
;
2309 PCONSOLE_GETWINDOW GetWindowRequest
= &ApiMessage
.Data
.GetWindowRequest
;
2311 GetWindowRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2313 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2315 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetConsoleWindow
),
2316 sizeof(*GetWindowRequest
));
2317 if (!NT_SUCCESS(ApiMessage
.Status
))
2319 BaseSetLastNTError(ApiMessage
.Status
);
2323 return GetWindowRequest
->WindowHandle
;
2327 /*--------------------------------------------------------------
2334 SetConsoleIcon(HICON hIcon
)
2336 CONSOLE_API_MESSAGE ApiMessage
;
2337 PCONSOLE_SETICON SetIconRequest
= &ApiMessage
.Data
.SetIconRequest
;
2339 SetIconRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2340 SetIconRequest
->IconHandle
= hIcon
;
2342 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2344 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepSetIcon
),
2345 sizeof(*SetIconRequest
));
2346 if (!NT_SUCCESS(ApiMessage
.Status
))
2348 BaseSetLastNTError(ApiMessage
.Status
);
2356 /******************************************************************************
2357 * \name SetConsoleInputExeNameW
2358 * \brief Sets the console input file name from a unicode string.
2359 * \param lpInputExeName Pointer to a unicode string with the name.
2360 * \return TRUE if successful, FALSE if unsuccsedful.
2361 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2362 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2366 SetConsoleInputExeNameW(LPCWSTR lpInputExeName
)
2370 if ( !lpInputExeName
||
2371 (lenName
= lstrlenW(lpInputExeName
)) == 0 ||
2372 lenName
> INPUTEXENAME_BUFLEN
- 1 )
2374 /* Fail if string is empty or too long */
2375 SetLastError(ERROR_INVALID_PARAMETER
);
2379 RtlEnterCriticalSection(&ConsoleLock
);
2382 RtlCopyMemory(InputExeName
, lpInputExeName
, lenName
* sizeof(WCHAR
));
2383 InputExeName
[lenName
] = L
'\0';
2387 RtlLeaveCriticalSection(&ConsoleLock
);
2395 /******************************************************************************
2396 * \name SetConsoleInputExeNameA
2397 * \brief Sets the console input file name from an ansi string.
2398 * \param lpInputExeName Pointer to an ansi string with the name.
2399 * \return TRUE if successful, FALSE if unsuccsedful.
2400 * \remarks If lpInputExeName is 0 or the string length is 0 or greater than 255,
2401 * the function fails and sets last error to ERROR_INVALID_PARAMETER.
2405 SetConsoleInputExeNameA(LPCSTR lpInputExeName
)
2407 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2408 ANSI_STRING InputExeNameA
;
2409 UNICODE_STRING InputExeNameU
;
2412 RtlInitAnsiString(&InputExeNameA
, lpInputExeName
);
2414 if ( InputExeNameA
.Length
== 0 ||
2415 InputExeNameA
.Length
> INPUTEXENAME_BUFLEN
- 1 )
2417 /* Fail if string is empty or too long */
2418 SetLastError(ERROR_INVALID_PARAMETER
);
2422 InputExeNameU
.Buffer
= Buffer
;
2423 InputExeNameU
.MaximumLength
= sizeof(Buffer
);
2424 InputExeNameU
.Length
= 0;
2426 Status
= RtlAnsiStringToUnicodeString(&InputExeNameU
, &InputExeNameA
, FALSE
);
2427 if (!NT_SUCCESS(Status
))
2429 BaseSetLastNTError(Status
);
2433 return SetConsoleInputExeNameW(InputExeNameU
.Buffer
);
2437 /******************************************************************************
2438 * \name GetConsoleInputExeNameW
2439 * \brief Retrieves the console input file name as unicode string.
2440 * \param nBufferLength Length of the buffer in WCHARs.
2441 * Specify 0 to receive the needed buffer length.
2442 * \param lpBuffer Pointer to a buffer that receives the string.
2443 * \return Needed buffer size if \p nBufferLength is 0.
2444 * Otherwise 1 if successful, 2 if buffer is too small.
2445 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2446 * is not big enough.
2450 GetConsoleInputExeNameW(DWORD nBufferLength
, LPWSTR lpBuffer
)
2452 ULONG lenName
= lstrlenW(InputExeName
);
2454 if (nBufferLength
== 0)
2456 /* Buffer size is requested, return it */
2460 if (lenName
+ 1 > nBufferLength
)
2462 /* Buffer is not large enough! */
2463 SetLastError(ERROR_BUFFER_OVERFLOW
);
2467 RtlEnterCriticalSection(&ConsoleLock
);
2470 RtlCopyMemory(lpBuffer
, InputExeName
, lenName
* sizeof(WCHAR
));
2471 lpBuffer
[lenName
] = '\0';
2475 RtlLeaveCriticalSection(&ConsoleLock
);
2479 /* Success, return 1 */
2484 /******************************************************************************
2485 * \name GetConsoleInputExeNameA
2486 * \brief Retrieves the console input file name as ansi string.
2487 * \param nBufferLength Length of the buffer in CHARs.
2488 * \param lpBuffer Pointer to a buffer that receives the string.
2489 * \return 1 if successful, 2 if buffer is too small.
2490 * \remarks Sets last error value to ERROR_BUFFER_OVERFLOW if the buffer
2491 * is not big enough. The buffer receives as much characters as fit.
2495 GetConsoleInputExeNameA(DWORD nBufferLength
, LPSTR lpBuffer
)
2497 WCHAR Buffer
[INPUTEXENAME_BUFLEN
];
2499 UNICODE_STRING BufferU
;
2500 ANSI_STRING BufferA
;
2502 /* Get the unicode name */
2503 Ret
= GetConsoleInputExeNameW(sizeof(Buffer
) / sizeof(Buffer
[0]), Buffer
);
2505 /* Initialize strings for conversion */
2506 RtlInitUnicodeString(&BufferU
, Buffer
);
2508 BufferA
.MaximumLength
= (USHORT
)nBufferLength
;
2509 BufferA
.Buffer
= lpBuffer
;
2511 /* Convert unicode name to ansi, copying as much chars as fit */
2512 RtlUnicodeStringToAnsiString(&BufferA
, &BufferU
, FALSE
);
2514 /* Error handling */
2515 if (nBufferLength
<= BufferU
.Length
/ sizeof(WCHAR
))
2517 SetLastError(ERROR_BUFFER_OVERFLOW
);
2526 GetConsoleCharType(HANDLE hConsole
, COORD Coord
, PDWORD Type
)
2534 GetConsoleCursorMode(HANDLE hConsole
, PBOOL pUnknown1
, PBOOL pUnknown2
)
2542 SetConsoleCursorMode(HANDLE hConsole
, BOOL Unknown1
, BOOL Unknown2
)
2550 GetConsoleNlsMode(HANDLE hConsole
, LPDWORD lpMode
)
2558 SetConsoleNlsMode(HANDLE hConsole
, DWORD dwMode
)
2566 SetConsoleLocalEUDC(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
2574 RegisterConsoleIME(HWND hWnd
, LPDWORD ThreadId
)
2582 RegisterConsoleOS2(BOOL bUnknown
)
2590 SetConsoleOS2OemFormat(BOOL bUnknown
)
2598 UnregisterConsoleIME(VOID
)
2608 BOOL WINAPI
GetConsoleKeyboardLayoutNameA(LPSTR name
)
2617 BOOL WINAPI
GetConsoleKeyboardLayoutNameW(LPWSTR name
)
2628 SetLastConsoleEventActive(VOID
)
2630 CONSOLE_API_MESSAGE ApiMessage
;
2631 PCONSOLE_NOTIFYLASTCLOSE NotifyLastCloseRequest
= &ApiMessage
.Data
.NotifyLastCloseRequest
;
2633 /* Set the flag used by the console control dispatcher */
2634 LastCloseNotify
= TRUE
;
2636 /* Set up the input arguments */
2637 NotifyLastCloseRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
2639 /* Call CSRSS; just return the NTSTATUS cast to DWORD */
2640 return CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
2642 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepNotifyLastClose
),
2643 sizeof(*NotifyLastCloseRequest
));