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 static LIST_ENTRY LsapLogonContextList
;
13 static HANDLE PortThreadHandle
= NULL
;
14 static HANDLE AuthPortHandle
= NULL
;
17 /* FUNCTIONS ***************************************************************/
20 LsapDeregisterLogonProcess(PLSA_API_MSG RequestMsg
,
21 PLSAP_LOGON_CONTEXT LogonContext
)
23 TRACE("(%p %p)\n", RequestMsg
, LogonContext
);
25 RemoveHeadList(&LogonContext
->Entry
);
27 NtClose(LogonContext
->ClientProcessHandle
);
28 NtClose(LogonContext
->ConnectionHandle
);
30 RtlFreeHeap(RtlGetProcessHeap(), 0, LogonContext
);
32 return STATUS_SUCCESS
;
37 LsapCheckLogonProcess(PLSA_API_MSG RequestMsg
,
38 PLSAP_LOGON_CONTEXT
*LogonContext
)
40 OBJECT_ATTRIBUTES ObjectAttributes
;
41 HANDLE ProcessHandle
= NULL
;
42 PLSAP_LOGON_CONTEXT Context
= NULL
;
45 TRACE("(%p)\n", RequestMsg
);
47 TRACE("Client ID: %p %p\n", RequestMsg
->h
.ClientId
.UniqueProcess
, RequestMsg
->h
.ClientId
.UniqueThread
);
49 InitializeObjectAttributes(&ObjectAttributes
,
55 Status
= NtOpenProcess(&ProcessHandle
,
56 PROCESS_VM_READ
| PROCESS_VM_WRITE
| PROCESS_VM_OPERATION
| PROCESS_DUP_HANDLE
,
58 &RequestMsg
->h
.ClientId
);
59 if (!NT_SUCCESS(Status
))
61 TRACE("NtOpenProcess() failed (Status %lx)\n", Status
);
65 /* Allocate the logon context */
66 Context
= RtlAllocateHeap(RtlGetProcessHeap(),
68 sizeof(LSAP_LOGON_CONTEXT
));
71 NtClose(ProcessHandle
);
72 return STATUS_INSUFFICIENT_RESOURCES
;
75 TRACE("New LogonContext: %p\n", Context
);
77 Context
->ClientProcessHandle
= ProcessHandle
;
79 *LogonContext
= Context
;
81 return STATUS_SUCCESS
;
86 LsapHandlePortConnection(PLSA_API_MSG RequestMsg
)
88 PLSAP_LOGON_CONTEXT LogonContext
= NULL
;
89 HANDLE ConnectionHandle
= NULL
;
91 REMOTE_PORT_VIEW RemotePortView
;
94 TRACE("(%p)\n", RequestMsg
);
96 TRACE("Logon Process Name: %s\n", RequestMsg
->ConnectInfo
.LogonProcessNameBuffer
);
98 Status
= LsapCheckLogonProcess(RequestMsg
,
101 RequestMsg
->ConnectInfo
.OperationalMode
= 0x43218765;
103 RequestMsg
->ConnectInfo
.Status
= Status
;
105 if (NT_SUCCESS(Status
))
114 RemotePortView
.Length
= sizeof(REMOTE_PORT_VIEW
);
115 Status
= NtAcceptConnectPort(&ConnectionHandle
,
116 (PVOID
*)LogonContext
,
121 if (!NT_SUCCESS(Status
))
123 ERR("NtAcceptConnectPort failed (Status 0x%lx)\n", Status
);
129 LogonContext
->ConnectionHandle
= ConnectionHandle
;
131 InsertHeadList(&LsapLogonContextList
,
132 &LogonContext
->Entry
);
134 Status
= NtCompleteConnectPort(ConnectionHandle
);
135 if (!NT_SUCCESS(Status
))
137 ERR("NtCompleteConnectPort failed (Status 0x%lx)\n", Status
);
147 AuthPortThreadRoutine(PVOID Param
)
149 PLSAP_LOGON_CONTEXT LogonContext
;
150 PLSA_API_MSG ReplyMsg
= NULL
;
151 LSA_API_MSG RequestMsg
;
154 TRACE("AuthPortThreadRoutine() called\n");
156 Status
= STATUS_SUCCESS
;
160 TRACE("Reply: %p\n", ReplyMsg
);
161 Status
= NtReplyWaitReceivePort(AuthPortHandle
,
162 (PVOID
*)&LogonContext
,
163 (PPORT_MESSAGE
)ReplyMsg
,
164 (PPORT_MESSAGE
)&RequestMsg
);
165 if (!NT_SUCCESS(Status
))
167 TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status
);
171 TRACE("Received message\n");
173 switch (RequestMsg
.h
.u2
.s2
.Type
)
175 case LPC_CONNECTION_REQUEST
:
176 TRACE("Port connection request\n");
177 Status
= LsapHandlePortConnection(&RequestMsg
);
181 case LPC_PORT_CLOSED
:
182 TRACE("Port closed\n");
186 case LPC_CLIENT_DIED
:
187 TRACE("Client died\n");
192 TRACE("Received request (ApiNumber: %lu)\n", RequestMsg
.ApiNumber
);
194 switch (RequestMsg
.ApiNumber
)
196 case LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE
:
197 RequestMsg
.Status
= LsapCallAuthenticationPackage(&RequestMsg
,
199 ReplyMsg
= &RequestMsg
;
202 case LSASS_REQUEST_DEREGISTER_LOGON_PROCESS
:
204 ReplyMsg
= &RequestMsg
;
205 RequestMsg
.Status
= STATUS_SUCCESS
;
206 NtReplyPort(AuthPortHandle
,
209 LsapDeregisterLogonProcess(&RequestMsg
,
215 case LSASS_REQUEST_LOGON_USER
:
216 RequestMsg
.Status
= LsapLogonUser(&RequestMsg
,
218 ReplyMsg
= &RequestMsg
;
221 case LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE
:
222 RequestMsg
.Status
= LsapLookupAuthenticationPackage(&RequestMsg
,
224 ReplyMsg
= &RequestMsg
;
228 RequestMsg
.Status
= STATUS_INVALID_SYSTEM_SERVICE
;
229 ReplyMsg
= &RequestMsg
;
237 return STATUS_SUCCESS
;
242 StartAuthenticationPort(VOID
)
244 OBJECT_ATTRIBUTES ObjectAttributes
;
245 UNICODE_STRING PortName
;
249 /* Initialize the logon context list */
250 InitializeListHead(&LsapLogonContextList
);
252 RtlInitUnicodeString(&PortName
,
253 L
"\\LsaAuthenticationPort");
255 InitializeObjectAttributes(&ObjectAttributes
,
261 Status
= NtCreatePort(&AuthPortHandle
,
263 sizeof(LSA_CONNECTION_INFO
),
265 sizeof(LSA_API_MSG
) * 32);
266 if (!NT_SUCCESS(Status
))
268 TRACE("NtCreatePort() failed (Status %lx)\n", Status
);
272 PortThreadHandle
= CreateThread(NULL
,
274 (LPTHREAD_START_ROUTINE
)AuthPortThreadRoutine
,
280 return STATUS_SUCCESS
;