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>
12 #include <ndk/psfuncs.h>
14 static LIST_ENTRY LsapLogonContextList
;
16 static HANDLE PortThreadHandle
= NULL
;
17 static HANDLE AuthPortHandle
= NULL
;
20 /* FUNCTIONS ***************************************************************/
23 LsapDeregisterLogonProcess(PLSA_API_MSG RequestMsg
,
24 PLSAP_LOGON_CONTEXT LogonContext
)
26 TRACE("(%p %p)\n", RequestMsg
, LogonContext
);
28 RemoveHeadList(&LogonContext
->Entry
);
30 NtClose(LogonContext
->ClientProcessHandle
);
31 NtClose(LogonContext
->ConnectionHandle
);
33 RtlFreeHeap(RtlGetProcessHeap(), 0, LogonContext
);
35 return STATUS_SUCCESS
;
40 LsapCheckLogonProcess(PLSA_API_MSG RequestMsg
,
41 PLSAP_LOGON_CONTEXT
*LogonContext
)
43 OBJECT_ATTRIBUTES ObjectAttributes
;
44 HANDLE ProcessHandle
= NULL
;
45 PLSAP_LOGON_CONTEXT Context
= NULL
;
48 TRACE("(%p)\n", RequestMsg
);
50 TRACE("Client ID: %p %p\n", RequestMsg
->h
.ClientId
.UniqueProcess
, RequestMsg
->h
.ClientId
.UniqueThread
);
52 InitializeObjectAttributes(&ObjectAttributes
,
58 Status
= NtOpenProcess(&ProcessHandle
,
59 PROCESS_VM_READ
| PROCESS_VM_WRITE
| PROCESS_VM_OPERATION
| PROCESS_DUP_HANDLE
,
61 &RequestMsg
->h
.ClientId
);
62 if (!NT_SUCCESS(Status
))
64 TRACE("NtOpenProcess() failed (Status %lx)\n", Status
);
68 /* Allocate the logon context */
69 Context
= RtlAllocateHeap(RtlGetProcessHeap(),
71 sizeof(LSAP_LOGON_CONTEXT
));
74 NtClose(ProcessHandle
);
75 return STATUS_INSUFFICIENT_RESOURCES
;
78 TRACE("New LogonContext: %p\n", Context
);
80 Context
->ClientProcessHandle
= ProcessHandle
;
82 *LogonContext
= Context
;
84 return STATUS_SUCCESS
;
89 LsapHandlePortConnection(PLSA_API_MSG RequestMsg
)
91 PLSAP_LOGON_CONTEXT LogonContext
= NULL
;
92 HANDLE ConnectionHandle
= NULL
;
94 REMOTE_PORT_VIEW RemotePortView
;
97 TRACE("(%p)\n", RequestMsg
);
99 TRACE("Logon Process Name: %s\n", RequestMsg
->ConnectInfo
.LogonProcessNameBuffer
);
101 Status
= LsapCheckLogonProcess(RequestMsg
,
104 RequestMsg
->ConnectInfo
.OperationalMode
= 0x43218765;
106 RequestMsg
->ConnectInfo
.Status
= Status
;
108 if (NT_SUCCESS(Status
))
117 RemotePortView
.Length
= sizeof(REMOTE_PORT_VIEW
);
118 Status
= NtAcceptConnectPort(&ConnectionHandle
,
119 (PVOID
*)LogonContext
,
124 if (!NT_SUCCESS(Status
))
126 ERR("NtAcceptConnectPort failed (Status 0x%lx)\n", Status
);
132 LogonContext
->ConnectionHandle
= ConnectionHandle
;
134 InsertHeadList(&LsapLogonContextList
,
135 &LogonContext
->Entry
);
137 Status
= NtCompleteConnectPort(ConnectionHandle
);
138 if (!NT_SUCCESS(Status
))
140 ERR("NtCompleteConnectPort failed (Status 0x%lx)\n", Status
);
150 AuthPortThreadRoutine(PVOID Param
)
152 PLSAP_LOGON_CONTEXT LogonContext
;
153 PLSA_API_MSG ReplyMsg
= NULL
;
154 LSA_API_MSG RequestMsg
;
157 TRACE("AuthPortThreadRoutine() called\n");
159 Status
= STATUS_SUCCESS
;
163 TRACE("Reply: %p\n", ReplyMsg
);
164 Status
= NtReplyWaitReceivePort(AuthPortHandle
,
165 (PVOID
*)&LogonContext
,
166 (PPORT_MESSAGE
)ReplyMsg
,
167 (PPORT_MESSAGE
)&RequestMsg
);
168 if (!NT_SUCCESS(Status
))
170 TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status
);
174 TRACE("Received message\n");
176 switch (RequestMsg
.h
.u2
.s2
.Type
)
178 case LPC_CONNECTION_REQUEST
:
179 TRACE("Port connection request\n");
180 Status
= LsapHandlePortConnection(&RequestMsg
);
184 case LPC_PORT_CLOSED
:
185 TRACE("Port closed\n");
189 case LPC_CLIENT_DIED
:
190 TRACE("Client died\n");
195 TRACE("Received request (ApiNumber: %lu)\n", RequestMsg
.ApiNumber
);
197 switch (RequestMsg
.ApiNumber
)
199 case LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE
:
200 RequestMsg
.Status
= LsapCallAuthenticationPackage(&RequestMsg
,
202 ReplyMsg
= &RequestMsg
;
205 case LSASS_REQUEST_DEREGISTER_LOGON_PROCESS
:
207 ReplyMsg
= &RequestMsg
;
208 RequestMsg
.Status
= STATUS_SUCCESS
;
209 NtReplyPort(AuthPortHandle
,
212 LsapDeregisterLogonProcess(&RequestMsg
,
218 case LSASS_REQUEST_LOGON_USER
:
219 RequestMsg
.Status
= LsapLogonUser(&RequestMsg
,
221 ReplyMsg
= &RequestMsg
;
224 case LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE
:
225 RequestMsg
.Status
= LsapLookupAuthenticationPackage(&RequestMsg
,
227 ReplyMsg
= &RequestMsg
;
231 RequestMsg
.Status
= STATUS_INVALID_SYSTEM_SERVICE
;
232 ReplyMsg
= &RequestMsg
;
240 return STATUS_SUCCESS
;
245 StartAuthenticationPort(VOID
)
247 OBJECT_ATTRIBUTES ObjectAttributes
;
248 UNICODE_STRING PortName
;
252 /* Initialize the logon context list */
253 InitializeListHead(&LsapLogonContextList
);
255 RtlInitUnicodeString(&PortName
,
256 L
"\\LsaAuthenticationPort");
258 InitializeObjectAttributes(&ObjectAttributes
,
264 Status
= NtCreatePort(&AuthPortHandle
,
266 sizeof(LSA_CONNECTION_INFO
),
268 sizeof(LSA_API_MSG
) * 32);
269 if (!NT_SUCCESS(Status
))
271 TRACE("NtCreatePort() failed (Status %lx)\n", Status
);
275 PortThreadHandle
= CreateThread(NULL
,
277 (LPTHREAD_START_ROUTINE
)AuthPortThreadRoutine
,
283 return STATUS_SUCCESS
;