ReactOS  0.4.13-dev-92-gf251225
csr.h File Reference
#include <ndk/lpcfuncs.h>
#include <csr/csr.h>
#include <win/winmsg.h>
Include dependency graph for csr.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define ST_RIT   (1<<0)
 
#define ST_DESKTOP_THREAD   (1<<1)
 
#define ST_GHOST_THREAD   (1<<2)
 

Functions

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
 
PVOID CsrApiPort
 

Macro Definition Documentation

◆ ST_DESKTOP_THREAD

#define ST_DESKTOP_THREAD   (1<<1)

Definition at line 36 of file csr.h.

◆ ST_GHOST_THREAD

#define ST_GHOST_THREAD   (1<<2)

Definition at line 37 of file csr.h.

◆ ST_RIT

#define ST_RIT   (1<<0)

Definition at line 35 of file csr.h.

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 360 of file connect.c.

364 {
366  ULONG PointerCount;
367  PULONG_PTR OffsetPointer;
368 
369  /* Fill out the Port Message Header */
370  ApiMessage->Header.u2.ZeroInit = 0;
371  ApiMessage->Header.u1.s1.TotalLength = DataLength +
372  sizeof(CSR_API_MESSAGE) - sizeof(ApiMessage->Data); // FIELD_OFFSET(CSR_API_MESSAGE, Data) + DataLength;
373  ApiMessage->Header.u1.s1.DataLength = DataLength +
374  FIELD_OFFSET(CSR_API_MESSAGE, Data) - sizeof(ApiMessage->Header); // ApiMessage->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE);
375 
376  /* Fill out the CSR Header */
377  ApiMessage->ApiNumber = ApiNumber;
378  ApiMessage->CsrCaptureData = NULL;
379 
380  DPRINT("API: %lx, u1.s1.DataLength: %x, u1.s1.TotalLength: %x\n",
381  ApiNumber,
382  ApiMessage->Header.u1.s1.DataLength,
383  ApiMessage->Header.u1.s1.TotalLength);
384 
385  /* Check if we are already inside a CSR Server */
386  if (!InsideCsrProcess)
387  {
388  /* Check if we got a Capture Buffer */
389  if (CaptureBuffer)
390  {
391  /*
392  * We have to convert from our local (client) view
393  * to the remote (server) view.
394  */
395  ApiMessage->CsrCaptureData = (PCSR_CAPTURE_BUFFER)
396  ((ULONG_PTR)CaptureBuffer + CsrPortMemoryDelta);
397 
398  /* Lock the buffer. */
399  CaptureBuffer->BufferEnd = NULL;
400 
401  /*
402  * Each client pointer inside the CSR message is converted into
403  * a server pointer, and each pointer to these message pointers
404  * is converted into an offset.
405  */
406  PointerCount = CaptureBuffer->PointerCount;
407  OffsetPointer = CaptureBuffer->PointerOffsetsArray;
408  while (PointerCount--)
409  {
410  if (*OffsetPointer != 0)
411  {
412  *(PULONG_PTR)*OffsetPointer += CsrPortMemoryDelta;
413  *OffsetPointer -= (ULONG_PTR)ApiMessage;
414  }
415  ++OffsetPointer;
416  }
417  }
418 
419  /* Send the LPC Message */
421  &ApiMessage->Header,
422  &ApiMessage->Header);
423 
424  /* Check if we got a Capture Buffer */
425  if (CaptureBuffer)
426  {
427  /*
428  * We have to convert back from the remote (server) view
429  * to our local (client) view.
430  */
431  ApiMessage->CsrCaptureData = (PCSR_CAPTURE_BUFFER)
432  ((ULONG_PTR)ApiMessage->CsrCaptureData - CsrPortMemoryDelta);
433 
434  /*
435  * Convert back the offsets into pointers to CSR message
436  * pointers, and convert back these message server pointers
437  * into client pointers.
438  */
439  PointerCount = CaptureBuffer->PointerCount;
440  OffsetPointer = CaptureBuffer->PointerOffsetsArray;
441  while (PointerCount--)
442  {
443  if (*OffsetPointer != 0)
444  {
445  *OffsetPointer += (ULONG_PTR)ApiMessage;
446  *(PULONG_PTR)*OffsetPointer -= CsrPortMemoryDelta;
447  }
448  ++OffsetPointer;
449  }
450  }
451 
452  /* Check for success */
453  if (!NT_SUCCESS(Status))
454  {
455  /* We failed. Overwrite the return value with the failure. */
456  DPRINT1("LPC Failed: %lx\n", Status);
457  ApiMessage->Status = Status;
458  }
459  }
460  else
461  {
462  /* This is a server-to-server call. Save our CID and do a direct call. */
463  DPRINT("Next gen server-to-server call\n");
464 
465  /* We check this equality inside CsrValidateMessageBuffer */
466  ApiMessage->Header.ClientId = NtCurrentTeb()->ClientId;
467 
468  Status = CsrServerApiRoutine(&ApiMessage->Header,
469  &ApiMessage->Header);
470 
471  /* Check for success */
472  if (!NT_SUCCESS(Status))
473  {
474  /* We failed. Overwrite the return value with the failure. */
475  ApiMessage->Status = Status;
476  }
477  }
478 
479  /* Return the CSR Result */
480  DPRINT("Got back: 0x%lx\n", ApiMessage->Status);
481  return ApiMessage->Status;
482 }
PCSR_SERVER_API_ROUTINE CsrServerApiRoutine
Definition: connect.c:31
NTSTATUS NTAPI NtRequestWaitReplyPort(IN HANDLE PortHandle, IN PPORT_MESSAGE LpcRequest, IN OUT PPORT_MESSAGE LpcReply)
Definition: send.c:695
LONG NTSTATUS
Definition: precomp.h:26
uint32_t ULONG_PTR
Definition: typedefs.h:63
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
struct _CSR_CAPTURE_BUFFER * PCSR_CAPTURE_BUFFER
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
BOOLEAN InsideCsrProcess
Definition: connect.c:25
ULONG_PTR CsrPortMemoryDelta
Definition: connect.c:24
Status
Definition: gdiplustypes.h:24
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
HANDLE CsrApiPort
Definition: connect.c:21
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
#define DPRINT1
Definition: precomp.h:8
unsigned int ULONG
Definition: retypes.h:1
#define ULONG_PTR
Definition: config.h:101
uint32_t * PULONG_PTR
Definition: typedefs.h:63
_Must_inspect_result_ _Out_writes_to_ DataLength PHIDP_DATA _Inout_ PULONG DataLength
Definition: hidpi.h:333
struct _CSR_API_MESSAGE CSR_API_MESSAGE

