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
;
164 LsaCreateAccount(IN LSA_HANDLE PolicyHandle
,
167 IN OUT PLSA_HANDLE AccountHandle
)
171 TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle
, AccountSid
, Flags
, AccountHandle
);
175 Status
= LsarCreateAccount((LSAPR_HANDLE
)PolicyHandle
,
180 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
182 Status
= I_RpcMapWin32Status(RpcExceptionCode());
195 LsaCreateTrustedDomainEx(
196 LSA_HANDLE PolicyHandle
,
197 PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation
,
198 PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation
,
199 ACCESS_MASK DesiredAccess
,
200 PLSA_HANDLE TrustedDomainHandle
)
202 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, TrustedDomainInformation
, AuthenticationInformation
,
203 DesiredAccess
, TrustedDomainHandle
);
204 return STATUS_SUCCESS
;
212 LsaDeleteTrustedDomain(
213 LSA_HANDLE PolicyHandle
,
214 PSID TrustedDomainSid
)
216 FIXME("(%p,%p) stub\n", PolicyHandle
, TrustedDomainSid
);
217 return STATUS_SUCCESS
;
225 LsaEnumerateAccountRights(
226 LSA_HANDLE PolicyHandle
,
228 PLSA_UNICODE_STRING
*UserRights
,
229 PULONG CountOfRights
)
231 LSAPR_USER_RIGHT_SET UserRightsSet
;
234 TRACE("(%p,%p,%p,%p) stub\n", PolicyHandle
, AccountSid
, UserRights
, CountOfRights
);
236 UserRightsSet
.Entries
= 0;
237 UserRightsSet
.UserRights
= NULL
;
241 Status
= LsarEnmuerateAccountRights((LSAPR_HANDLE
)PolicyHandle
,
245 *CountOfRights
= UserRightsSet
.Entries
;
246 *UserRights
= (PUNICODE_STRING
)UserRightsSet
.UserRights
;
248 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
250 Status
= I_RpcMapWin32Status(RpcExceptionCode());
252 if (UserRightsSet
.UserRights
!= NULL
)
254 MIDL_user_free(UserRightsSet
.UserRights
);
267 LsaEnumerateAccountsWithUserRight(
268 LSA_HANDLE PolicyHandle
,
269 OPTIONAL PLSA_UNICODE_STRING UserRights
,
270 PVOID
*EnumerationBuffer
,
271 PULONG CountReturned
)
273 FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle
, UserRights
, EnumerationBuffer
, CountReturned
);
274 return STATUS_NO_MORE_ENTRIES
;
282 LsaEnumerateTrustedDomains(
283 LSA_HANDLE PolicyHandle
,
284 PLSA_ENUMERATION_HANDLE EnumerationContext
,
286 ULONG PreferedMaximumLength
,
287 PULONG CountReturned
)
289 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
,
290 Buffer
, PreferedMaximumLength
, CountReturned
);
292 if (CountReturned
) *CountReturned
= 0;
293 return STATUS_SUCCESS
;
301 LsaEnumerateTrustedDomainsEx(
302 LSA_HANDLE PolicyHandle
,
303 PLSA_ENUMERATION_HANDLE EnumerationContext
,
305 ULONG PreferedMaximumLength
,
306 PULONG CountReturned
)
308 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
, Buffer
,
309 PreferedMaximumLength
, CountReturned
);
310 if (CountReturned
) *CountReturned
= 0;
311 return STATUS_SUCCESS
;
319 LsaFreeMemory(PVOID Buffer
)
321 TRACE("(%p)\n", Buffer
);
322 return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
330 LsaLookupNames(IN LSA_HANDLE PolicyHandle
,
332 IN PLSA_UNICODE_STRING Names
,
333 OUT PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
334 OUT PLSA_TRANSLATED_SID
*Sids
)
336 LSAPR_TRANSLATED_SIDS TranslatedSids
;
337 ULONG MappedCount
= 0;
340 TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle
, Count
, Names
,
341 ReferencedDomains
, Sids
);
345 *ReferencedDomains
= NULL
;
348 TranslatedSids
.Entries
= Count
;
349 TranslatedSids
.Sids
= *Sids
;
351 Status
= LsarLookupNames((LSAPR_HANDLE
)PolicyHandle
,
353 (PRPC_UNICODE_STRING
)Names
,
354 (PLSAPR_REFERENCED_DOMAIN_LIST
*)ReferencedDomains
,
359 *Sids
= (PLSA_TRANSLATED_SID
)TranslatedSids
.Sids
;
361 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
363 if (TranslatedSids
.Sids
!= NULL
)
365 MIDL_user_free(TranslatedSids
.Sids
);
368 Status
= I_RpcMapWin32Status(RpcExceptionCode());
381 LSA_HANDLE PolicyHandle
,
384 PLSA_UNICODE_STRING Names
,
385 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
386 PLSA_TRANSLATED_SID2
*Sids
)
388 FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle
, Flags
,
389 Count
, Names
, ReferencedDomains
, Sids
);
390 if (Names
!= NULL
&& Count
> 0)
392 *ReferencedDomains
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST
));
393 *Sids
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Count
* sizeof(LSA_TRANSLATED_SID2
));
394 return STATUS_SOME_NOT_MAPPED
;
396 return STATUS_NONE_MAPPED
;
404 LsaLookupPrivilegeName(IN LSA_HANDLE PolicyHandle
,
406 OUT PUNICODE_STRING
*Name
)
408 PRPC_UNICODE_STRING NameBuffer
= NULL
;
411 TRACE("(%p,%p,%p)\n", PolicyHandle
, Value
, Name
);
415 Status
= LsarLookupPrivilegeName(PolicyHandle
,
419 *Name
= (PUNICODE_STRING
)NameBuffer
;
421 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
423 if (NameBuffer
!= NULL
)
424 MIDL_user_free(NameBuffer
);
426 Status
= I_RpcMapWin32Status(RpcExceptionCode());
438 LsaLookupPrivilegeValue(IN LSA_HANDLE PolicyHandle
,
439 IN PLSA_UNICODE_STRING Name
,
445 TRACE("(%p,%p,%p)\n", PolicyHandle
, Name
, Value
);
449 Status
= LsarLookupPrivilegeValue(PolicyHandle
,
450 (PRPC_UNICODE_STRING
)Name
,
452 if (Status
== STATUS_SUCCESS
)
455 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
457 Status
= I_RpcMapWin32Status(RpcExceptionCode());
469 LsaLookupSids(IN LSA_HANDLE PolicyHandle
,
472 OUT PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
473 OUT PLSA_TRANSLATED_NAME
*Names
)
475 LSAPR_SID_ENUM_BUFFER SidEnumBuffer
;
476 LSAPR_TRANSLATED_NAMES TranslatedNames
;
477 ULONG MappedCount
= 0;
480 TRACE("(%p,%u,%p,%p,%p)\n", PolicyHandle
, Count
, Sids
,
481 ReferencedDomains
, Names
);
484 return STATUS_INVALID_PARAMETER
;
486 SidEnumBuffer
.Entries
= Count
;
487 SidEnumBuffer
.SidInfo
= (PLSAPR_SID_INFORMATION
)Sids
;
491 *ReferencedDomains
= NULL
;
494 TranslatedNames
.Entries
= 0;
495 TranslatedNames
.Names
= NULL
;
497 Status
= LsarLookupSids((LSAPR_HANDLE
)PolicyHandle
,
499 (PLSAPR_REFERENCED_DOMAIN_LIST
*)ReferencedDomains
,
504 *Names
= (PLSA_TRANSLATED_NAME
)TranslatedNames
.Names
;
506 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
508 if (TranslatedNames
.Names
!= NULL
)
510 MIDL_user_free(TranslatedNames
.Names
);
513 Status
= I_RpcMapWin32Status(RpcExceptionCode());
520 /******************************************************************************
521 * LsaNtStatusToWinError
529 LsaNtStatusToWinError(NTSTATUS Status
)
531 TRACE("(%lx)\n", Status
);
532 return RtlNtStatusToDosError(Status
);
541 LsaOpenAccount(IN LSA_HANDLE PolicyHandle
,
544 IN OUT PLSA_HANDLE AccountHandle
)
548 TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle
, AccountSid
, Flags
, AccountHandle
);
552 Status
= LsarOpenAccount((LSAPR_HANDLE
)PolicyHandle
,
557 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
559 Status
= I_RpcMapWin32Status(RpcExceptionCode());
567 /******************************************************************************
581 IN PLSA_UNICODE_STRING SystemName
,
582 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes
,
583 IN ACCESS_MASK DesiredAccess
,
584 IN OUT PLSA_HANDLE PolicyHandle
)
588 TRACE("LsaOpenPolicy (%s,%p,0x%08x,%p)\n",
589 SystemName
? debugstr_w(SystemName
->Buffer
) : "(null)",
590 ObjectAttributes
, DesiredAccess
, PolicyHandle
);
592 /* FIXME: RPC should take care of this */
593 if (!LsapIsLocalComputer(SystemName
))
594 return RPC_NT_SERVER_UNAVAILABLE
;
598 *PolicyHandle
= NULL
;
600 Status
= LsarOpenPolicy(SystemName
? SystemName
->Buffer
: NULL
,
601 (PLSAPR_OBJECT_ATTRIBUTES
)ObjectAttributes
,
605 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
607 Status
= I_RpcMapWin32Status(RpcExceptionCode());
611 TRACE("LsaOpenPolicy() done (Status: 0x%08lx)\n", Status
);
622 LsaOpenTrustedDomainByName(
623 LSA_HANDLE PolicyHandle
,
624 PLSA_UNICODE_STRING TrustedDomainName
,
625 ACCESS_MASK DesiredAccess
,
626 PLSA_HANDLE TrustedDomainHandle
)
628 FIXME("(%p,%p,0x%08x,%p) stub\n", PolicyHandle
, TrustedDomainName
, DesiredAccess
, TrustedDomainHandle
);
629 return STATUS_OBJECT_NAME_NOT_FOUND
;
637 LsaQueryDomainInformationPolicy(
638 LSA_HANDLE PolicyHandle
,
639 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
642 FIXME("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
643 return STATUS_NOT_IMPLEMENTED
;
651 LsaQueryForestTrustInformation(
652 LSA_HANDLE PolicyHandle
,
653 PLSA_UNICODE_STRING TrustedDomainName
,
654 PLSA_FOREST_TRUST_INFORMATION
* ForestTrustInfo
)
656 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
);
657 return STATUS_NOT_IMPLEMENTED
;
664 LsaQueryInformationPolicy(LSA_HANDLE PolicyHandle
,
665 POLICY_INFORMATION_CLASS InformationClass
,
668 PLSAPR_POLICY_INFORMATION PolicyInformation
= NULL
;
671 TRACE("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
675 Status
= LsarQueryInformationPolicy((LSAPR_HANDLE
)PolicyHandle
,
678 *Buffer
= PolicyInformation
;
680 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
682 if (PolicyInformation
!= NULL
)
683 MIDL_user_free(PolicyInformation
);
685 Status
= I_RpcMapWin32Status(RpcExceptionCode());
689 TRACE("Done (Status: 0x%08x)\n", Status
);
699 LsaQueryTrustedDomainInfoByName(
700 LSA_HANDLE PolicyHandle
,
701 PLSA_UNICODE_STRING TrustedDomainName
,
702 TRUSTED_INFORMATION_CLASS InformationClass
,
705 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
706 return STATUS_OBJECT_NAME_NOT_FOUND
;
714 LsaQueryTrustedDomainInfo(
715 LSA_HANDLE PolicyHandle
,
716 PSID TrustedDomainSid
,
717 TRUSTED_INFORMATION_CLASS InformationClass
,
720 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
721 return STATUS_OBJECT_NAME_NOT_FOUND
;
729 LsaRemoveAccountRights(
730 LSA_HANDLE PolicyHandle
,
733 PLSA_UNICODE_STRING UserRights
,
736 FIXME("(%p,%p,%d,%p,0x%08x) stub\n", PolicyHandle
, AccountSid
, AllRights
, UserRights
, CountOfRights
);
737 return STATUS_SUCCESS
;
745 LsaRetrievePrivateData(
746 LSA_HANDLE PolicyHandle
,
747 PLSA_UNICODE_STRING KeyName
,
748 PLSA_UNICODE_STRING
*PrivateData
)
750 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
751 return STATUS_OBJECT_NAME_NOT_FOUND
;
759 LsaSetDomainInformationPolicy(
760 LSA_HANDLE PolicyHandle
,
761 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
764 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
765 return STATUS_UNSUCCESSFUL
;
774 LsaSetInformationPolicy(IN LSA_HANDLE PolicyHandle
,
775 IN POLICY_INFORMATION_CLASS InformationClass
,
780 TRACE("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
784 Status
= LsarSetInformationPolicy((LSAPR_HANDLE
)PolicyHandle
,
786 (PLSAPR_POLICY_INFORMATION
)Buffer
);
788 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
790 Status
= I_RpcMapWin32Status(RpcExceptionCode());
801 NTSTATUS WINAPI
LsaSetSecret(
802 IN LSA_HANDLE SecretHandle
,
803 IN PLSA_UNICODE_STRING EncryptedCurrentValue
,
804 IN PLSA_UNICODE_STRING EncryptedOldValue
)
806 FIXME("(%p,%p,%p) stub\n", SecretHandle
, EncryptedCurrentValue
,
808 return STATUS_SUCCESS
;
816 LsaSetForestTrustInformation(
817 LSA_HANDLE PolicyHandle
,
818 PLSA_UNICODE_STRING TrustedDomainName
,
819 PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo
,
821 PLSA_FOREST_TRUST_COLLISION_INFORMATION
*CollisionInfo
)
823 FIXME("(%p,%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
, CheckOnly
, CollisionInfo
);
824 return STATUS_NOT_IMPLEMENTED
;
832 LsaSetTrustedDomainInfoByName(
833 LSA_HANDLE PolicyHandle
,
834 PLSA_UNICODE_STRING TrustedDomainName
,
835 TRUSTED_INFORMATION_CLASS InformationClass
,
838 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
839 return STATUS_SUCCESS
;
845 NTSTATUS WINAPI
LsaRegisterPolicyChangeNotification(
846 POLICY_NOTIFICATION_INFORMATION_CLASS
class,
849 FIXME("(%d,%p) stub\n", class, event
);
850 return STATUS_UNSUCCESSFUL
;
858 LsaSetTrustedDomainInformation(
859 LSA_HANDLE PolicyHandle
,
860 PSID TrustedDomainSid
,
861 TRUSTED_INFORMATION_CLASS InformationClass
,
864 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
865 return STATUS_SUCCESS
;
874 LSA_HANDLE PolicyHandle
,
875 PLSA_UNICODE_STRING KeyName
,
876 PLSA_UNICODE_STRING PrivateData
)
878 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
879 return STATUS_OBJECT_NAME_NOT_FOUND
;
885 NTSTATUS WINAPI
LsaUnregisterPolicyChangeNotification(
886 POLICY_NOTIFICATION_INFORMATION_CLASS
class,
889 FIXME("(%d,%p) stub\n", class, event
);
890 return STATUS_SUCCESS
;
899 PUNICODE_STRING
*UserName
,
900 PUNICODE_STRING
*DomainName
)
902 FIXME("(%p,%p) stub\n", UserName
, DomainName
);
903 return STATUS_NOT_IMPLEMENTED
;
911 LsaQueryInfoTrustedDomain (DWORD Unknonw0
,
915 FIXME("(%d,%d,%d) stub\n", Unknonw0
, Unknonw1
, Unknonw2
);
916 return STATUS_NOT_IMPLEMENTED
;