ReactOS 0.4.16-dev-297-gc569aee
csr.c File Reference
#include <win32k.h>
Include dependency graph for csr.c:

Go to the source code of this file.

Functions

 DBG_DEFAULT_CHANNEL (UserCsr)
 
VOID InitCsrProcess (VOID)
 
VOID ResetCsrProcess (VOID)
 
NTSTATUS InitCsrApiPort (IN HANDLE CsrPortHandle)
 
VOID ResetCsrApiPort (VOID)
 
NTSTATUS NTAPI CsrClientCallServer (IN OUT PCSR_API_MESSAGE ApiMessage, IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer OPTIONAL, IN CSR_API_NUMBER ApiNumber, IN ULONG DataLength)
 
DWORD UserSystemThreadProc (BOOL bRemoteProcess)
 
BOOL UserCreateSystemThread (DWORD Type)
 

Variables

PEPROCESS gpepCSRSS = NULL
 
PVOID CsrApiPort = NULL
 
DWORD gdwPendingSystemThreads = 0
 

Function Documentation

◆ CsrClientCallServer()

NTSTATUS NTAPI CsrClientCallServer ( IN OUT PCSR_API_MESSAGE  ApiMessage,
IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer  OPTIONAL,
IN CSR_API_NUMBER  ApiNumber,
IN ULONG  DataLength 
)

Definition at line 74 of file csr.c.

