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
);
100 LsaClose(IN LSA_HANDLE ObjectHandle
)
104 TRACE("LsaClose(0x%p) called\n", ObjectHandle
);
108 Status
= LsarClose((PLSAPR_HANDLE
)&ObjectHandle
);
110 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
112 Status
= I_RpcMapWin32Status(RpcExceptionCode());
125 LsaDelete(IN LSA_HANDLE ObjectHandle
)
129 TRACE("LsaDelete(0x%p) called\n", ObjectHandle
);
133 Status
= LsarDelete((LSAPR_HANDLE
)ObjectHandle
);
135 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
137 Status
= I_RpcMapWin32Status(RpcExceptionCode());
151 LSA_HANDLE PolicyHandle
,
153 PLSA_UNICODE_STRING UserRights
,
156 FIXME("(%p,%p,%p,0x%08x) stub\n", PolicyHandle
, AccountSid
, UserRights
, CountOfRights
);
157 return STATUS_OBJECT_NAME_NOT_FOUND
;
166 LsaAddPrivilegesToAccount(IN LSA_HANDLE AccountHandle
,
167 IN PPRIVILEGE_SET PrivilegeSet
)
171 TRACE("(%p,%p) stub\n", AccountHandle
, PrivilegeSet
);
175 Status
= LsarAddPrivilegesToAccount((LSAPR_HANDLE
)AccountHandle
,
176 (PLSAPR_PRIVILEGE_SET
)PrivilegeSet
);
178 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
180 Status
= I_RpcMapWin32Status(RpcExceptionCode());
193 LsaCreateAccount(IN LSA_HANDLE PolicyHandle
,
196 OUT PLSA_HANDLE AccountHandle
)
200 TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle
, AccountSid
, Flags
, AccountHandle
);
204 Status
= LsarCreateAccount((LSAPR_HANDLE
)PolicyHandle
,
209 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
211 Status
= I_RpcMapWin32Status(RpcExceptionCode());
224 LsaCreateTrustedDomain(IN LSA_HANDLE PolicyHandle
,
225 IN PLSA_TRUST_INFORMATION TrustedDomainInformation
,
226 IN ACCESS_MASK DesiredAccess
,
227 OUT PLSA_HANDLE TrustedDomainHandle
)
231 TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle
, TrustedDomainInformation
,
232 DesiredAccess
, TrustedDomainHandle
);
236 Status
= LsarCreateTrustedDomain((LSAPR_HANDLE
)PolicyHandle
,
237 (PLSAPR_TRUST_INFORMATION
)TrustedDomainInformation
,
239 (PLSAPR_HANDLE
)TrustedDomainHandle
);
241 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
243 Status
= I_RpcMapWin32Status(RpcExceptionCode());
256 LsaCreateTrustedDomainEx(
257 LSA_HANDLE PolicyHandle
,
258 PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation
,
259 PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation
,
260 ACCESS_MASK DesiredAccess
,
261 PLSA_HANDLE TrustedDomainHandle
)
263 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, TrustedDomainInformation
, AuthenticationInformation
,
264 DesiredAccess
, TrustedDomainHandle
);
265 return STATUS_SUCCESS
;
273 LsaDeleteTrustedDomain(IN LSA_HANDLE PolicyHandle
,
274 IN PSID TrustedDomainSid
)
278 TRACE("(%p,%p)\n", PolicyHandle
, TrustedDomainSid
);
282 Status
= LsarDeleteTrustedDomain((LSAPR_HANDLE
)PolicyHandle
,
285 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
287 Status
= I_RpcMapWin32Status(RpcExceptionCode());
299 LsaEnumerateAccountRights(
300 LSA_HANDLE PolicyHandle
,
302 PLSA_UNICODE_STRING
*UserRights
,
303 PULONG CountOfRights
)
305 LSAPR_USER_RIGHT_SET UserRightsSet
;
308 TRACE("(%p,%p,%p,%p) stub\n", PolicyHandle
, AccountSid
, UserRights
, CountOfRights
);
310 UserRightsSet
.Entries
= 0;
311 UserRightsSet
.UserRights
= NULL
;
315 Status
= LsarEnmuerateAccountRights((LSAPR_HANDLE
)PolicyHandle
,
319 *CountOfRights
= UserRightsSet
.Entries
;
320 *UserRights
= (PUNICODE_STRING
)UserRightsSet
.UserRights
;
322 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
324 Status
= I_RpcMapWin32Status(RpcExceptionCode());
326 if (UserRightsSet
.UserRights
!= NULL
)
328 MIDL_user_free(UserRightsSet
.UserRights
);
341 LsaEnumerateAccountsWithUserRight(
342 LSA_HANDLE PolicyHandle
,
343 OPTIONAL PLSA_UNICODE_STRING UserRights
,
344 PVOID
*EnumerationBuffer
,
345 PULONG CountReturned
)
347 FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle
, UserRights
, EnumerationBuffer
, CountReturned
);
348 return STATUS_NO_MORE_ENTRIES
;
356 LsaEnumerateTrustedDomains(
357 LSA_HANDLE PolicyHandle
,
358 PLSA_ENUMERATION_HANDLE EnumerationContext
,
360 ULONG PreferedMaximumLength
,
361 PULONG CountReturned
)
363 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
,
364 Buffer
, PreferedMaximumLength
, CountReturned
);
366 if (CountReturned
) *CountReturned
= 0;
367 return STATUS_SUCCESS
;
375 LsaEnumerateTrustedDomainsEx(
376 LSA_HANDLE PolicyHandle
,
377 PLSA_ENUMERATION_HANDLE EnumerationContext
,
379 ULONG PreferedMaximumLength
,
380 PULONG CountReturned
)
382 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
, Buffer
,
383 PreferedMaximumLength
, CountReturned
);
384 if (CountReturned
) *CountReturned
= 0;
385 return STATUS_SUCCESS
;
393 LsaFreeMemory(PVOID Buffer
)
395 TRACE("(%p)\n", Buffer
);
396 return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
404 LsaLookupNames(IN LSA_HANDLE PolicyHandle
,
406 IN PLSA_UNICODE_STRING Names
,
407 OUT PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
408 OUT PLSA_TRANSLATED_SID
*Sids
)
410 LSAPR_TRANSLATED_SIDS TranslatedSids
;
411 ULONG MappedCount
= 0;
414 TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle
, Count
, Names
,
415 ReferencedDomains
, Sids
);
419 *ReferencedDomains
= NULL
;
422 TranslatedSids
.Entries
= Count
;
423 TranslatedSids
.Sids
= *Sids
;
425 Status
= LsarLookupNames((LSAPR_HANDLE
)PolicyHandle
,
427 (PRPC_UNICODE_STRING
)Names
,
428 (PLSAPR_REFERENCED_DOMAIN_LIST
*)ReferencedDomains
,
433 *Sids
= (PLSA_TRANSLATED_SID
)TranslatedSids
.Sids
;
435 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
437 if (TranslatedSids
.Sids
!= NULL
)
439 MIDL_user_free(TranslatedSids
.Sids
);
442 Status
= I_RpcMapWin32Status(RpcExceptionCode());
455 LSA_HANDLE PolicyHandle
,
458 PLSA_UNICODE_STRING Names
,
459 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
460 PLSA_TRANSLATED_SID2
*Sids
)
462 FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle
, Flags
,
463 Count
, Names
, ReferencedDomains
, Sids
);
464 if (Names
!= NULL
&& Count
> 0)
466 *ReferencedDomains
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST
));
467 *Sids
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Count
* sizeof(LSA_TRANSLATED_SID2
));
468 return STATUS_SOME_NOT_MAPPED
;
470 return STATUS_NONE_MAPPED
;
478 LsaLookupPrivilegeName(IN LSA_HANDLE PolicyHandle
,
480 OUT PUNICODE_STRING
*Name
)
482 PRPC_UNICODE_STRING NameBuffer
= NULL
;
485 TRACE("(%p,%p,%p)\n", PolicyHandle
, Value
, Name
);
489 Status
= LsarLookupPrivilegeName(PolicyHandle
,
493 *Name
= (PUNICODE_STRING
)NameBuffer
;
495 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
497 if (NameBuffer
!= NULL
)
498 MIDL_user_free(NameBuffer
);
500 Status
= I_RpcMapWin32Status(RpcExceptionCode());
512 LsaLookupPrivilegeValue(IN LSA_HANDLE PolicyHandle
,
513 IN PLSA_UNICODE_STRING Name
,
519 TRACE("(%p,%p,%p)\n", PolicyHandle
, Name
, Value
);
523 Status
= LsarLookupPrivilegeValue(PolicyHandle
,
524 (PRPC_UNICODE_STRING
)Name
,
526 if (Status
== STATUS_SUCCESS
)
529 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
531 Status
= I_RpcMapWin32Status(RpcExceptionCode());
543 LsaLookupSids(IN LSA_HANDLE PolicyHandle
,
546 OUT PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
547 OUT PLSA_TRANSLATED_NAME
*Names
)
549 LSAPR_SID_ENUM_BUFFER SidEnumBuffer
;
550 LSAPR_TRANSLATED_NAMES TranslatedNames
;
551 ULONG MappedCount
= 0;
554 TRACE("(%p,%u,%p,%p,%p)\n", PolicyHandle
, Count
, Sids
,
555 ReferencedDomains
, Names
);
558 return STATUS_INVALID_PARAMETER
;
560 SidEnumBuffer
.Entries
= Count
;
561 SidEnumBuffer
.SidInfo
= (PLSAPR_SID_INFORMATION
)Sids
;
565 *ReferencedDomains
= NULL
;
568 TranslatedNames
.Entries
= 0;
569 TranslatedNames
.Names
= NULL
;
571 Status
= LsarLookupSids((LSAPR_HANDLE
)PolicyHandle
,
573 (PLSAPR_REFERENCED_DOMAIN_LIST
*)ReferencedDomains
,
578 *Names
= (PLSA_TRANSLATED_NAME
)TranslatedNames
.Names
;
580 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
582 if (TranslatedNames
.Names
!= NULL
)
584 MIDL_user_free(TranslatedNames
.Names
);
587 Status
= I_RpcMapWin32Status(RpcExceptionCode());
594 /******************************************************************************
595 * LsaNtStatusToWinError
603 LsaNtStatusToWinError(IN NTSTATUS Status
)
605 TRACE("(%lx)\n", Status
);
606 return RtlNtStatusToDosError(Status
);
615 LsaOpenAccount(IN LSA_HANDLE PolicyHandle
,
618 OUT PLSA_HANDLE AccountHandle
)
622 TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle
, AccountSid
, Flags
, AccountHandle
);
626 Status
= LsarOpenAccount((LSAPR_HANDLE
)PolicyHandle
,
631 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
633 Status
= I_RpcMapWin32Status(RpcExceptionCode());
641 /******************************************************************************
654 LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName
,
655 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes
,
656 IN ACCESS_MASK DesiredAccess
,
657 OUT PLSA_HANDLE PolicyHandle
)
661 TRACE("LsaOpenPolicy (%s,%p,0x%08x,%p)\n",
662 SystemName
? debugstr_w(SystemName
->Buffer
) : "(null)",
663 ObjectAttributes
, DesiredAccess
, PolicyHandle
);
665 /* FIXME: RPC should take care of this */
666 if (!LsapIsLocalComputer(SystemName
))
667 return RPC_NT_SERVER_UNAVAILABLE
;
671 *PolicyHandle
= NULL
;
673 Status
= LsarOpenPolicy(SystemName
? SystemName
->Buffer
: NULL
,
674 (PLSAPR_OBJECT_ATTRIBUTES
)ObjectAttributes
,
678 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
680 Status
= I_RpcMapWin32Status(RpcExceptionCode());
684 TRACE("LsaOpenPolicy() done (Status: 0x%08lx)\n", Status
);
695 LsaOpenTrustedDomainByName(IN LSA_HANDLE PolicyHandle
,
696 IN PLSA_UNICODE_STRING TrustedDomainName
,
697 IN ACCESS_MASK DesiredAccess
,
698 OUT PLSA_HANDLE TrustedDomainHandle
)
702 TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle
, TrustedDomainName
,
703 DesiredAccess
, TrustedDomainHandle
);
707 Status
= LsarOpenTrustedDomainByName((LSAPR_HANDLE
)PolicyHandle
,
708 (PRPC_UNICODE_STRING
)TrustedDomainName
,
710 TrustedDomainHandle
);
712 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
714 Status
= I_RpcMapWin32Status(RpcExceptionCode());
727 LsaQueryDomainInformationPolicy(
728 LSA_HANDLE PolicyHandle
,
729 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
732 FIXME("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
733 return STATUS_NOT_IMPLEMENTED
;
741 LsaQueryForestTrustInformation(
742 LSA_HANDLE PolicyHandle
,
743 PLSA_UNICODE_STRING TrustedDomainName
,
744 PLSA_FOREST_TRUST_INFORMATION
* ForestTrustInfo
)
746 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
);
747 return STATUS_NOT_IMPLEMENTED
;
755 LsaQueryInformationPolicy(IN LSA_HANDLE PolicyHandle
,
756 IN POLICY_INFORMATION_CLASS InformationClass
,
759 PLSAPR_POLICY_INFORMATION PolicyInformation
= NULL
;
762 TRACE("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
766 Status
= LsarQueryInformationPolicy((LSAPR_HANDLE
)PolicyHandle
,
769 *Buffer
= PolicyInformation
;
771 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
773 if (PolicyInformation
!= NULL
)
774 MIDL_user_free(PolicyInformation
);
776 Status
= I_RpcMapWin32Status(RpcExceptionCode());
780 TRACE("Done (Status: 0x%08x)\n", Status
);
790 LsaQueryTrustedDomainInfoByName(
791 LSA_HANDLE PolicyHandle
,
792 PLSA_UNICODE_STRING TrustedDomainName
,
793 TRUSTED_INFORMATION_CLASS InformationClass
,
796 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
797 return STATUS_OBJECT_NAME_NOT_FOUND
;
805 LsaQueryTrustedDomainInfo(
806 LSA_HANDLE PolicyHandle
,
807 PSID TrustedDomainSid
,
808 TRUSTED_INFORMATION_CLASS InformationClass
,
811 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
812 return STATUS_OBJECT_NAME_NOT_FOUND
;
820 LsaRemoveAccountRights(
821 LSA_HANDLE PolicyHandle
,
824 PLSA_UNICODE_STRING UserRights
,
827 FIXME("(%p,%p,%d,%p,0x%08x) stub\n", PolicyHandle
, AccountSid
, AllRights
, UserRights
, CountOfRights
);
828 return STATUS_SUCCESS
;
836 LsaRetrievePrivateData(
837 LSA_HANDLE PolicyHandle
,
838 PLSA_UNICODE_STRING KeyName
,
839 PLSA_UNICODE_STRING
*PrivateData
)
841 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
842 return STATUS_OBJECT_NAME_NOT_FOUND
;
850 LsaSetDomainInformationPolicy(
851 LSA_HANDLE PolicyHandle
,
852 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
855 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
856 return STATUS_UNSUCCESSFUL
;
865 LsaSetInformationPolicy(IN LSA_HANDLE PolicyHandle
,
866 IN POLICY_INFORMATION_CLASS InformationClass
,
871 TRACE("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
875 Status
= LsarSetInformationPolicy((LSAPR_HANDLE
)PolicyHandle
,
877 (PLSAPR_POLICY_INFORMATION
)Buffer
);
879 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
881 Status
= I_RpcMapWin32Status(RpcExceptionCode());
892 NTSTATUS WINAPI
LsaSetSecret(
893 IN LSA_HANDLE SecretHandle
,
894 IN PLSA_UNICODE_STRING EncryptedCurrentValue
,
895 IN PLSA_UNICODE_STRING EncryptedOldValue
)
897 FIXME("(%p,%p,%p) stub\n", SecretHandle
, EncryptedCurrentValue
,
899 return STATUS_SUCCESS
;
907 LsaSetForestTrustInformation(
908 LSA_HANDLE PolicyHandle
,
909 PLSA_UNICODE_STRING TrustedDomainName
,
910 PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo
,
912 PLSA_FOREST_TRUST_COLLISION_INFORMATION
*CollisionInfo
)
914 FIXME("(%p,%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
, CheckOnly
, CollisionInfo
);
915 return STATUS_NOT_IMPLEMENTED
;
923 LsaSetTrustedDomainInfoByName(
924 LSA_HANDLE PolicyHandle
,
925 PLSA_UNICODE_STRING TrustedDomainName
,
926 TRUSTED_INFORMATION_CLASS InformationClass
,
929 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
930 return STATUS_SUCCESS
;
936 NTSTATUS WINAPI
LsaRegisterPolicyChangeNotification(
937 POLICY_NOTIFICATION_INFORMATION_CLASS
class,
940 FIXME("(%d,%p) stub\n", class, event
);
941 return STATUS_UNSUCCESSFUL
;
949 LsaSetTrustedDomainInformation(
950 LSA_HANDLE PolicyHandle
,
951 PSID TrustedDomainSid
,
952 TRUSTED_INFORMATION_CLASS InformationClass
,
955 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
956 return STATUS_SUCCESS
;
965 LSA_HANDLE PolicyHandle
,
966 PLSA_UNICODE_STRING KeyName
,
967 PLSA_UNICODE_STRING PrivateData
)
969 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
970 return STATUS_OBJECT_NAME_NOT_FOUND
;
976 NTSTATUS WINAPI
LsaUnregisterPolicyChangeNotification(
977 POLICY_NOTIFICATION_INFORMATION_CLASS
class,
980 FIXME("(%d,%p) stub\n", class, event
);
981 return STATUS_SUCCESS
;
990 PUNICODE_STRING
*UserName
,
991 PUNICODE_STRING
*DomainName
)
993 FIXME("(%p,%p) stub\n", UserName
, DomainName
);
994 return STATUS_NOT_IMPLEMENTED
;
1002 LsaQueryInfoTrustedDomain (DWORD Unknonw0
,
1006 FIXME("(%d,%d,%d) stub\n", Unknonw0
, Unknonw1
, Unknonw2
);
1007 return STATUS_NOT_IMPLEMENTED
;