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
11 #include <ndk/lpcfuncs.h>
13 static LIST_ENTRY LsapLogonContextList
;
15 static HANDLE PortThreadHandle
= NULL
;
16 static HANDLE AuthPortHandle
= NULL
;
19 /* FUNCTIONS ***************************************************************/
22 LsapDeregisterLogonProcess(PLSA_API_MSG RequestMsg
,
23 PLSAP_LOGON_CONTEXT LogonContext
)
25 TRACE("LsapDeregisterLogonProcess(%p %p)\n", RequestMsg
, LogonContext
);
27 RemoveHeadList(&LogonContext
->Entry
);
29 NtClose(LogonContext
->ClientProcessHandle
);
30 NtClose(LogonContext
->ConnectionHandle
);
32 RtlFreeHeap(RtlGetProcessHeap(), 0, LogonContext
);
34 return STATUS_SUCCESS
;
41 _In_ HANDLE ProcessHandle
)
43 LUID TcbPrivilege
= {SE_TCB_PRIVILEGE
, 0};
44 HANDLE TokenHandle
= NULL
;
45 PTOKEN_PRIVILEGES Privileges
= NULL
;
50 Status
= NtOpenProcessToken(ProcessHandle
,
53 if (!NT_SUCCESS(Status
))
56 Status
= NtQueryInformationToken(TokenHandle
,
61 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_TOO_SMALL
)
64 Privileges
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Size
);
65 if (Privileges
== NULL
)
68 Status
= NtQueryInformationToken(TokenHandle
,
73 if (!NT_SUCCESS(Status
))
76 for (i
= 0; i
< Privileges
->PrivilegeCount
; i
++)
78 if (RtlEqualLuid(&Privileges
->Privileges
[i
].Luid
, &TcbPrivilege
))
86 if (Privileges
!= NULL
)
87 RtlFreeHeap(RtlGetProcessHeap(), 0, Privileges
);
89 if (TokenHandle
!= NULL
)
97 LsapCheckLogonProcess(PLSA_API_MSG RequestMsg
,
98 PLSAP_LOGON_CONTEXT
*LogonContext
)
100 OBJECT_ATTRIBUTES ObjectAttributes
;
101 HANDLE ProcessHandle
= NULL
;
102 PLSAP_LOGON_CONTEXT Context
= NULL
;
105 TRACE("LsapCheckLogonProcess(%p)\n", RequestMsg
);
107 TRACE("Client ID: %p %p\n", RequestMsg
->h
.ClientId
.UniqueProcess
, RequestMsg
->h
.ClientId
.UniqueThread
);
109 InitializeObjectAttributes(&ObjectAttributes
,
115 Status
= NtOpenProcess(&ProcessHandle
,
116 PROCESS_VM_READ
| PROCESS_VM_WRITE
| PROCESS_VM_OPERATION
| PROCESS_DUP_HANDLE
| PROCESS_QUERY_INFORMATION
,
118 &RequestMsg
->h
.ClientId
);
119 if (!NT_SUCCESS(Status
))
121 TRACE("NtOpenProcess() failed (Status %lx)\n", Status
);
125 /* Allocate the logon context */
126 Context
= RtlAllocateHeap(RtlGetProcessHeap(),
128 sizeof(LSAP_LOGON_CONTEXT
));
131 NtClose(ProcessHandle
);
132 return STATUS_INSUFFICIENT_RESOURCES
;
135 TRACE("New LogonContext: %p\n", Context
);
137 Context
->ClientProcessHandle
= ProcessHandle
;
138 Context
->TrustedCaller
= RequestMsg
->ConnectInfo
.TrustedCaller
;
140 if (Context
->TrustedCaller
)
141 Context
->TrustedCaller
= LsapIsTrustedClient(ProcessHandle
);
143 *LogonContext
= Context
;
145 return STATUS_SUCCESS
;
150 LsapHandlePortConnection(PLSA_API_MSG RequestMsg
)
152 PLSAP_LOGON_CONTEXT LogonContext
= NULL
;
153 HANDLE ConnectionHandle
= NULL
;
155 REMOTE_PORT_VIEW RemotePortView
;
156 NTSTATUS Status
= STATUS_SUCCESS
;
158 TRACE("LsapHandlePortConnection(%p)\n", RequestMsg
);
160 TRACE("Logon Process Name: %s\n", RequestMsg
->ConnectInfo
.LogonProcessNameBuffer
);
162 if (RequestMsg
->ConnectInfo
.CreateContext
!= FALSE
)
164 Status
= LsapCheckLogonProcess(RequestMsg
,
167 RequestMsg
->ConnectInfo
.OperationalMode
= 0x43218765;
169 RequestMsg
->ConnectInfo
.Status
= Status
;
172 if (NT_SUCCESS(Status
))
181 RemotePortView
.Length
= sizeof(REMOTE_PORT_VIEW
);
182 Status
= NtAcceptConnectPort(&ConnectionHandle
,
183 (PVOID
*)LogonContext
,
188 if (!NT_SUCCESS(Status
))
190 ERR("NtAcceptConnectPort failed (Status 0x%lx)\n", Status
);
196 if (LogonContext
!= NULL
)
198 LogonContext
->ConnectionHandle
= ConnectionHandle
;
200 InsertHeadList(&LsapLogonContextList
,
201 &LogonContext
->Entry
);
204 Status
= NtCompleteConnectPort(ConnectionHandle
);
205 if (!NT_SUCCESS(Status
))
207 ERR("NtCompleteConnectPort failed (Status 0x%lx)\n", Status
);
217 AuthPortThreadRoutine(PVOID Param
)
219 PLSAP_LOGON_CONTEXT LogonContext
;
220 PLSA_API_MSG ReplyMsg
= NULL
;
221 LSA_API_MSG RequestMsg
;
224 TRACE("AuthPortThreadRoutine() called\n");
226 Status
= STATUS_SUCCESS
;
230 TRACE("Reply: %p\n", ReplyMsg
);
231 Status
= NtReplyWaitReceivePort(AuthPortHandle
,
232 (PVOID
*)&LogonContext
,
233 (PPORT_MESSAGE
)ReplyMsg
,
234 (PPORT_MESSAGE
)&RequestMsg
);
235 if (!NT_SUCCESS(Status
))
237 TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status
);
241 TRACE("Received message\n");
243 switch (RequestMsg
.h
.u2
.s2
.Type
)
245 case LPC_CONNECTION_REQUEST
:
246 TRACE("Port connection request\n");
247 Status
= LsapHandlePortConnection(&RequestMsg
);
251 case LPC_PORT_CLOSED
:
252 TRACE("Port closed\n");
256 case LPC_CLIENT_DIED
:
257 TRACE("Client died\n");
262 TRACE("Received request (ApiNumber: %lu)\n", RequestMsg
.ApiNumber
);
264 switch (RequestMsg
.ApiNumber
)
266 case LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE
:
267 RequestMsg
.Status
= LsapCallAuthenticationPackage(&RequestMsg
,
269 ReplyMsg
= &RequestMsg
;
272 case LSASS_REQUEST_DEREGISTER_LOGON_PROCESS
:
274 ReplyMsg
= &RequestMsg
;
275 RequestMsg
.Status
= STATUS_SUCCESS
;
276 NtReplyPort(AuthPortHandle
,
279 LsapDeregisterLogonProcess(&RequestMsg
,
285 case LSASS_REQUEST_LOGON_USER
:
286 RequestMsg
.Status
= LsapLogonUser(&RequestMsg
,
288 ReplyMsg
= &RequestMsg
;
291 case LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE
:
292 RequestMsg
.Status
= LsapLookupAuthenticationPackage(&RequestMsg
,
294 ReplyMsg
= &RequestMsg
;
297 case LSASS_REQUEST_ENUM_LOGON_SESSIONS
:
298 RequestMsg
.Status
= LsapEnumLogonSessions(&RequestMsg
);
299 ReplyMsg
= &RequestMsg
;
302 case LSASS_REQUEST_GET_LOGON_SESSION_DATA
:
303 RequestMsg
.Status
= LsapGetLogonSessionData(&RequestMsg
);
304 ReplyMsg
= &RequestMsg
;
307 case LSASS_REQUEST_POLICY_CHANGE_NOTIFY
:
308 RequestMsg
.Status
= LsapRegisterNotification(&RequestMsg
);
309 ReplyMsg
= &RequestMsg
;
313 RequestMsg
.Status
= STATUS_INVALID_SYSTEM_SERVICE
;
314 ReplyMsg
= &RequestMsg
;
322 return STATUS_SUCCESS
;
327 StartAuthenticationPort(VOID
)
329 OBJECT_ATTRIBUTES ObjectAttributes
;
330 UNICODE_STRING PortName
;
332 UNICODE_STRING EventName
;
336 TRACE("StartAuthenticationPort()\n");
338 /* Initialize the logon context list */
339 InitializeListHead(&LsapLogonContextList
);
341 RtlInitUnicodeString(&PortName
,
342 L
"\\LsaAuthenticationPort");
344 InitializeObjectAttributes(&ObjectAttributes
,
350 Status
= NtCreatePort(&AuthPortHandle
,
352 sizeof(LSA_CONNECTION_INFO
),
354 sizeof(LSA_API_MSG
) * 32);
355 if (!NT_SUCCESS(Status
))
357 WARN("NtCreatePort() failed (Status %lx)\n", Status
);
361 RtlInitUnicodeString(&EventName
,
362 L
"\\SECURITY\\LSA_AUTHENTICATION_INITIALIZED");
363 InitializeObjectAttributes(&ObjectAttributes
,
365 OBJ_CASE_INSENSITIVE
| OBJ_PERMANENT
,
368 Status
= NtOpenEvent(&EventHandle
,
371 if (!NT_SUCCESS(Status
))
373 TRACE("NtOpenEvent failed (Status 0x%08lx)\n", Status
);
375 Status
= NtCreateEvent(&EventHandle
,
380 if (!NT_SUCCESS(Status
))
382 WARN("NtCreateEvent failed (Status 0x%08lx)\n", Status
);
387 Status
= NtSetEvent(EventHandle
, NULL
);
388 NtClose(EventHandle
);
389 if (!NT_SUCCESS(Status
))
391 WARN("NtSetEvent failed (Status 0x%08lx)\n", Status
);
395 PortThreadHandle
= CreateThread(NULL
,
397 (LPTHREAD_START_ROUTINE
)AuthPortThreadRoutine
,
403 return STATUS_SUCCESS
;