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
9 /* INCLUDES ****************************************************************/
14 WINE_DEFAULT_DEBUG_CHANNEL(lsasrv
);
17 static LIST_ENTRY LsapLogonContextList
;
19 static HANDLE PortThreadHandle
= NULL
;
20 static HANDLE AuthPortHandle
= NULL
;
23 /* FUNCTIONS ***************************************************************/
26 LsapDeregisterLogonProcess(PLSA_API_MSG RequestMsg
,
27 PLSAP_LOGON_CONTEXT LogonContext
)
29 TRACE("(%p %p)\n", RequestMsg
, LogonContext
);
31 RemoveHeadList(&LogonContext
->Entry
);
33 NtClose(LogonContext
->ClientProcessHandle
);
34 NtClose(LogonContext
->ConnectionHandle
);
36 RtlFreeHeap(RtlGetProcessHeap(), 0, LogonContext
);
38 return STATUS_SUCCESS
;
43 LsapCheckLogonProcess(PLSA_API_MSG RequestMsg
,
44 PLSAP_LOGON_CONTEXT
*LogonContext
)
46 OBJECT_ATTRIBUTES ObjectAttributes
;
47 HANDLE ProcessHandle
= NULL
;
48 PLSAP_LOGON_CONTEXT Context
= NULL
;
51 TRACE("(%p)\n", RequestMsg
);
53 TRACE("Client ID: %p %p\n", RequestMsg
->h
.ClientId
.UniqueProcess
, RequestMsg
->h
.ClientId
.UniqueThread
);
55 InitializeObjectAttributes(&ObjectAttributes
,
61 Status
= NtOpenProcess(&ProcessHandle
,
62 PROCESS_VM_READ
| PROCESS_VM_WRITE
| PROCESS_VM_OPERATION
| PROCESS_DUP_HANDLE
,
64 &RequestMsg
->h
.ClientId
);
65 if (!NT_SUCCESS(Status
))
67 TRACE("NtOpenProcess() failed (Status %lx)\n", Status
);
71 /* Allocate the logon context */
72 Context
= RtlAllocateHeap(RtlGetProcessHeap(),
74 sizeof(LSAP_LOGON_CONTEXT
));
77 NtClose(ProcessHandle
);
78 return STATUS_INSUFFICIENT_RESOURCES
;
81 TRACE("New LogonContext: %p\n", Context
);
83 Context
->ClientProcessHandle
= ProcessHandle
;
85 *LogonContext
= Context
;
87 return STATUS_SUCCESS
;
92 LsapHandlePortConnection(PLSA_API_MSG RequestMsg
)
94 PLSAP_LOGON_CONTEXT LogonContext
= NULL
;
95 HANDLE ConnectionHandle
= NULL
;
97 REMOTE_PORT_VIEW RemotePortView
;
100 TRACE("(%p)\n", RequestMsg
);
102 TRACE("Logon Process Name: %s\n", RequestMsg
->ConnectInfo
.LogonProcessNameBuffer
);
104 Status
= LsapCheckLogonProcess(RequestMsg
,
107 RequestMsg
->ConnectInfo
.OperationalMode
= 0x43218765;
109 RequestMsg
->ConnectInfo
.Status
= Status
;
111 if (NT_SUCCESS(Status
))
120 RemotePortView
.Length
= sizeof(REMOTE_PORT_VIEW
);
121 Status
= NtAcceptConnectPort(&ConnectionHandle
,
122 (PVOID
*)LogonContext
,
127 if (!NT_SUCCESS(Status
))
129 ERR("NtAcceptConnectPort failed (Status 0x%lx)\n", Status
);
135 LogonContext
->ConnectionHandle
= ConnectionHandle
;
137 InsertHeadList(&LsapLogonContextList
,
138 &LogonContext
->Entry
);
140 Status
= NtCompleteConnectPort(ConnectionHandle
);
141 if (!NT_SUCCESS(Status
))
143 ERR("NtCompleteConnectPort failed (Status 0x%lx)\n", Status
);
153 AuthPortThreadRoutine(PVOID Param
)
155 PLSAP_LOGON_CONTEXT LogonContext
;
156 PLSA_API_MSG ReplyMsg
= NULL
;
157 LSA_API_MSG RequestMsg
;
160 TRACE("AuthPortThreadRoutine() called\n");
162 Status
= STATUS_SUCCESS
;
166 TRACE("Reply: %p\n", ReplyMsg
);
167 Status
= NtReplyWaitReceivePort(AuthPortHandle
,
168 (PVOID
*)&LogonContext
,
169 (PPORT_MESSAGE
)ReplyMsg
,
170 (PPORT_MESSAGE
)&RequestMsg
);
171 if (!NT_SUCCESS(Status
))
173 TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status
);
177 TRACE("Received message\n");
179 switch (RequestMsg
.h
.u2
.s2
.Type
)
181 case LPC_CONNECTION_REQUEST
:
182 TRACE("Port connection request\n");
183 Status
= LsapHandlePortConnection(&RequestMsg
);
187 case LPC_PORT_CLOSED
:
188 TRACE("Port closed\n");
192 case LPC_CLIENT_DIED
:
193 TRACE("Client died\n");
198 TRACE("Received request (ApiNumber: %lu)\n", RequestMsg
.ApiNumber
);
200 switch (RequestMsg
.ApiNumber
)
202 case LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE
:
203 RequestMsg
.Status
= LsapCallAuthenticationPackage(&RequestMsg
,
205 ReplyMsg
= &RequestMsg
;
208 case LSASS_REQUEST_DEREGISTER_LOGON_PROCESS
:
210 ReplyMsg
= &RequestMsg
;
211 RequestMsg
.Status
= STATUS_SUCCESS
;
212 NtReplyPort(AuthPortHandle
,
215 LsapDeregisterLogonProcess(&RequestMsg
,
221 case LSASS_REQUEST_LOGON_USER
:
222 RequestMsg
.Status
= LsapLogonUser(&RequestMsg
,
224 ReplyMsg
= &RequestMsg
;
227 case LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE
:
228 RequestMsg
.Status
= LsapLookupAuthenticationPackage(&RequestMsg
,
230 ReplyMsg
= &RequestMsg
;
234 RequestMsg
.Status
= STATUS_INVALID_SYSTEM_SERVICE
;
235 ReplyMsg
= &RequestMsg
;
243 return STATUS_SUCCESS
;
248 StartAuthenticationPort(VOID
)
250 OBJECT_ATTRIBUTES ObjectAttributes
;
251 UNICODE_STRING PortName
;
255 /* Initialize the logon context list */
256 InitializeListHead(&LsapLogonContextList
);
258 RtlInitUnicodeString(&PortName
,
259 L
"\\LsaAuthenticationPort");
261 InitializeObjectAttributes(&ObjectAttributes
,
267 Status
= NtCreatePort(&AuthPortHandle
,
269 sizeof(LSA_CONNECTION_INFO
),
271 sizeof(LSA_API_MSG
) * 32);
272 if (!NT_SUCCESS(Status
))
274 TRACE("NtCreatePort() failed (Status %lx)\n", Status
);
278 PortThreadHandle
= CreateThread(NULL
,
280 (LPTHREAD_START_ROUTINE
)AuthPortThreadRoutine
,
286 return STATUS_SUCCESS
;