Referenced by BaseCheckForVDM(), BaseCheckVDM(), BasepNotifyCsrOfThread(), BaseUpdateVDMEntry(), CloseConsoleHandle(), ConsoleMenuControl(), CreateConsoleScreenBuffer(), CreateProcessInternalW(), CsrClientConnectToServer(), CsrIdentifyAlertableThread(), CsrSetPriorityClass(), DefineDosDeviceW(), DuplicateConsoleHandle(), EndTask(), ExitProcess(), ExitVDM(), ExitWindowsWorker(), FlushConsoleInputBuffer(), FreeConsole(), GenerateConsoleCtrlEvent(), GetConsoleCP(), GetConsoleCursorInfo(), GetConsoleDisplayMode(), GetConsoleFontInfo(), GetConsoleFontSize(), GetConsoleHandleInformation(), GetConsoleHardwareState(), GetConsoleMode(), GetConsoleOutputCP(), GetConsoleProcessList(), GetConsoleScreenBufferInfo(), GetConsoleSelectionInfo(), GetConsoleWindow(), GetCurrentConsoleFont(), GetLargestConsoleWindowSize(), GetNextVDMCommand(), GetNumberOfConsoleFonts(), GetNumberOfConsoleInputEvents(), GetNumberOfConsoleMouseButtons(), GetProcessShutdownParameters(), GetTempFileNameW(), GetThreadDesktop(), GetVDMCurrentDirectories(), IntAddConsoleAlias(), IntAllocConsole(), IntAttachConsole(), IntExpungeConsoleCommandHistory(), IntFillConsoleOutputCode(), IntGetConsoleAlias(), IntGetConsoleAliases(), IntGetConsoleAliasesLength(), IntGetConsoleAliasExes(), IntGetConsoleAliasExesLength(), IntGetConsoleCommandHistory(), IntGetConsoleCommandHistoryLength(), IntGetConsoleInput(), IntGetConsoleKeyboardLayoutName(), IntGetConsoleTitle(), IntReadConsole(), IntReadConsoleOutput(), IntReadConsoleOutputCode(), IntScrollConsoleScreenBuffer(), IntSetConsoleNumberOfCommands(), IntSetConsoleTitle(), IntWriteConsole(), IntWriteConsoleInput(), IntWriteConsoleOutput(), IntWriteConsoleOutputCode(), InvalidateConsoleDIBits(), Logon(), NotifySoundSentry(), OpenConsoleW(), RegisterConsoleVDM(), RegisterLogonProcess(), RegisterServicesProcess(), SetConsoleActiveScreenBuffer(), SetConsoleCommandHistoryMode(), SetConsoleCP(), SetConsoleCursor(), SetConsoleCursorInfo(), SetConsoleCursorPosition(), SetConsoleDisplayMode(), SetConsoleFont(), SetConsoleHandleInformation(), SetConsoleHardwareState(), SetConsoleIcon(), SetConsoleMenuClose(), SetConsoleMode(), SetConsoleOutputCP(), SetConsolePalette(), SetConsoleScreenBufferSize(), SetConsoleTextAttribute(), SetConsoleWindowInfo(), SetLastConsoleEventActive(), SetProcessShutdownParameters(), SetVDMCurrentDirectories(), ShowConsoleCursor(), UserCreateSystemThread(), and VerifyConsoleIoHandle().

