562fe7ac0cca2fd0f8dca34ef817746037c15656
[reactos.git] / reactos / lib / ntdll / csr / lpc.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: lib/ntdll/csr/lpc.c
6 * PURPOSE: CSRSS Client/Server LPC API
7 *
8 * REVISIONS:
9 * 2001-06-16 (ea)
10 * File api.c renamed lpc.c. Process/thread code moved
11 * in thread.c. Check added on the LPC port.
12 */
13
14 /* INCLUDES *****************************************************************/
15
16 #include <ntdll.h>
17 #define NDEBUG
18 #include <debug.h>
19
20 /* GLOBALS *******************************************************************/
21
22 HANDLE WindowsApiPort = INVALID_HANDLE_VALUE;
23 static PVOID CsrSectionMapBase = NULL;
24 static PVOID CsrSectionMapServerBase = NULL;
25 static HANDLE CsrCommHeap = NULL;
26
27 #define CSR_CONTROL_HEAP_SIZE (65536)
28
29 /* FUNCTIONS *****************************************************************/
30
31 /* Possible CsrClientCallServer (the NT one): */
32
33 NTSTATUS STDCALL
34 CsrCaptureParameterBuffer(PVOID ParameterBuffer,
35 ULONG ParameterBufferSize,
36 PVOID* ClientAddress,
37 PVOID* ServerAddress)
38 {
39 PVOID Block;
40
41 Block = RtlAllocateHeap(CsrCommHeap, 0, ParameterBufferSize);
42 if (Block == NULL)
43 {
44 return(STATUS_NO_MEMORY);
45 }
46 if(ParameterBuffer != NULL)
47 {
48 memcpy(Block, ParameterBuffer, ParameterBufferSize);
49 }
50 *ClientAddress = Block;
51 *ServerAddress = (PVOID)((ULONG_PTR)Block - (ULONG_PTR)CsrSectionMapBase + (ULONG_PTR)CsrSectionMapServerBase);
52 return(STATUS_SUCCESS);
53 }
54
55 NTSTATUS STDCALL
56 CsrReleaseParameterBuffer(PVOID ClientAddress)
57 {
58 RtlFreeHeap(CsrCommHeap, 0, ClientAddress);
59 return(STATUS_SUCCESS);
60 }
61
62 /*
63 * @implemented
64 */
65 NTSTATUS
66 STDCALL
67 CsrClientCallServer(PCSR_API_MESSAGE Request,
68 PVOID CapturedBuffer OPTIONAL,
69 CSR_API_NUMBER ApiNumber,
70 ULONG RequestLength)
71 {
72 NTSTATUS Status;
73 DPRINT("CSR: CsrClientCallServer!\n");
74
75 /* Make sure it's valid */
76 if (INVALID_HANDLE_VALUE == WindowsApiPort)
77 {
78 DPRINT1("NTDLL.%s: client not connected to CSRSS!\n", __FUNCTION__);
79 return (STATUS_UNSUCCESSFUL);
80 }
81
82 /* Fill out the header */
83 Request->Type = ApiNumber;
84 Request->Header.DataSize = RequestLength - LPC_MESSAGE_BASE_SIZE;
85 Request->Header.MessageSize = RequestLength;
86 DPRINT("CSR: API: %x, DataSize: %x, MessageSize: %x\n",
87 ApiNumber,
88 Request->Header.DataSize,
89 Request->Header.MessageSize);
90
91 /* Send the LPC Message */
92 Status = NtRequestWaitReplyPort(WindowsApiPort,
93 &Request->Header,
94 &Request->Header);
95
96 DPRINT("Got back: %x\n", Status);
97 return(Status);
98 }
99
100 /*
101 * @implemented
102 */
103 NTSTATUS
104 STDCALL
105 CsrClientConnectToServer(PWSTR ObjectDirectory,
106 ULONG ServerId,
107 PVOID Unknown,
108 PVOID Context,
109 ULONG ContextLength,
110 PBOOLEAN ServerToServerCall)
111 {
112 NTSTATUS Status;
113 UNICODE_STRING PortName = RTL_CONSTANT_STRING(L"\\Windows\\ApiPort");
114 ULONG ConnectInfoLength;
115 CSR_API_MESSAGE Request;
116 LPC_SECTION_WRITE LpcWrite;
117 HANDLE CsrSectionHandle;
118 LARGE_INTEGER CsrSectionViewSize;
119
120 if (WindowsApiPort != INVALID_HANDLE_VALUE)
121 {
122 return STATUS_SUCCESS;
123 }
124
125 CsrSectionViewSize.QuadPart = CSR_CSRSS_SECTION_SIZE;
126 Status = NtCreateSection(&CsrSectionHandle,
127 SECTION_ALL_ACCESS,
128 NULL,
129 &CsrSectionViewSize,
130 PAGE_READWRITE,
131 SEC_COMMIT,
132 NULL);
133 if (!NT_SUCCESS(Status))
134 {
135 return(Status);
136 }
137 ConnectInfoLength = 0;
138 LpcWrite.Length = sizeof(LPC_SECTION_WRITE);
139 LpcWrite.SectionHandle = CsrSectionHandle;
140 LpcWrite.SectionOffset = 0;
141 LpcWrite.ViewSize = CsrSectionViewSize.u.LowPart;
142 Status = NtConnectPort(&WindowsApiPort,
143 &PortName,
144 NULL,
145 &LpcWrite,
146 NULL,
147 NULL,
148 NULL,
149 &ConnectInfoLength);
150 if (!NT_SUCCESS(Status))
151 {
152 WindowsApiPort = INVALID_HANDLE_VALUE;
153 return(Status);
154 }
155
156 NtClose(CsrSectionHandle);
157 CsrSectionMapBase = LpcWrite.ViewBase;
158 CsrSectionMapServerBase = LpcWrite.TargetViewBase;
159
160 /* Create the heap for communication for csrss. */
161 CsrCommHeap = RtlCreateHeap(0,
162 CsrSectionMapBase,
163 CsrSectionViewSize.u.LowPart,
164 CsrSectionViewSize.u.LowPart,
165 0,
166 NULL);
167 if (CsrCommHeap == NULL)
168 {
169 return(STATUS_NO_MEMORY);
170 }
171
172 Status = CsrClientCallServer(&Request,
173 NULL,
174 MAKE_CSR_API(CONNECT_PROCESS, CSR_NATIVE),
175 sizeof(CSR_API_MESSAGE));
176 if (!NT_SUCCESS(Status))
177 {
178 return(Status);
179 }
180 if (!NT_SUCCESS(Request.Status))
181 {
182 return(Request.Status);
183 }
184 return(STATUS_SUCCESS);
185 }
186
187 /* EOF */