xref: /reactos/win32ss/user/winsrv/consrv/subsysreg.c (revision 80733143)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS Console Server DLL
4  * FILE:            win32ss/user/winsrv/consrv/subsysreg.c
5  * PURPOSE:         Registration APIs for VDM, OS2 and IME subsystems
6  * PROGRAMMERS:     Hermes Belusca-Maito (hermes.belusca@sfr.fr)
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include "consrv.h"
12 
13 #define NDEBUG
14 #include <debug.h>
15 
16 /* PUBLIC SERVER APIS *********************************************************/
17 
18 /*
19  * VDM Subsystem
20  */
21 
22 CSR_API(SrvRegisterConsoleVDM)
23 {
24     NTSTATUS Status;
25     PCONSOLE_REGISTERVDM RegisterVDMRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.RegisterVDMRequest;
26     PCONSRV_CONSOLE Console;
27 
28     DPRINT1("SrvRegisterConsoleVDM(%d)\n", RegisterVDMRequest->RegisterFlags);
29 
30     Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
31                               &Console, TRUE);
32     if (!NT_SUCCESS(Status))
33     {
34         DPRINT1("Can't get console, status %lx\n", Status);
35         return Status;
36     }
37 
38     if (RegisterVDMRequest->RegisterFlags != 0)
39     {
40         LARGE_INTEGER SectionSize;
41         SIZE_T Size, ViewSize = 0;
42         HANDLE ProcessHandle;
43 
44         /*
45          * Remember the handle to the process so that we can close or unmap
46          * correctly the allocated resources when the client releases the
47          * screen buffer.
48          */
49         ProcessHandle = CsrGetClientThread()->Process->ProcessHandle;
50         Console->VDMClientProcess = ProcessHandle;
51 
52         Console->VDMBufferSize = RegisterVDMRequest->VDMBufferSize;
53 
54         Size = Console->VDMBufferSize.X * Console->VDMBufferSize.Y
55                                         * sizeof(CHAR_CELL);
56 
57         /*
58          * Create a memory section for the VDM buffer, to share with the client.
59          */
60         SectionSize.QuadPart = Size;
61         Status = NtCreateSection(&Console->VDMBufferSection,
62                                  SECTION_ALL_ACCESS,
63                                  NULL,
64                                  &SectionSize,
65                                  PAGE_READWRITE,
66                                  SEC_COMMIT,
67                                  NULL);
68         if (!NT_SUCCESS(Status))
69         {
70             DPRINT1("Error: Impossible to create a shared section, Status = 0x%08lx\n", Status);
71             goto Quit;
72         }
73 
74         /*
75          * Create a view for our needs.
76          */
77         ViewSize = 0;
78         Console->VDMBuffer = NULL;
79         Status = NtMapViewOfSection(Console->VDMBufferSection,
80                                     NtCurrentProcess(),
81                                     (PVOID*)&Console->VDMBuffer,
82                                     0,
83                                     0,
84                                     NULL,
85                                     &ViewSize,
86                                     ViewUnmap,
87                                     0,
88                                     PAGE_READWRITE);
89         if (!NT_SUCCESS(Status))
90         {
91             DPRINT1("Error: Impossible to map the shared section, Status = 0x%08lx\n", Status);
92             NtClose(Console->VDMBufferSection);
93             goto Quit;
94         }
95 
96         /*
97          * Create a view for the client. We must keep a trace of it so that
98          * we can unmap it when the client releases the VDM buffer.
99          */
100         ViewSize = 0;
101         Console->ClientVDMBuffer = NULL;
102         Status = NtMapViewOfSection(Console->VDMBufferSection,
103                                     ProcessHandle,
104                                     (PVOID*)&Console->ClientVDMBuffer,
105                                     0,
106                                     0,
107                                     NULL,
108                                     &ViewSize,
109                                     ViewUnmap,
110                                     0,
111                                     PAGE_READWRITE);
112         if (!NT_SUCCESS(Status))
113         {
114             DPRINT1("Error: Impossible to map the shared section, Status = 0x%08lx\n", Status);
115             NtUnmapViewOfSection(NtCurrentProcess(), Console->VDMBuffer);
116             NtClose(Console->VDMBufferSection);
117             goto Quit;
118         }
119 
120         // TODO: Duplicate the event handles.
121 
122         RegisterVDMRequest->VDMBuffer = Console->ClientVDMBuffer;
123 
124         Status = STATUS_SUCCESS;
125     }
126     else
127     {
128         /* RegisterFlags == 0 means we are unregistering the VDM */
129 
130         // TODO: Close the duplicated handles.
131 
132         if (Console->VDMBuffer)
133         {
134             /*
135              * Uninitialize the graphics screen buffer
136              * in the reverse way we initialized it.
137              */
138             NtUnmapViewOfSection(Console->VDMClientProcess, Console->ClientVDMBuffer);
139             NtUnmapViewOfSection(NtCurrentProcess(), Console->VDMBuffer);
140             NtClose(Console->VDMBufferSection);
141         }
142         Console->VDMBuffer = Console->ClientVDMBuffer = NULL;
143 
144         Console->VDMBufferSize.X = Console->VDMBufferSize.Y = 0;
145     }
146 
147 Quit:
148     ConSrvReleaseConsole(Console, TRUE);
149     return Status;
150 }
151 
152 CSR_API(SrvVDMConsoleOperation)
153 {
154     DPRINT1("%s not yet implemented\n", __FUNCTION__);
155     return STATUS_NOT_IMPLEMENTED;
156 }
157 
158 
159 /*
160  * OS/2 Subsystem
161  */
162 
163 CSR_API(SrvRegisterConsoleOS2)
164 {
165     DPRINT1("%s not yet implemented\n", __FUNCTION__);
166     return STATUS_NOT_IMPLEMENTED;
167 }
168 
169 CSR_API(SrvSetConsoleOS2OemFormat)
170 {
171     DPRINT1("%s not yet implemented\n", __FUNCTION__);
172     return STATUS_NOT_IMPLEMENTED;
173 }
174 
175 
176 /*
177  * IME Subsystem
178  */
179 
180 CSR_API(SrvRegisterConsoleIME)
181 {
182     DPRINT1("%s not yet implemented\n", __FUNCTION__);
183     return STATUS_NOT_IMPLEMENTED;
184 }
185 
186 CSR_API(SrvUnregisterConsoleIME)
187 {
188     DPRINT1("%s not yet implemented\n", __FUNCTION__);
189     return STATUS_NOT_IMPLEMENTED;
190 }
191 
192 /* EOF */
193