◆ 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,
45  UserMode,
46  &CsrApiPort,
47  NULL);
48  if (!NT_SUCCESS(Status))
49  {
50  CsrApiPort = NULL;
51  ERR("Failed to set CSR API Port.\n");
52  }
53 
54  return Status;
55 }
LONG NTSTATUS
Definition: precomp.h:26
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:496
PVOID CsrApiPort
Definition: csr.c:16
smooth NULL
Definition: ftsmooth.c:416
POBJECT_TYPE LpcPortObjectType
Definition: port.c:17
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Status
Definition: gdiplustypes.h:24
#define ERR(fmt,...)
Definition: debug.h:109

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 }
PEPROCESS gpepCSRSS
Definition: csr.c:15
#define PsGetCurrentProcess
Definition: psfuncs.h:17
#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 
63  CsrApiPort = NULL;
64 }
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
PVOID CsrApiPort
Definition: csr.c:16
smooth NULL
Definition: ftsmooth.c:416

Referenced by _Function_class_().

◆ ResetCsrProcess()

VOID ResetCsrProcess ( VOID  )

Definition at line 29 of file csr.c.

30 {
31  if (gpepCSRSS)
33 
34  gpepCSRSS = NULL;
35 }
PEPROCESS gpepCSRSS
Definition: csr.c:15
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
smooth NULL
Definition: ftsmooth.c:416

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,
270  sizeof(USER_CREATE_SYSTEM_THREAD));
271  if (!NT_SUCCESS(ApiMessage.Status))
272  {
273  ERR("Csr call failed!\n");
274  return FALSE;
275  }
276 
277  return TRUE;
278 }
DWORD gdwPendingSystemThreads
Definition: csr.c:17
#define TRUE
Definition: types.h:120
Type
Definition: Type.h:6
#define USERSRV_SERVERDLL_INDEX
Definition: winmsg.h:15
NTSTATUS Status
Definition: csrmsg.h:112
smooth NULL
Definition: ftsmooth.c:416
#define CSR_CREATE_API_NUMBER(ServerId, ApiId)
Definition: csrmsg.h:37
#define TRACE(s)
Definition: solgame.cpp:4
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
union _USER_API_MESSAGE::@3382 Data
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
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 ERR(fmt,...)
Definition: debug.h:109
BOOL FASTCALL UserIsEnteredExclusive(VOID)
Definition: ntuser.c:231
USER_CREATE_SYSTEM_THREAD CreateSystemThreadRequest
Definition: winmsg.h:106

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;
237  case ST_DESKTOP_THREAD: DesktopThreadMain(); break;
238  case ST_GHOST_THREAD: UserGhostThreadEntry(); break;
239  default: ERR("Wrong type: %x\n", Type);
240  }
241 
242  UserEnterShared();
243 
244  return 0;
245 }
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:241
DWORD gdwPendingSystemThreads
Definition: csr.c:17
Type
Definition: Type.h:6
VOID NTAPI RawInputThreadMain(VOID)
Definition: input.c:124
#define TRACE(s)
Definition: solgame.cpp:4
#define ST_GHOST_THREAD
Definition: csr.h:37
unsigned long DWORD
Definition: ntddk_ex.h:95
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
VOID NTAPI DesktopThreadMain(VOID)
Definition: desktop.c:1508
#define ST_RIT
Definition: csr.h:35
#define ERR(fmt,...)
Definition: debug.h:109
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
VOID NTAPI UserGhostThreadEntry(VOID)
Definition: ghost.c:27
#define ST_DESKTOP_THREAD
Definition: csr.h:36

Referenced by NtUserCallOneParam().

Variable Documentation

◆ CsrApiPort

PVOID CsrApiPort

Definition at line 21 of file connect.c.

◆ gpepCSRSS