78{
80#if 0
81 ULONG PointerCount;
82 PULONG_PTR OffsetPointer;
83#endif
84
85 /* Do we have a connection to CSR yet? */
86 if (!CsrApiPort)
88
89 /* Fill out the Port Message Header */
90 ApiMessage->Header.u2.ZeroInit = 0;
91 ApiMessage->Header.u1.s1.TotalLength = FIELD_OFFSET(CSR_API_MESSAGE, Data) + DataLength;
92 ApiMessage->Header.u1.s1.DataLength = ApiMessage->Header.u1.s1.TotalLength -
93 sizeof(ApiMessage->Header);
94
95 /* Fill out the CSR Header */
96 ApiMessage->ApiNumber = ApiNumber;
97 ApiMessage->CsrCaptureData = NULL;
98
99 TRACE("API: %lx, u1.s1.DataLength: %x, u1.s1.TotalLength: %x\n",
100 ApiNumber,
101 ApiMessage->Header.u1.s1.DataLength,
102 ApiMessage->Header.u1.s1.TotalLength);
103
104#if 0
105 /* Check if we got a Capture Buffer */
106 if (CaptureBuffer)
107 {
108 /*
109 * We have to convert from our local (client) view
110 * to the remote (server) view.
111 */
112 ApiMessage->CsrCaptureData = (PCSR_CAPTURE_BUFFER)
113 ((ULONG_PTR)CaptureBuffer + CsrPortMemoryDelta);
114
115 /* Lock the buffer. */
116 CaptureBuffer->BufferEnd = NULL;
117
118 /*
119 * Each client pointer inside the CSR message is converted into
120 * a server pointer, and each pointer to these message pointers
121 * is converted into an offset.
122 */
123 PointerCount = CaptureBuffer->PointerCount;
124 OffsetPointer = CaptureBuffer->PointerOffsetsArray;
125 while (PointerCount--)
126 {
127 if (*OffsetPointer != 0)
128 {
129 *(PULONG_PTR)*OffsetPointer += CsrPortMemoryDelta;
130 *OffsetPointer -= (ULONG_PTR)ApiMessage;
131 }
132 ++OffsetPointer;
133 }
134 }
135#endif
136
137 UserLeaveCo();
138
139 /* Send the LPC Message */
140
141 // The wait logic below is subject to change in the future. One can
142 // imagine adding an external parameter to CsrClientCallServer, or write
143 // two versions of CsrClientCallServer, synchronous and asynchronous.
145 {
147 &ApiMessage->Header);
148 }
149 else
150 {
152 &ApiMessage->Header,
153 &ApiMessage->Header);
154 }
155
156 UserEnterCo();
157
158#if 0
159 /* Check if we got a Capture Buffer */
160 if (CaptureBuffer)
161 {
162 /*
163 * We have to convert back from the remote (server) view
164 * to our local (client) view.
165 */
166 ApiMessage->CsrCaptureData = (PCSR_CAPTURE_BUFFER)
167 ((ULONG_PTR)ApiMessage->CsrCaptureData - CsrPortMemoryDelta);
168
169 /*
170 * Convert back the offsets into pointers to CSR message
171 * pointers, and convert back these message server pointers
172 * into client pointers.
173 */
174 PointerCount = CaptureBuffer->PointerCount;
175 OffsetPointer = CaptureBuffer->PointerOffsetsArray;
176 while (PointerCount--)
177 {
178 if (*OffsetPointer != 0)
179 {
180 *OffsetPointer += (ULONG_PTR)ApiMessage;
181 *(PULONG_PTR)*OffsetPointer -= CsrPortMemoryDelta;
182 }
183 ++OffsetPointer;
184 }
185 }
186#endif
187
188 /* Check for success */
189 if (!NT_SUCCESS(Status))
190 {
191 /* We failed. Overwrite the return value with the failure. */
192 ERR("LPC Failed: %lx\n", Status);
193 ApiMessage->Status = Status;
194 }
195
196 /* Return the CSR Result */
197 TRACE("Got back: 0x%lx\n", ApiMessage->Status);
198 return ApiMessage->Status;
199}
LONG NTSTATUS
Definition: precomp.h:26
#define ERR(fmt,...)
Definition: precomp.h:57
_In_ ULONG _In_opt_ WDFREQUEST _In_opt_ PVOID _In_ size_t _In_ PVOID _In_ size_t _Out_ size_t * DataLength
Definition: cdrom.h:1444
PVOID CsrApiPort
Definition: csr.c:16
PEPROCESS gpepCSRSS
Definition: csr.c:15
struct _CSR_CAPTURE_BUFFER * PCSR_CAPTURE_BUFFER
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define ULONG_PTR
Definition: config.h:101
Status
Definition: gdiplustypes.h:25
NTSTATUS NTAPI LpcRequestPort(IN PVOID PortObject, IN PPORT_MESSAGE LpcMessage)
Definition: send.c:22
NTSTATUS NTAPI LpcRequestWaitReplyPort(IN PVOID PortObject, IN PPORT_MESSAGE LpcRequest, OUT PPORT_MESSAGE LpcReply)
Definition: send.c:178
#define STATUS_INVALID_PORT_HANDLE
Definition: ntstatus.h:302
#define TRACE(s)
Definition: solgame.cpp:4
ULONG_PTR CsrPortMemoryDelta
Definition: connect.c:30
uint32_t * PULONG_PTR
Definition: typedefs.h:65
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
#define UserEnterCo
Definition: ntuser.h:3
#define UserLeaveCo
Definition: ntuser.h:4
#define PsGetCurrentProcess
Definition: psfuncs.h:17

Referenced by UserCreateSystemThread().

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( UserCsr  )

◆ InitCsrApiPort()

NTSTATUS InitCsrApiPort ( IN HANDLE  CsrPortHandle)

Definition at line 38 of file csr.c.

39{
41
42 Status = ObReferenceObjectByHandle(CsrPortHandle,
43 0,
44 /* * */LpcPortObjectType, // or NULL,
47 NULL);
48 if (!NT_SUCCESS(Status))
49 {
51 ERR("Failed to set CSR API Port.\n");
52 }
53
54 return Status;
55}
POBJECT_TYPE LpcPortObjectType
Definition: port.c:17
#define UserMode
Definition: asm.h:35
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494

Referenced by NtUserSetInformationThread().

◆ InitCsrProcess()

VOID InitCsrProcess ( VOID  )

Definition at line 20 of file csr.c.

21{
22 /* Save the EPROCESS of CSRSS */
24 // gpepCSRSS = CsrProcess;
26}
#define ObReferenceObject
Definition: obfuncs.h:204

Referenced by NtUserInitialize().

◆ ResetCsrApiPort()

VOID ResetCsrApiPort ( VOID  )

Definition at line 58 of file csr.c.

59{
60 if (CsrApiPort)
62
64}
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by _Function_class_().

