61f27b3bae8442222b0e30888d31394831e043c9
[reactos.git] / reactos / dll / win32 / lsasrv / authport.c
1 /*
2 * PROJECT: Local Security Authority Server DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/lsasrv/authport.c
5 * PURPOSE: LsaAuthenticationPort server routines
6 * COPYRIGHT: Copyright 2009 Eric Kohl
7 */
8
9 /* INCLUDES ****************************************************************/
10
11
12 #include "lsasrv.h"
13
14 WINE_DEFAULT_DEBUG_CHANNEL(lsasrv);
15
16
17 static LIST_ENTRY LsapLogonContextList;
18
19 static HANDLE PortThreadHandle = NULL;
20 static HANDLE AuthPortHandle = NULL;
21
22
23 /* FUNCTIONS ***************************************************************/
24
25 static NTSTATUS
26 LsapDeregisterLogonProcess(PLSA_API_MSG RequestMsg,
27 PLSAP_LOGON_CONTEXT LogonContext)
28 {
29 TRACE("(%p %p)\n", RequestMsg, LogonContext);
30
31 RemoveHeadList(&LogonContext->Entry);
32
33 NtClose(LogonContext->ClientProcessHandle);
34 NtClose(LogonContext->ConnectionHandle);
35
36 RtlFreeHeap(RtlGetProcessHeap(), 0, LogonContext);
37
38 return STATUS_SUCCESS;
39 }
40
41
42 static NTSTATUS
43 LsapCheckLogonProcess(PLSA_API_MSG RequestMsg,
44 PLSAP_LOGON_CONTEXT *LogonContext)
45 {
46 OBJECT_ATTRIBUTES ObjectAttributes;
47 HANDLE ProcessHandle = NULL;
48 PLSAP_LOGON_CONTEXT Context = NULL;
49 NTSTATUS Status;
50
51 TRACE("(%p)\n", RequestMsg);
52
53 TRACE("Client ID: %p %p\n", RequestMsg->h.ClientId.UniqueProcess, RequestMsg->h.ClientId.UniqueThread);
54
55 InitializeObjectAttributes(&ObjectAttributes,
56 NULL,
57 0,
58 NULL,
59 NULL);
60
61 Status = NtOpenProcess(&ProcessHandle,
62 PROCESS_VM_READ,
63 &ObjectAttributes,
64 &RequestMsg->h.ClientId);
65 if (!NT_SUCCESS(Status))
66 {
67 TRACE("NtOpenProcess() failed (Status %lx)\n", Status);
68 return Status;
69 }
70
71 /* Allocate the logon context */
72 Context = RtlAllocateHeap(RtlGetProcessHeap(),
73 HEAP_ZERO_MEMORY,
74 sizeof(LSAP_LOGON_CONTEXT));
75 if (Context == NULL)
76 {
77 NtClose(ProcessHandle);
78 return STATUS_INSUFFICIENT_RESOURCES;
79 }
80
81 TRACE("New LogonContext: %p\n", Context);
82
83 Context->ClientProcessHandle = ProcessHandle;
84
85 *LogonContext = Context;
86
87 return STATUS_SUCCESS;
88 }
89
90
91 static NTSTATUS
92 LsapHandlePortConnection(PLSA_API_MSG RequestMsg)
93 {
94 PLSAP_LOGON_CONTEXT LogonContext = NULL;
95 HANDLE ConnectionHandle = NULL;
96 BOOLEAN Accept;
97 REMOTE_PORT_VIEW RemotePortView;
98 NTSTATUS Status;
99
100 TRACE("(%p)\n", RequestMsg);
101
102 TRACE("Logon Process Name: %s\n", RequestMsg->ConnectInfo.LogonProcessNameBuffer);
103
104 Status = LsapCheckLogonProcess(RequestMsg,
105 &LogonContext);
106
107 RequestMsg->ConnectInfo.OperationalMode = 0x43218765;
108
109 RequestMsg->ConnectInfo.Status = Status;
110
111 if (NT_SUCCESS(Status))
112 {
113 Accept = TRUE;
114 }
115 else
116 {
117 Accept = FALSE;
118 }
119
120 RemotePortView.Length = sizeof(REMOTE_PORT_VIEW);
121 Status = NtAcceptConnectPort(&ConnectionHandle,
122 (PVOID*)LogonContext,
123 &RequestMsg->h,
124 Accept,
125 NULL,
126 &RemotePortView);
127 if (!NT_SUCCESS(Status))
128 {
129 ERR("NtAcceptConnectPort failed (Status 0x%lx)\n", Status);
130 return Status;
131 }
132
133 if (Accept == TRUE)
134 {
135 LogonContext->ConnectionHandle = ConnectionHandle;
136
137 InsertHeadList(&LsapLogonContextList,
138 &LogonContext->Entry);
139
140 Status = NtCompleteConnectPort(ConnectionHandle);
141 if (!NT_SUCCESS(Status))
142 {
143 ERR("NtCompleteConnectPort failed (Status 0x%lx)\n", Status);
144 return Status;
145 }
146 }
147
148 return Status;
149 }
150
151
152 NTSTATUS WINAPI
153 AuthPortThreadRoutine(PVOID Param)
154 {
155 PLSAP_LOGON_CONTEXT LogonContext;
156 PLSA_API_MSG ReplyMsg = NULL;
157 LSA_API_MSG RequestMsg;
158 NTSTATUS Status;
159
160 TRACE("AuthPortThreadRoutine() called\n");
161
162 Status = STATUS_SUCCESS;
163
164 for (;;)
165 {
166 Status = NtReplyWaitReceivePort(AuthPortHandle,
167 (PVOID*)&LogonContext,
168 &ReplyMsg->h,
169 &RequestMsg.h);
170 if (!NT_SUCCESS(Status))
171 {
172 TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status);
173 break;
174 }
175
176 TRACE("Received message\n");
177
178 switch (RequestMsg.h.u2.s2.Type)
179 {
180 case LPC_CONNECTION_REQUEST:
181 TRACE("Port connection request\n");
182 Status = LsapHandlePortConnection(&RequestMsg);
183 ReplyMsg = NULL;
184 break;
185
186 case LPC_PORT_CLOSED:
187 TRACE("Port closed\n");
188 ReplyMsg = NULL;
189 break;
190
191 case LPC_CLIENT_DIED:
192 TRACE("Client died\n");
193 ReplyMsg = NULL;
194 break;
195
196 default:
197 TRACE("Received request (ApiNumber: %lu)\n", RequestMsg.ApiNumber);
198
199 switch (RequestMsg.ApiNumber)
200 {
201 case LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE:
202 RequestMsg.Status = LsapCallAuthenticationPackage(&RequestMsg,
203 LogonContext);
204 ReplyMsg = &RequestMsg;
205 break;
206
207 case LSASS_REQUEST_DEREGISTER_LOGON_PROCESS:
208
209 ReplyMsg = &RequestMsg;
210 RequestMsg.Status = STATUS_SUCCESS;
211 Status = NtReplyPort(AuthPortHandle,
212 &ReplyMsg->h);
213
214 LsapDeregisterLogonProcess(&RequestMsg,
215 LogonContext);
216
217 ReplyMsg = NULL;
218 break;
219
220 case LSASS_REQUEST_LOGON_USER:
221 RequestMsg.Status = LsapLogonUser(&RequestMsg,
222 LogonContext);
223 ReplyMsg = &RequestMsg;
224 break;
225
226 case LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE:
227 RequestMsg.Status = LsapLookupAuthenticationPackage(&RequestMsg,
228 LogonContext);
229 ReplyMsg = &RequestMsg;
230 break;
231
232 default:
233 RequestMsg.Status = STATUS_SUCCESS; /* FIXME */
234 ReplyMsg = &RequestMsg;
235 break;
236 }
237
238 break;
239 }
240 }
241
242 return STATUS_SUCCESS;
243 }
244
245
246 NTSTATUS
247 StartAuthenticationPort(VOID)
248 {
249 OBJECT_ATTRIBUTES ObjectAttributes;
250 UNICODE_STRING PortName;
251 DWORD ThreadId;
252 NTSTATUS Status;
253
254 /* Initialize the logon context list */
255 InitializeListHead(&LsapLogonContextList);
256
257 RtlInitUnicodeString(&PortName,
258 L"\\LsaAuthenticationPort");
259
260 InitializeObjectAttributes(&ObjectAttributes,
261 &PortName,
262 0,
263 NULL,
264 NULL);
265
266 Status = NtCreatePort(&AuthPortHandle,
267 &ObjectAttributes,
268 sizeof(LSA_CONNECTION_INFO),
269 sizeof(LSA_API_MSG),
270 sizeof(LSA_API_MSG) * 32);
271 if (!NT_SUCCESS(Status))
272 {
273 TRACE("NtCreatePort() failed (Status %lx)\n", Status);
274 return Status;
275 }
276
277 PortThreadHandle = CreateThread(NULL,
278 0x1000,
279 (LPTHREAD_START_ROUTINE)AuthPortThreadRoutine,
280 NULL,
281 0,
282 &ThreadId);
283
284
285 return STATUS_SUCCESS;
286 }
287
288 /* EOF */