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("(%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
;
39 LsapCheckLogonProcess(PLSA_API_MSG RequestMsg
,
40 PLSAP_LOGON_CONTEXT
*LogonContext
)
42 OBJECT_ATTRIBUTES ObjectAttributes
;
43 HANDLE ProcessHandle
= NULL
;
44 PLSAP_LOGON_CONTEXT Context
= NULL
;
47 TRACE("(%p)\n", RequestMsg
);
49 TRACE("Client ID: %p %p\n", RequestMsg
->h
.ClientId
.UniqueProcess
, RequestMsg
->h
.ClientId
.UniqueThread
);
51 InitializeObjectAttributes(&ObjectAttributes
,
57 Status
= NtOpenProcess(&ProcessHandle
,
58 PROCESS_VM_READ
| PROCESS_VM_WRITE
| PROCESS_VM_OPERATION
| PROCESS_DUP_HANDLE
,
60 &RequestMsg
->h
.ClientId
);
61 if (!NT_SUCCESS(Status
))
63 TRACE("NtOpenProcess() failed (Status %lx)\n", Status
);
67 /* Allocate the logon context */
68 Context
= RtlAllocateHeap(RtlGetProcessHeap(),
70 sizeof(LSAP_LOGON_CONTEXT
));
73 NtClose(ProcessHandle
);
74 return STATUS_INSUFFICIENT_RESOURCES
;
77 TRACE("New LogonContext: %p\n", Context
);
79 Context
->ClientProcessHandle
= ProcessHandle
;
81 *LogonContext
= Context
;
83 return STATUS_SUCCESS
;
88 LsapHandlePortConnection(PLSA_API_MSG RequestMsg
)
90 PLSAP_LOGON_CONTEXT LogonContext
= NULL
;
91 HANDLE ConnectionHandle
= NULL
;
93 REMOTE_PORT_VIEW RemotePortView
;
94 NTSTATUS Status
= STATUS_SUCCESS
;
96 TRACE("(%p)\n", RequestMsg
);
98 TRACE("Logon Process Name: %s\n", RequestMsg
->ConnectInfo
.LogonProcessNameBuffer
);
100 if (RequestMsg
->ConnectInfo
.CreateContext
== TRUE
)
102 Status
= LsapCheckLogonProcess(RequestMsg
,
105 RequestMsg
->ConnectInfo
.OperationalMode
= 0x43218765;
107 RequestMsg
->ConnectInfo
.Status
= Status
;
110 if (NT_SUCCESS(Status
))
119 RemotePortView
.Length
= sizeof(REMOTE_PORT_VIEW
);
120 Status
= NtAcceptConnectPort(&ConnectionHandle
,
121 (PVOID
*)LogonContext
,
126 if (!NT_SUCCESS(Status
))
128 ERR("NtAcceptConnectPort failed (Status 0x%lx)\n", Status
);
134 if (LogonContext
!= NULL
)
136 LogonContext
->ConnectionHandle
= ConnectionHandle
;
138 InsertHeadList(&LsapLogonContextList
,
139 &LogonContext
->Entry
);
142 Status
= NtCompleteConnectPort(ConnectionHandle
);
143 if (!NT_SUCCESS(Status
))
145 ERR("NtCompleteConnectPort failed (Status 0x%lx)\n", Status
);
155 AuthPortThreadRoutine(PVOID Param
)
157 PLSAP_LOGON_CONTEXT LogonContext
;
158 PLSA_API_MSG ReplyMsg
= NULL
;
159 LSA_API_MSG RequestMsg
;
162 TRACE("AuthPortThreadRoutine() called\n");
164 Status
= STATUS_SUCCESS
;
168 TRACE("Reply: %p\n", ReplyMsg
);
169 Status
= NtReplyWaitReceivePort(AuthPortHandle
,
170 (PVOID
*)&LogonContext
,
171 (PPORT_MESSAGE
)ReplyMsg
,
172 (PPORT_MESSAGE
)&RequestMsg
);
173 if (!NT_SUCCESS(Status
))
175 TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status
);
179 TRACE("Received message\n");
181 switch (RequestMsg
.h
.u2
.s2
.Type
)
183 case LPC_CONNECTION_REQUEST
:
184 TRACE("Port connection request\n");
185 Status
= LsapHandlePortConnection(&RequestMsg
);
189 case LPC_PORT_CLOSED
:
190 TRACE("Port closed\n");
194 case LPC_CLIENT_DIED
:
195 TRACE("Client died\n");
200 TRACE("Received request (ApiNumber: %lu)\n", RequestMsg
.ApiNumber
);
202 switch (RequestMsg
.ApiNumber
)
204 case LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE
:
205 RequestMsg
.Status
= LsapCallAuthenticationPackage(&RequestMsg
,
207 ReplyMsg
= &RequestMsg
;
210 case LSASS_REQUEST_DEREGISTER_LOGON_PROCESS
:
212 ReplyMsg
= &RequestMsg
;
213 RequestMsg
.Status
= STATUS_SUCCESS
;
214 NtReplyPort(AuthPortHandle
,
217 LsapDeregisterLogonProcess(&RequestMsg
,
223 case LSASS_REQUEST_LOGON_USER
:
224 RequestMsg
.Status
= LsapLogonUser(&RequestMsg
,
226 ReplyMsg
= &RequestMsg
;
229 case LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE
:
230 RequestMsg
.Status
= LsapLookupAuthenticationPackage(&RequestMsg
,
232 ReplyMsg
= &RequestMsg
;
235 case LSASS_REQUEST_ENUM_LOGON_SESSIONS
:
236 RequestMsg
.Status
= LsapEnumLogonSessions(&RequestMsg
);
237 ReplyMsg
= &RequestMsg
;
240 case LSASS_REQUEST_GET_LOGON_SESSION_DATA
:
241 RequestMsg
.Status
= LsapGetLogonSessionData(&RequestMsg
);
242 ReplyMsg
= &RequestMsg
;
246 RequestMsg
.Status
= STATUS_INVALID_SYSTEM_SERVICE
;
247 ReplyMsg
= &RequestMsg
;
255 return STATUS_SUCCESS
;
260 StartAuthenticationPort(VOID
)
262 OBJECT_ATTRIBUTES ObjectAttributes
;
263 UNICODE_STRING PortName
;
267 /* Initialize the logon context list */
268 InitializeListHead(&LsapLogonContextList
);
270 RtlInitUnicodeString(&PortName
,
271 L
"\\LsaAuthenticationPort");
273 InitializeObjectAttributes(&ObjectAttributes
,
279 Status
= NtCreatePort(&AuthPortHandle
,
281 sizeof(LSA_CONNECTION_INFO
),
283 sizeof(LSA_API_MSG
) * 32);
284 if (!NT_SUCCESS(Status
))
286 TRACE("NtCreatePort() failed (Status %lx)\n", Status
);
290 PortThreadHandle
= CreateThread(NULL
,
292 (LPTHREAD_START_ROUTINE
)AuthPortThreadRoutine
,
298 return STATUS_SUCCESS
;