◆ ResetCsrProcess()

VOID ResetCsrProcess ( VOID  )

Definition at line 29 of file csr.c.

30{
31 if (gpepCSRSS)
33
35}

Referenced by _Function_class_().

◆ UserCreateSystemThread()

BOOL UserCreateSystemThread ( DWORD  Type)

Definition at line 247 of file csr.c.

248{
249 USER_API_MESSAGE ApiMessage;
250 PUSER_CREATE_SYSTEM_THREAD pCreateThreadRequest = &ApiMessage.Data.CreateSystemThreadRequest;
251
252 TRACE("UserCreateSystemThread: %d\n", Type);
253
255
257 {
258 ERR("System thread 0x%x already pending for creation\n", Type);
259 return TRUE;
260 }
261
262 /* We can't pass a parameter to the new thread so mark what the new thread needs to do */
264
265 /* Ask winsrv to create a new system thread. This new thread will enter win32k again calling UserSystemThreadProc */
266 pCreateThreadRequest->bRemote = FALSE;
268 NULL,
271 if (!NT_SUCCESS(ApiMessage.Status))
272 {
273 ERR("Csr call failed!\n");
274 return FALSE;
275 }
276
277 return TRUE;
278}
Type
Definition: Type.h:7
DWORD gdwPendingSystemThreads
Definition: csr.c:17
NTSTATUS NTAPI CsrClientCallServer(IN OUT PCSR_API_MESSAGE ApiMessage, IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer OPTIONAL, IN CSR_API_NUMBER ApiNumber, IN ULONG DataLength)
Definition: csr.c:74
#define CSR_CREATE_API_NUMBER(ServerId, ApiId)
Definition: csrmsg.h:37
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ASSERT(a)
Definition: mode.c:44
BOOL FASTCALL UserIsEnteredExclusive(VOID)
Definition: ntuser.c:231
NTSTATUS Status
Definition: csrmsg.h:110
union _USER_API_MESSAGE::@3540 Data
USER_CREATE_SYSTEM_THREAD CreateSystemThreadRequest
Definition: winmsg.h:114
@ UserpCreateSystemThreads
Definition: winmsg.h:29
#define USERSRV_SERVERDLL_INDEX
Definition: winmsg.h:15

Referenced by IntCreateWindowStation(), and IntMakeHungWindowGhosted().

◆ UserSystemThreadProc()

DWORD UserSystemThreadProc ( BOOL  bRemoteProcess)

Definition at line 207 of file csr.c.

208{
209 DWORD Type;
210
212 {
213 ERR("gdwPendingSystemThreads is 0!\n");
214 return 0;
215 }
216
217 /* Decide which thread this will be */
219 Type = ST_RIT;
222 else
224
225 ASSERT(Type);
226
227 /* We will handle one of these threads right here so unmark it as pending */
229
230 UserLeave();
231
232 TRACE("UserSystemThreadProc: %d\n", Type);
233
234 switch (Type)
235 {
236 case ST_RIT: RawInputThreadMain(); break;
239 default: ERR("Wrong type: %x\n", Type);
240 }
241
243
244 return 0;
245}
unsigned long DWORD
Definition: ntddk_ex.h:95
VOID NTAPI UserGhostThreadEntry(VOID)
Definition: ghost.c:27
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:242
#define ST_GHOST_THREAD
Definition: csr.h:37
#define ST_DESKTOP_THREAD
Definition: csr.h:36
#define ST_RIT
Definition: csr.h:35
VOID NTAPI DesktopThreadMain(VOID)
Definition: desktop.c:1563
VOID NTAPI RawInputThreadMain(VOID)
Definition: input.c:124

Referenced by NtUserCallOneParam().

Variable Documentation

◆ CsrApiPort

PVOID CsrApiPort = NULL

Definition at line 16 of file csr.c.

Referenced by CsrClientCallServer(), InitCsrApiPort(), and ResetCsrApiPort().

◆ gdwPendingSystemThreads

DWORD gdwPendingSystemThreads = 0

Definition at line 17 of file csr.c.

Referenced by UserCreateSystemThread(), and UserSystemThreadProc().

◆ gpepCSRSS