2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Win32k subsystem
4 * PURPOSE: Console support functions for CONSRV
5 * FILE: subsystems/win32/win32k/ntuser/console.c
6 * PROGRAMMER: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 DBG_DEFAULT_CHANNEL(UserMisc
);
15 IN CONSOLECONTROL ConsoleCtrl
,
16 IN PVOID ConsoleCtrlInfo
,
17 IN ULONG ConsoleCtrlInfoLength
)
19 NTSTATUS Status
= STATUS_SUCCESS
;
21 /* Allow only the Console Server to perform this operation (via CSRSS) */
22 if (PsGetCurrentProcess() != gpepCSRSS
)
23 return STATUS_ACCESS_DENIED
;
29 case ConsoleCtrlDesktopConsoleThread
:
31 DESKTOP_CONSOLE_THREAD DesktopConsoleThreadInfo
;
32 PDESKTOP Desktop
= NULL
;
33 ULONG_PTR OldThreadId
;
35 if (ConsoleCtrlInfoLength
!= sizeof(DesktopConsoleThreadInfo
))
37 Status
= STATUS_INFO_LENGTH_MISMATCH
;
43 ProbeForWrite(ConsoleCtrlInfo
, ConsoleCtrlInfoLength
, sizeof(USHORT
));
44 DesktopConsoleThreadInfo
= *(PDESKTOP_CONSOLE_THREAD
)ConsoleCtrlInfo
;
46 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
48 Status
= _SEH2_GetExceptionCode();
53 /* Reference the desktop */
54 Status
= ObReferenceObjectByHandle(DesktopConsoleThreadInfo
.DesktopHandle
,
60 if (!NT_SUCCESS(Status
)) break;
62 /* Save the old thread ID, it is always returned to the caller */
63 OldThreadId
= Desktop
->dwConsoleThreadId
;
65 /* Set the new console input thread ID for this desktop if required */
66 if (DesktopConsoleThreadInfo
.ThreadId
!= (ULONG_PTR
)INVALID_HANDLE_VALUE
)
68 Desktop
->dwConsoleThreadId
= DesktopConsoleThreadInfo
.ThreadId
;
71 /* Always return the old thread ID */
72 DesktopConsoleThreadInfo
.ThreadId
= OldThreadId
;
74 /* Dereference the desktop */
75 ObDereferenceObject(Desktop
);
77 /* Return the information back to the caller */
80 *(PDESKTOP_CONSOLE_THREAD
)ConsoleCtrlInfo
= DesktopConsoleThreadInfo
;
82 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
84 Status
= _SEH2_GetExceptionCode();
91 case GuiConsoleWndClassAtom
:
93 if (ConsoleCtrlInfoLength
!= sizeof(ATOM
))
95 Status
= STATUS_INFO_LENGTH_MISMATCH
;
101 ProbeForRead(ConsoleCtrlInfo
, ConsoleCtrlInfoLength
, sizeof(USHORT
));
102 gaGuiConsoleWndClass
= *(ATOM
*)ConsoleCtrlInfo
;
104 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
106 Status
= _SEH2_GetExceptionCode();
113 case ConsoleMakePalettePublic
:
117 if (ConsoleCtrlInfoLength
!= sizeof(hPalette
))
119 Status
= STATUS_INFO_LENGTH_MISMATCH
;
125 ProbeForRead(ConsoleCtrlInfo
, ConsoleCtrlInfoLength
, sizeof(USHORT
));
126 hPalette
= *(HPALETTE
*)ConsoleCtrlInfo
;
128 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
130 Status
= _SEH2_GetExceptionCode();
135 /* Make the palette handle public */
136 GreSetObjectOwnerEx(hPalette
,
138 GDIOBJFLAG_IGNOREPID
);
142 case ConsoleAcquireDisplayOwnership
:
144 ERR("NtUserConsoleControl - ConsoleAcquireDisplayOwnership is UNIMPLEMENTED\n");
145 Status
= STATUS_NOT_IMPLEMENTED
;
150 ERR("Calling invalid control %d in NtUserConsoleControl\n", ConsoleCtrl
);
151 Status
= STATUS_INVALID_INFO_CLASS
;