2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/advapi32/sec/lsa.c
5 * PURPOSE: Local security authority functions
6 * PROGRAMMER: Emanuele Aliberti
10 * 20030202 KJK compressed stubs
14 #include "wine/debug.h"
15 #include "wine/unicode.h"
17 WINE_DEFAULT_DEBUG_CHANNEL(advapi
);
20 static BOOL
LsapIsLocalComputer(PLSA_UNICODE_STRING ServerName
)
22 DWORD dwSize
= MAX_COMPUTERNAME_LENGTH
+ 1;
26 if (ServerName
== NULL
|| ServerName
->Length
== 0 || ServerName
->Buffer
== NULL
)
29 buf
= HeapAlloc(GetProcessHeap(), 0, dwSize
* sizeof(WCHAR
));
30 Result
= GetComputerNameW(buf
, &dwSize
);
31 if (Result
&& (ServerName
->Buffer
[0] == '\\') && (ServerName
->Buffer
[1] == '\\'))
33 Result
= Result
&& !lstrcmpW(ServerName
->Buffer
, buf
);
34 HeapFree(GetProcessHeap(), 0, buf
);
41 PLSAPR_SERVER_NAME_bind(PLSAPR_SERVER_NAME pszSystemName
)
43 handle_t hBinding
= NULL
;
44 LPWSTR pszStringBinding
;
47 TRACE("PLSAPR_SERVER_NAME_bind() called\n");
49 status
= RpcStringBindingComposeW(NULL
,
57 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
61 /* Set the binding handle that will be used to bind to the server. */
62 status
= RpcBindingFromStringBindingW(pszStringBinding
,
66 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
69 status
= RpcStringFreeW(&pszStringBinding
);
72 TRACE("RpcStringFree returned 0x%x\n", status
);
80 PLSAPR_SERVER_NAME_unbind(PLSAPR_SERVER_NAME pszSystemName
,
85 TRACE("PLSAPR_SERVER_NAME_unbind() called\n");
87 status
= RpcBindingFree(&hBinding
);
90 TRACE("RpcBindingFree returned 0x%x\n", status
);
99 LsaClose(LSA_HANDLE ObjectHandle
)
103 TRACE("LsaClose(0x%p) called\n", ObjectHandle
);
107 Status
= LsarClose((PLSAPR_HANDLE
)&ObjectHandle
);
109 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
111 Status
= I_RpcMapWin32Status(RpcExceptionCode());
123 LsaDelete(LSA_HANDLE ObjectHandle
)
127 TRACE("LsaDelete(0x%p) called\n", ObjectHandle
);
131 Status
= LsarDelete((LSAPR_HANDLE
)ObjectHandle
);
133 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
135 Status
= I_RpcMapWin32Status(RpcExceptionCode());
149 LSA_HANDLE PolicyHandle
,
151 PLSA_UNICODE_STRING UserRights
,
154 FIXME("(%p,%p,%p,0x%08x) stub\n", PolicyHandle
, AccountSid
, UserRights
, CountOfRights
);
155 return STATUS_OBJECT_NAME_NOT_FOUND
;
163 LsaCreateTrustedDomainEx(
164 LSA_HANDLE PolicyHandle
,
165 PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation
,
166 PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation
,
167 ACCESS_MASK DesiredAccess
,
168 PLSA_HANDLE TrustedDomainHandle
)
170 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, TrustedDomainInformation
, AuthenticationInformation
,
171 DesiredAccess
, TrustedDomainHandle
);
172 return STATUS_SUCCESS
;
180 LsaDeleteTrustedDomain(
181 LSA_HANDLE PolicyHandle
,
182 PSID TrustedDomainSid
)
184 FIXME("(%p,%p) stub\n", PolicyHandle
, TrustedDomainSid
);
185 return STATUS_SUCCESS
;
193 LsaEnumerateAccountRights(
194 LSA_HANDLE PolicyHandle
,
196 PLSA_UNICODE_STRING
*UserRights
,
197 PULONG CountOfRights
)
199 LSAPR_USER_RIGHT_SET UserRightsSet
;
202 TRACE("(%p,%p,%p,%p) stub\n", PolicyHandle
, AccountSid
, UserRights
, CountOfRights
);
204 UserRightsSet
.Entries
= 0;
205 UserRightsSet
.UserRights
= NULL
;
209 Status
= LsarEnmuerateAccountRights((LSAPR_HANDLE
)PolicyHandle
,
213 *CountOfRights
= UserRightsSet
.Entries
;
214 *UserRights
= (PUNICODE_STRING
)UserRightsSet
.UserRights
;
216 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
218 Status
= I_RpcMapWin32Status(RpcExceptionCode());
220 if (UserRightsSet
.UserRights
!= NULL
)
222 MIDL_user_free(UserRightsSet
.UserRights
);
235 LsaEnumerateAccountsWithUserRight(
236 LSA_HANDLE PolicyHandle
,
237 OPTIONAL PLSA_UNICODE_STRING UserRights
,
238 PVOID
*EnumerationBuffer
,
239 PULONG CountReturned
)
241 FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle
, UserRights
, EnumerationBuffer
, CountReturned
);
242 return STATUS_NO_MORE_ENTRIES
;
250 LsaEnumerateTrustedDomains(
251 LSA_HANDLE PolicyHandle
,
252 PLSA_ENUMERATION_HANDLE EnumerationContext
,
254 ULONG PreferedMaximumLength
,
255 PULONG CountReturned
)
257 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
,
258 Buffer
, PreferedMaximumLength
, CountReturned
);
260 if (CountReturned
) *CountReturned
= 0;
261 return STATUS_SUCCESS
;
269 LsaEnumerateTrustedDomainsEx(
270 LSA_HANDLE PolicyHandle
,
271 PLSA_ENUMERATION_HANDLE EnumerationContext
,
273 ULONG PreferedMaximumLength
,
274 PULONG CountReturned
)
276 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
, Buffer
,
277 PreferedMaximumLength
, CountReturned
);
278 if (CountReturned
) *CountReturned
= 0;
279 return STATUS_SUCCESS
;
287 LsaFreeMemory(PVOID Buffer
)
289 TRACE("(%p)\n", Buffer
);
290 return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
298 LsaLookupNames(IN LSA_HANDLE PolicyHandle
,
300 IN PLSA_UNICODE_STRING Names
,
301 OUT PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
302 OUT PLSA_TRANSLATED_SID
*Sids
)
304 LSAPR_TRANSLATED_SIDS TranslatedSids
;
305 ULONG MappedCount
= 0;
308 TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle
, Count
, Names
,
309 ReferencedDomains
, Sids
);
313 *ReferencedDomains
= NULL
;
316 TranslatedSids
.Entries
= Count
;
317 TranslatedSids
.Sids
= *Sids
;
319 Status
= LsarLookupNames((LSAPR_HANDLE
)PolicyHandle
,
321 (PRPC_UNICODE_STRING
)Names
,
322 (PLSAPR_REFERENCED_DOMAIN_LIST
*)ReferencedDomains
,
327 *Sids
= (PLSA_TRANSLATED_SID
)TranslatedSids
.Sids
;
329 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
331 if (TranslatedSids
.Sids
!= NULL
)
333 MIDL_user_free(TranslatedSids
.Sids
);
336 Status
= I_RpcMapWin32Status(RpcExceptionCode());
349 LSA_HANDLE PolicyHandle
,
352 PLSA_UNICODE_STRING Names
,
353 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
354 PLSA_TRANSLATED_SID2
*Sids
)
356 FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle
, Flags
,
357 Count
, Names
, ReferencedDomains
, Sids
);
358 if (Names
!= NULL
&& Count
> 0)
360 *ReferencedDomains
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST
));
361 *Sids
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Count
* sizeof(LSA_TRANSLATED_SID2
));
362 return STATUS_SOME_NOT_MAPPED
;
364 return STATUS_NONE_MAPPED
;
372 LsaLookupPrivilegeName(IN LSA_HANDLE PolicyHandle
,
374 OUT PUNICODE_STRING
*Name
)
376 PRPC_UNICODE_STRING NameBuffer
= NULL
;
379 TRACE("(%p,%p,%p)\n", PolicyHandle
, Value
, Name
);
383 Status
= LsarLookupPrivilegeName(PolicyHandle
,
387 *Name
= (PUNICODE_STRING
)NameBuffer
;
389 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
391 if (NameBuffer
!= NULL
)
392 MIDL_user_free(NameBuffer
);
394 Status
= I_RpcMapWin32Status(RpcExceptionCode());
406 LsaLookupPrivilegeValue(IN LSA_HANDLE PolicyHandle
,
407 IN PLSA_UNICODE_STRING Name
,
413 TRACE("(%p,%p,%p)\n", PolicyHandle
, Name
, Value
);
417 Status
= LsarLookupPrivilegeValue(PolicyHandle
,
418 (PRPC_UNICODE_STRING
)Name
,
420 if (Status
== STATUS_SUCCESS
)
423 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
425 Status
= I_RpcMapWin32Status(RpcExceptionCode());
437 LsaLookupSids(IN LSA_HANDLE PolicyHandle
,
440 OUT PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
441 OUT PLSA_TRANSLATED_NAME
*Names
)
443 LSAPR_SID_ENUM_BUFFER SidEnumBuffer
;
444 LSAPR_TRANSLATED_NAMES TranslatedNames
;
445 ULONG MappedCount
= 0;
448 TRACE("(%p,%u,%p,%p,%p)\n", PolicyHandle
, Count
, Sids
,
449 ReferencedDomains
, Names
);
452 return STATUS_INVALID_PARAMETER
;
454 SidEnumBuffer
.Entries
= Count
;
455 SidEnumBuffer
.SidInfo
= (PLSAPR_SID_INFORMATION
)Sids
;
459 *ReferencedDomains
= NULL
;
462 TranslatedNames
.Entries
= 0;
463 TranslatedNames
.Names
= NULL
;
465 Status
= LsarLookupSids((LSAPR_HANDLE
)PolicyHandle
,
467 (PLSAPR_REFERENCED_DOMAIN_LIST
*)ReferencedDomains
,
472 *Names
= (PLSA_TRANSLATED_NAME
)TranslatedNames
.Names
;
474 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
476 if (TranslatedNames
.Names
!= NULL
)
478 MIDL_user_free(TranslatedNames
.Names
);
481 Status
= I_RpcMapWin32Status(RpcExceptionCode());
488 /******************************************************************************
489 * LsaNtStatusToWinError
497 LsaNtStatusToWinError(NTSTATUS Status
)
499 TRACE("(%lx)\n", Status
);
500 return RtlNtStatusToDosError(Status
);
503 /******************************************************************************
517 IN PLSA_UNICODE_STRING SystemName
,
518 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes
,
519 IN ACCESS_MASK DesiredAccess
,
520 IN OUT PLSA_HANDLE PolicyHandle
)
524 TRACE("LsaOpenPolicy (%s,%p,0x%08x,%p)\n",
525 SystemName
? debugstr_w(SystemName
->Buffer
) : "(null)",
526 ObjectAttributes
, DesiredAccess
, PolicyHandle
);
528 /* FIXME: RPC should take care of this */
529 if (!LsapIsLocalComputer(SystemName
))
530 return RPC_NT_SERVER_UNAVAILABLE
;
534 *PolicyHandle
= NULL
;
536 Status
= LsarOpenPolicy(SystemName
? SystemName
->Buffer
: NULL
,
537 (PLSAPR_OBJECT_ATTRIBUTES
)ObjectAttributes
,
541 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
543 Status
= I_RpcMapWin32Status(RpcExceptionCode());
547 TRACE("LsaOpenPolicy() done (Status: 0x%08lx)\n", Status
);
558 LsaOpenTrustedDomainByName(
559 LSA_HANDLE PolicyHandle
,
560 PLSA_UNICODE_STRING TrustedDomainName
,
561 ACCESS_MASK DesiredAccess
,
562 PLSA_HANDLE TrustedDomainHandle
)
564 FIXME("(%p,%p,0x%08x,%p) stub\n", PolicyHandle
, TrustedDomainName
, DesiredAccess
, TrustedDomainHandle
);
565 return STATUS_OBJECT_NAME_NOT_FOUND
;
573 LsaQueryDomainInformationPolicy(
574 LSA_HANDLE PolicyHandle
,
575 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
578 FIXME("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
579 return STATUS_NOT_IMPLEMENTED
;
587 LsaQueryForestTrustInformation(
588 LSA_HANDLE PolicyHandle
,
589 PLSA_UNICODE_STRING TrustedDomainName
,
590 PLSA_FOREST_TRUST_INFORMATION
* ForestTrustInfo
)
592 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
);
593 return STATUS_NOT_IMPLEMENTED
;
600 LsaQueryInformationPolicy(LSA_HANDLE PolicyHandle
,
601 POLICY_INFORMATION_CLASS InformationClass
,
604 PLSAPR_POLICY_INFORMATION PolicyInformation
= NULL
;
607 TRACE("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
611 Status
= LsarQueryInformationPolicy((LSAPR_HANDLE
)PolicyHandle
,
614 *Buffer
= PolicyInformation
;
616 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
618 if (PolicyInformation
!= NULL
)
619 MIDL_user_free(PolicyInformation
);
621 Status
= I_RpcMapWin32Status(RpcExceptionCode());
625 TRACE("Done (Status: 0x%08x)\n", Status
);
635 LsaQueryTrustedDomainInfoByName(
636 LSA_HANDLE PolicyHandle
,
637 PLSA_UNICODE_STRING TrustedDomainName
,
638 TRUSTED_INFORMATION_CLASS InformationClass
,
641 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
642 return STATUS_OBJECT_NAME_NOT_FOUND
;
650 LsaQueryTrustedDomainInfo(
651 LSA_HANDLE PolicyHandle
,
652 PSID TrustedDomainSid
,
653 TRUSTED_INFORMATION_CLASS InformationClass
,
656 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
657 return STATUS_OBJECT_NAME_NOT_FOUND
;
665 LsaRemoveAccountRights(
666 LSA_HANDLE PolicyHandle
,
669 PLSA_UNICODE_STRING UserRights
,
672 FIXME("(%p,%p,%d,%p,0x%08x) stub\n", PolicyHandle
, AccountSid
, AllRights
, UserRights
, CountOfRights
);
673 return STATUS_SUCCESS
;
681 LsaRetrievePrivateData(
682 LSA_HANDLE PolicyHandle
,
683 PLSA_UNICODE_STRING KeyName
,
684 PLSA_UNICODE_STRING
*PrivateData
)
686 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
687 return STATUS_OBJECT_NAME_NOT_FOUND
;
695 LsaSetDomainInformationPolicy(
696 LSA_HANDLE PolicyHandle
,
697 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
700 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
701 return STATUS_UNSUCCESSFUL
;
709 LsaSetInformationPolicy(
710 LSA_HANDLE PolicyHandle
,
711 POLICY_INFORMATION_CLASS InformationClass
,
714 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
715 return STATUS_UNSUCCESSFUL
;
721 NTSTATUS WINAPI
LsaSetSecret(
722 IN LSA_HANDLE SecretHandle
,
723 IN PLSA_UNICODE_STRING EncryptedCurrentValue
,
724 IN PLSA_UNICODE_STRING EncryptedOldValue
)
726 FIXME("(%p,%p,%p) stub\n", SecretHandle
, EncryptedCurrentValue
,
728 return STATUS_SUCCESS
;
736 LsaSetForestTrustInformation(
737 LSA_HANDLE PolicyHandle
,
738 PLSA_UNICODE_STRING TrustedDomainName
,
739 PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo
,
741 PLSA_FOREST_TRUST_COLLISION_INFORMATION
*CollisionInfo
)
743 FIXME("(%p,%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
, CheckOnly
, CollisionInfo
);
744 return STATUS_NOT_IMPLEMENTED
;
752 LsaSetTrustedDomainInfoByName(
753 LSA_HANDLE PolicyHandle
,
754 PLSA_UNICODE_STRING TrustedDomainName
,
755 TRUSTED_INFORMATION_CLASS InformationClass
,
758 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
759 return STATUS_SUCCESS
;
765 NTSTATUS WINAPI
LsaRegisterPolicyChangeNotification(
766 POLICY_NOTIFICATION_INFORMATION_CLASS
class,
769 FIXME("(%d,%p) stub\n", class, event
);
770 return STATUS_UNSUCCESSFUL
;
778 LsaSetTrustedDomainInformation(
779 LSA_HANDLE PolicyHandle
,
780 PSID TrustedDomainSid
,
781 TRUSTED_INFORMATION_CLASS InformationClass
,
784 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
785 return STATUS_SUCCESS
;
794 LSA_HANDLE PolicyHandle
,
795 PLSA_UNICODE_STRING KeyName
,
796 PLSA_UNICODE_STRING PrivateData
)
798 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
799 return STATUS_OBJECT_NAME_NOT_FOUND
;
805 NTSTATUS WINAPI
LsaUnregisterPolicyChangeNotification(
806 POLICY_NOTIFICATION_INFORMATION_CLASS
class,
809 FIXME("(%d,%p) stub\n", class, event
);
810 return STATUS_SUCCESS
;
819 PUNICODE_STRING
*UserName
,
820 PUNICODE_STRING
*DomainName
)
822 FIXME("(%p,%p) stub\n", UserName
, DomainName
);
823 return STATUS_NOT_IMPLEMENTED
;
831 LsaQueryInfoTrustedDomain (DWORD Unknonw0
,
835 FIXME("(%d,%d,%d) stub\n", Unknonw0
, Unknonw1
, Unknonw2
);
836 return STATUS_NOT_IMPLEMENTED
;