/reactos/win32ss/user/winsrv/consrv_new/frontendctl.c

https://gitlab.com/dj-tech/reactos · C · 331 lines · 238 code · 63 blank · 30 comment · 20 complexity · d56d064af6967f38866371a6364aab71 MD5 · raw file

  1. /*
  2. * COPYRIGHT: See COPYING in the top level directory
  3. * PROJECT: ReactOS Console Server DLL
  4. * FILE: win32ss/user/winsrv/consrv_new/frontendctl.c
  5. * PURPOSE: Terminal Front-Ends Control
  6. * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
  7. */
  8. /* INCLUDES *******************************************************************/
  9. #include "consrv.h"
  10. #include "include/conio.h"
  11. #include "include/conio2.h"
  12. #include "conoutput.h"
  13. #include "console.h"
  14. #include "handle.h"
  15. #define NDEBUG
  16. #include <debug.h>
  17. /* PRIVATE FUNCTIONS **********************************************************/
  18. /* PUBLIC SERVER APIS *********************************************************/
  19. /**********************************************************************
  20. * HardwareStateProperty
  21. *
  22. * DESCRIPTION
  23. * Set/Get the value of the HardwareState and switch
  24. * between direct video buffer ouput and GDI windowed
  25. * output.
  26. * ARGUMENTS
  27. * Client hands us a CONSOLE_GETSETHWSTATE object.
  28. * We use the same object to Request.
  29. * NOTE
  30. * ConsoleHwState has the correct size to be compatible
  31. * with NT's, but values are not.
  32. */
  33. #if 0
  34. static NTSTATUS FASTCALL
  35. SetConsoleHardwareState(PCONSOLE Console, ULONG ConsoleHwState)
  36. {
  37. DPRINT1("Console Hardware State: %d\n", ConsoleHwState);
  38. if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED == ConsoleHwState)
  39. ||(CONSOLE_HARDWARE_STATE_DIRECT == ConsoleHwState))
  40. {
  41. if (Console->HardwareState != ConsoleHwState)
  42. {
  43. /* TODO: implement switching from full screen to windowed mode */
  44. /* TODO: or back; now simply store the hardware state */
  45. Console->HardwareState = ConsoleHwState;
  46. }
  47. return STATUS_SUCCESS;
  48. }
  49. return STATUS_INVALID_PARAMETER_3; /* Client: (handle, set_get, [mode]) */
  50. }
  51. #endif
  52. CSR_API(SrvGetConsoleHardwareState)
  53. {
  54. #if 0
  55. NTSTATUS Status;
  56. PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest;
  57. PCONSOLE_SCREEN_BUFFER Buff;
  58. PCONSOLE Console;
  59. Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
  60. HardwareStateRequest->OutputHandle,
  61. &Buff,
  62. GENERIC_READ,
  63. TRUE);
  64. if (!NT_SUCCESS(Status))
  65. {
  66. DPRINT1("Failed to get console handle in SrvGetConsoleHardwareState\n");
  67. return Status;
  68. }
  69. Console = Buff->Header.Console;
  70. HardwareStateRequest->State = Console->HardwareState;
  71. ConSrvReleaseScreenBuffer(Buff, TRUE);
  72. return Status;
  73. #else
  74. UNIMPLEMENTED;
  75. return STATUS_NOT_IMPLEMENTED;
  76. #endif
  77. }
  78. CSR_API(SrvSetConsoleHardwareState)
  79. {
  80. #if 0
  81. NTSTATUS Status;
  82. PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest;
  83. PCONSOLE_SCREEN_BUFFER Buff;
  84. PCONSOLE Console;
  85. Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
  86. HardwareStateRequest->OutputHandle,
  87. &Buff,
  88. GENERIC_WRITE,
  89. TRUE);
  90. if (!NT_SUCCESS(Status))
  91. {
  92. DPRINT1("Failed to get console handle in SrvSetConsoleHardwareState\n");
  93. return Status;
  94. }
  95. DPRINT("Setting console hardware state.\n");
  96. Console = Buff->Header.Console;
  97. Status = SetConsoleHardwareState(Console, HardwareStateRequest->State);
  98. ConSrvReleaseScreenBuffer(Buff, TRUE);
  99. return Status;
  100. #else
  101. UNIMPLEMENTED;
  102. return STATUS_NOT_IMPLEMENTED;
  103. #endif
  104. }
  105. CSR_API(SrvGetConsoleDisplayMode)
  106. {
  107. NTSTATUS Status;
  108. PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetDisplayModeRequest;
  109. PCONSOLE Console;
  110. Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
  111. &Console, TRUE);
  112. if (!NT_SUCCESS(Status)) return Status;
  113. GetDisplayModeRequest->DisplayMode = ConioGetDisplayMode(Console);
  114. ConSrvReleaseConsole(Console, TRUE);
  115. return STATUS_SUCCESS;
  116. }
  117. CSR_API(SrvSetConsoleDisplayMode)
  118. {
  119. NTSTATUS Status;
  120. PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetDisplayModeRequest;
  121. PCONSOLE Console;
  122. PCONSOLE_SCREEN_BUFFER Buff;
  123. Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
  124. SetDisplayModeRequest->OutputHandle,
  125. &Buff,
  126. GENERIC_WRITE,
  127. TRUE);
  128. if (!NT_SUCCESS(Status)) return Status;
  129. Console = Buff->Header.Console;
  130. if (ConioSetDisplayMode(Console, SetDisplayModeRequest->DisplayMode))
  131. {
  132. SetDisplayModeRequest->NewSBDim = Buff->ScreenBufferSize;
  133. Status = STATUS_SUCCESS;
  134. }
  135. else
  136. {
  137. Status = STATUS_INVALID_PARAMETER;
  138. }
  139. ConSrvReleaseScreenBuffer(Buff, TRUE);
  140. return Status;
  141. }
  142. CSR_API(SrvGetLargestConsoleWindowSize)
  143. {
  144. NTSTATUS Status;
  145. PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetLargestWindowSizeRequest;
  146. PCONSOLE_SCREEN_BUFFER Buff;
  147. PCONSOLE Console;
  148. Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
  149. GetLargestWindowSizeRequest->OutputHandle,
  150. &Buff,
  151. GENERIC_READ,
  152. TRUE);
  153. if (!NT_SUCCESS(Status)) return Status;
  154. Console = Buff->Header.Console;
  155. ConioGetLargestConsoleWindowSize(Console, &GetLargestWindowSizeRequest->Size);
  156. ConSrvReleaseScreenBuffer(Buff, TRUE);
  157. return STATUS_SUCCESS;
  158. }
  159. CSR_API(SrvShowConsoleCursor)
  160. {
  161. NTSTATUS Status;
  162. PCONSOLE_SHOWCURSOR ShowCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ShowCursorRequest;
  163. PCONSOLE Console;
  164. PCONSOLE_SCREEN_BUFFER Buff;
  165. Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
  166. ShowCursorRequest->OutputHandle,
  167. &Buff,
  168. GENERIC_WRITE,
  169. TRUE);
  170. if (!NT_SUCCESS(Status)) return Status;
  171. Console = Buff->Header.Console;
  172. ShowCursorRequest->RefCount = ConioShowMouseCursor(Console, ShowCursorRequest->Show);
  173. ConSrvReleaseScreenBuffer(Buff, TRUE);
  174. return STATUS_SUCCESS;
  175. }
  176. CSR_API(SrvSetConsoleCursor)
  177. {
  178. NTSTATUS Status;
  179. BOOL Success;
  180. PCONSOLE_SETCURSOR SetCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetCursorRequest;
  181. PCONSOLE Console;
  182. PCONSOLE_SCREEN_BUFFER Buff;
  183. // FIXME: Tests show that this function is used only for graphics screen buffers
  184. // and otherwise it returns false + set last error to invalid handle.
  185. // NOTE: I find that behaviour is ridiculous but ok, let's accept that at the moment...
  186. Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
  187. SetCursorRequest->OutputHandle,
  188. &Buff,
  189. GENERIC_WRITE,
  190. TRUE);
  191. if (!NT_SUCCESS(Status)) return Status;
  192. Console = Buff->Header.Console;
  193. Success = ConioSetMouseCursor(Console, SetCursorRequest->hCursor);
  194. ConSrvReleaseScreenBuffer(Buff, TRUE);
  195. return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
  196. }
  197. CSR_API(SrvConsoleMenuControl)
  198. {
  199. NTSTATUS Status;
  200. PCONSOLE_MENUCONTROL MenuControlRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.MenuControlRequest;
  201. PCONSOLE Console;
  202. PCONSOLE_SCREEN_BUFFER Buff;
  203. Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
  204. MenuControlRequest->OutputHandle,
  205. &Buff,
  206. GENERIC_WRITE,
  207. TRUE);
  208. if (!NT_SUCCESS(Status)) return Status;
  209. Console = Buff->Header.Console;
  210. MenuControlRequest->hMenu = ConioMenuControl(Console,
  211. MenuControlRequest->dwCmdIdLow,
  212. MenuControlRequest->dwCmdIdHigh);
  213. ConSrvReleaseScreenBuffer(Buff, TRUE);
  214. return STATUS_SUCCESS;
  215. }
  216. CSR_API(SrvSetConsoleMenuClose)
  217. {
  218. NTSTATUS Status;
  219. BOOL Success;
  220. PCONSOLE_SETMENUCLOSE SetMenuCloseRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetMenuCloseRequest;
  221. PCONSOLE Console;
  222. Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
  223. &Console, TRUE);
  224. if (!NT_SUCCESS(Status)) return Status;
  225. Success = ConioSetMenuClose(Console, SetMenuCloseRequest->Enable);
  226. ConSrvReleaseConsole(Console, TRUE);
  227. return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
  228. }
  229. CSR_API(SrvGetConsoleWindow)
  230. {
  231. NTSTATUS Status;
  232. PCONSOLE_GETWINDOW GetWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetWindowRequest;
  233. PCONSOLE Console;
  234. Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
  235. if (!NT_SUCCESS(Status)) return Status;
  236. GetWindowRequest->WindowHandle = ConioGetConsoleWindowHandle(Console);
  237. ConSrvReleaseConsole(Console, TRUE);
  238. return STATUS_SUCCESS;
  239. }
  240. CSR_API(SrvSetConsoleIcon)
  241. {
  242. NTSTATUS Status;
  243. PCONSOLE_SETICON SetIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetIconRequest;
  244. PCONSOLE Console;
  245. Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
  246. if (!NT_SUCCESS(Status)) return Status;
  247. Status = (ConioChangeIcon(Console, SetIconRequest->WindowIcon)
  248. ? STATUS_SUCCESS
  249. : STATUS_UNSUCCESSFUL);
  250. ConSrvReleaseConsole(Console, TRUE);
  251. return Status;
  252. }
  253. CSR_API(SrvGetConsoleSelectionInfo)
  254. {
  255. NTSTATUS Status;
  256. PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetSelectionInfoRequest;
  257. PCONSOLE Console;
  258. Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
  259. if (NT_SUCCESS(Status))
  260. {
  261. memset(&GetSelectionInfoRequest->Info, 0, sizeof(CONSOLE_SELECTION_INFO));
  262. if (Console->Selection.dwFlags != 0)
  263. GetSelectionInfoRequest->Info = Console->Selection;
  264. ConSrvReleaseConsole(Console, TRUE);
  265. }
  266. return Status;
  267. }
  268. /* EOF */