2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/secur32/lsalpc.c
5 * PURPOSE: LSA LPC port functions
8 /* INCLUDES ******************************************************************/
12 #include <ndk/lpctypes.h>
13 #include <ndk/lpcfuncs.h>
14 #include <ndk/mmfuncs.h>
15 #include <ndk/rtlfuncs.h>
16 #include <ndk/obfuncs.h>
17 #include <psdk/ntsecapi.h>
18 #include <lsass/lsass.h>
20 #include <wine/debug.h>
21 WINE_DEFAULT_DEBUG_CHANNEL(secur32
);
24 /* GLOBALS *******************************************************************/
28 extern HANDLE Secur32Heap
;
31 /* FUNCTIONS *****************************************************************/
41 LsapCloseLsaPort(VOID
)
43 if (LsaPortHandle
!= NULL
)
45 NtClose(LsaPortHandle
);
54 UNICODE_STRING PortName
;
55 SECURITY_QUALITY_OF_SERVICE SecurityQos
;
56 LSA_CONNECTION_INFO ConnectInfo
;
57 ULONG ConnectInfoLength
;
60 TRACE("LsapOpenLsaPort()\n");
62 if (LsaPortHandle
!= NULL
)
63 return STATUS_SUCCESS
;
65 RtlInitUnicodeString(&PortName
,
66 L
"\\LsaAuthenticationPort");
68 SecurityQos
.Length
= sizeof(SecurityQos
);
69 SecurityQos
.ImpersonationLevel
= SecurityIdentification
;
70 SecurityQos
.ContextTrackingMode
= SECURITY_DYNAMIC_TRACKING
;
71 SecurityQos
.EffectiveOnly
= TRUE
;
73 RtlZeroMemory(&ConnectInfo
,
76 ConnectInfo
.CreateContext
= FALSE
;
78 ConnectInfoLength
= sizeof(LSA_CONNECTION_INFO
);
79 Status
= NtConnectPort(&LsaPortHandle
,
87 if (!NT_SUCCESS(Status
))
89 TRACE("NtConnectPort failed (Status 0x%08lx)\n", Status
);
94 if (!NT_SUCCESS(ConnectInfo.Status))
96 DPRINT1("ConnectInfo.Status: 0x%08lx\n", ConnectInfo.Status);
99 return ConnectInfo.Status;
104 /* PUBLIC FUNCTIONS **********************************************************/
112 OUT PHANDLE LsaHandle
)
114 UNICODE_STRING PortName
;
115 SECURITY_QUALITY_OF_SERVICE SecurityQos
;
116 LSA_CONNECTION_INFO ConnectInfo
;
117 ULONG ConnectInfoLength
= sizeof(ConnectInfo
);
118 OBJECT_ATTRIBUTES ObjectAttributes
;
119 UNICODE_STRING EventName
;
123 TRACE("LsaConnectUntrusted(%p)\n", LsaHandle
);
125 // TODO: we may need to impersonate ourselves before, because we are untrusted!
127 /* Wait for the LSA authentication thread */
128 RtlInitUnicodeString(&EventName
,
129 L
"\\SECURITY\\LSA_AUTHENTICATION_INITIALIZED");
130 InitializeObjectAttributes(&ObjectAttributes
,
132 OBJ_CASE_INSENSITIVE
| OBJ_PERMANENT
,
135 Status
= NtOpenEvent(&EventHandle
,
138 if (!NT_SUCCESS(Status
))
140 WARN("NtOpenEvent failed (Status 0x%08lx)\n", Status
);
142 Status
= NtCreateEvent(&EventHandle
,
147 if (!NT_SUCCESS(Status
))
149 WARN("NtCreateEvent failed (Status 0x%08lx)\n", Status
);
154 Status
= NtWaitForSingleObject(EventHandle
,
157 NtClose(EventHandle
);
158 if (!NT_SUCCESS(Status
))
160 ERR("NtWaitForSingleObject failed (Status 0x%08lx)\n", Status
);
164 /* Connect to the authentication port */
165 RtlInitUnicodeString(&PortName
,
166 L
"\\LsaAuthenticationPort");
168 SecurityQos
.Length
= sizeof(SecurityQos
);
169 SecurityQos
.ImpersonationLevel
= SecurityIdentification
;
170 SecurityQos
.ContextTrackingMode
= SECURITY_DYNAMIC_TRACKING
;
171 SecurityQos
.EffectiveOnly
= TRUE
;
173 RtlZeroMemory(&ConnectInfo
,
176 ConnectInfo
.CreateContext
= TRUE
;
178 Status
= NtConnectPort(LsaHandle
,
186 if (!NT_SUCCESS(Status
))
188 ERR("NtConnectPort failed (Status 0x%08lx)\n", Status
);
192 if (!NT_SUCCESS(ConnectInfo
.Status
))
194 ERR("ConnectInfo.Status: 0x%08lx\n", ConnectInfo
.Status
);
197 return ConnectInfo
.Status
;
206 LsaEnumerateLogonSessions(
207 PULONG LogonSessionCount
,
208 PLUID
*LogonSessionList
)
210 LSA_API_MSG ApiMessage
;
213 TRACE("LsaEnumerateLogonSessions(%p %p)\n", LogonSessionCount
, LogonSessionList
);
215 Status
= LsapOpenLsaPort();
216 if (!NT_SUCCESS(Status
))
219 ApiMessage
.ApiNumber
= LSASS_REQUEST_ENUM_LOGON_SESSIONS
;
220 ApiMessage
.h
.u1
.s1
.DataLength
= LSA_PORT_DATA_SIZE(ApiMessage
.EnumLogonSessions
);
221 ApiMessage
.h
.u1
.s1
.TotalLength
= LSA_PORT_MESSAGE_SIZE
;
222 ApiMessage
.h
.u2
.ZeroInit
= 0;
224 Status
= NtRequestWaitReplyPort(LsaPortHandle
,
225 (PPORT_MESSAGE
)&ApiMessage
,
226 (PPORT_MESSAGE
)&ApiMessage
);
227 if (!NT_SUCCESS(Status
))
229 ERR("NtRequestWaitReplyPort() failed (Status 0x%08lx)\n", Status
);
233 if (!NT_SUCCESS(ApiMessage
.Status
))
235 ERR("NtRequestWaitReplyPort() failed (ApiMessage.Status 0x%08lx)\n", ApiMessage
.Status
);
236 return ApiMessage
.Status
;
239 *LogonSessionCount
= ApiMessage
.EnumLogonSessions
.Reply
.LogonSessionCount
;
240 *LogonSessionList
= ApiMessage
.EnumLogonSessions
.Reply
.LogonSessionBuffer
;
251 LsaGetLogonSessionData(
253 PSECURITY_LOGON_SESSION_DATA
*ppLogonSessionData
)
255 LSA_API_MSG ApiMessage
;
256 PSECURITY_LOGON_SESSION_DATA SessionData
;
259 TRACE("LsaGetLogonSessionData(%p %p)\n", LogonId
, ppLogonSessionData
);
261 Status
= LsapOpenLsaPort();
262 if (!NT_SUCCESS(Status
))
265 ApiMessage
.ApiNumber
= LSASS_REQUEST_GET_LOGON_SESSION_DATA
;
266 ApiMessage
.h
.u1
.s1
.DataLength
= LSA_PORT_DATA_SIZE(ApiMessage
.GetLogonSessionData
);
267 ApiMessage
.h
.u1
.s1
.TotalLength
= LSA_PORT_MESSAGE_SIZE
;
268 ApiMessage
.h
.u2
.ZeroInit
= 0;
270 RtlCopyLuid(&ApiMessage
.GetLogonSessionData
.Request
.LogonId
,
273 Status
= NtRequestWaitReplyPort(LsaPortHandle
,
274 (PPORT_MESSAGE
)&ApiMessage
,
275 (PPORT_MESSAGE
)&ApiMessage
);
276 if (!NT_SUCCESS(Status
))
278 ERR("NtRequestWaitReplyPort() failed (Status 0x%08lx)\n", Status
);
282 if (!NT_SUCCESS(ApiMessage
.Status
))
284 ERR("NtRequestWaitReplyPort() failed (ApiMessage.Status 0x%08lx)\n", ApiMessage
.Status
);
285 return ApiMessage
.Status
;
288 SessionData
= ApiMessage
.GetLogonSessionData
.Reply
.SessionDataBuffer
;
290 TRACE("UserName: %p\n", SessionData
->UserName
.Buffer
);
291 if (SessionData
->UserName
.Buffer
!= NULL
)
292 SessionData
->UserName
.Buffer
= (LPWSTR
)((ULONG_PTR
)SessionData
+ (ULONG_PTR
)SessionData
->UserName
.Buffer
);
294 TRACE("LogonDomain: %p\n", SessionData
->LogonDomain
.Buffer
);
295 if (SessionData
->LogonDomain
.Buffer
!= NULL
)
296 SessionData
->LogonDomain
.Buffer
= (LPWSTR
)((ULONG_PTR
)SessionData
+ (ULONG_PTR
)SessionData
->LogonDomain
.Buffer
);
298 TRACE("AuthenticationPackage: %p\n", SessionData
->AuthenticationPackage
.Buffer
);
299 if (SessionData
->AuthenticationPackage
.Buffer
!= NULL
)
300 SessionData
->AuthenticationPackage
.Buffer
= (LPWSTR
)((ULONG_PTR
)SessionData
+ (ULONG_PTR
)SessionData
->AuthenticationPackage
.Buffer
);
302 TRACE("Sid: %p\n", SessionData
->Sid
);
303 if (SessionData
->Sid
!= NULL
)
304 SessionData
->Sid
= (LPWSTR
)((ULONG_PTR
)SessionData
+ (ULONG_PTR
)SessionData
->Sid
);
306 TRACE("LogonServer: %p\n", SessionData
->LogonServer
.Buffer
);
307 if (SessionData
->LogonServer
.Buffer
!= NULL
)
308 SessionData
->LogonServer
.Buffer
= (LPWSTR
)((ULONG_PTR
)SessionData
+ (ULONG_PTR
)SessionData
->LogonServer
.Buffer
);
310 TRACE("DnsDomainName: %p\n", SessionData
->DnsDomainName
.Buffer
);
311 if (SessionData
->DnsDomainName
.Buffer
!= NULL
)
312 SessionData
->DnsDomainName
.Buffer
= (LPWSTR
)((ULONG_PTR
)SessionData
+ (ULONG_PTR
)SessionData
->DnsDomainName
.Buffer
);
314 TRACE("Upn: %p\n", SessionData
->Upn
.Buffer
);
315 if (SessionData
->Upn
.Buffer
!= NULL
)
316 SessionData
->Upn
.Buffer
= (LPWSTR
)((ULONG_PTR
)SessionData
+ (ULONG_PTR
)SessionData
->Upn
.Buffer
);
318 *ppLogonSessionData
= SessionData
;
329 LsaRegisterPolicyChangeNotification(
330 POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass
,
331 HANDLE NotificationEventHandle
)
333 LSA_API_MSG ApiMessage
;
336 TRACE("LsaRegisterPolicyChangeNotification(%lu %p)\n",
337 InformationClass
, NotificationEventHandle
);
339 Status
= LsapOpenLsaPort();
340 if (!NT_SUCCESS(Status
))
343 ApiMessage
.ApiNumber
= LSASS_REQUEST_POLICY_CHANGE_NOTIFY
;
344 ApiMessage
.h
.u1
.s1
.DataLength
= LSA_PORT_DATA_SIZE(ApiMessage
.PolicyChangeNotify
);
345 ApiMessage
.h
.u1
.s1
.TotalLength
= LSA_PORT_MESSAGE_SIZE
;
346 ApiMessage
.h
.u2
.ZeroInit
= 0;
348 ApiMessage
.PolicyChangeNotify
.Request
.InformationClass
= InformationClass
;
349 ApiMessage
.PolicyChangeNotify
.Request
.NotificationEventHandle
= NotificationEventHandle
;
350 ApiMessage
.PolicyChangeNotify
.Request
.Register
= TRUE
;
352 Status
= NtRequestWaitReplyPort(LsaPortHandle
,
353 (PPORT_MESSAGE
)&ApiMessage
,
354 (PPORT_MESSAGE
)&ApiMessage
);
355 if (!NT_SUCCESS(Status
))
357 ERR("NtRequestWaitReplyPort() failed (Status 0x%08lx)\n", Status
);
361 if (!NT_SUCCESS(ApiMessage
.Status
))
363 ERR("NtRequestWaitReplyPort() failed (ApiMessage.Status 0x%08lx)\n", ApiMessage
.Status
);
364 return ApiMessage
.Status
;
376 LsaUnregisterPolicyChangeNotification(
377 POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass
,
378 HANDLE NotificationEventHandle
)
380 LSA_API_MSG ApiMessage
;
383 TRACE("LsaUnregisterPolicyChangeNotification(%lu %p)\n",
384 InformationClass
, NotificationEventHandle
);
386 Status
= LsapOpenLsaPort();
387 if (!NT_SUCCESS(Status
))
390 ApiMessage
.ApiNumber
= LSASS_REQUEST_POLICY_CHANGE_NOTIFY
;
391 ApiMessage
.h
.u1
.s1
.DataLength
= LSA_PORT_DATA_SIZE(ApiMessage
.PolicyChangeNotify
);
392 ApiMessage
.h
.u1
.s1
.TotalLength
= LSA_PORT_MESSAGE_SIZE
;
393 ApiMessage
.h
.u2
.ZeroInit
= 0;
395 ApiMessage
.PolicyChangeNotify
.Request
.InformationClass
= InformationClass
;
396 ApiMessage
.PolicyChangeNotify
.Request
.NotificationEventHandle
= NotificationEventHandle
;
397 ApiMessage
.PolicyChangeNotify
.Request
.Register
= FALSE
;
399 Status
= NtRequestWaitReplyPort(LsaPortHandle
,
400 (PPORT_MESSAGE
)&ApiMessage
,
401 (PPORT_MESSAGE
)&ApiMessage
);
402 if (!NT_SUCCESS(Status
))
404 ERR("NtRequestWaitReplyPort() failed (Status 0x%08lx)\n", Status
);
408 if (!NT_SUCCESS(ApiMessage
.Status
))
410 ERR("NtRequestWaitReplyPort() failed (ApiMessage.Status 0x%08lx)\n", ApiMessage
.Status
);
411 return ApiMessage
.Status
;