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"
16 WINE_DEFAULT_DEBUG_CHANNEL(advapi
);
18 /* imported from wine 1.1.14 */
19 static void* ADVAPI_GetDomainName(unsigned sz
, unsigned ofs
)
26 static const WCHAR wVNETSUP
[] = {
27 'S','y','s','t','e','m','\\',
28 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
29 'S','e','r','v','i','c','e','s','\\',
30 'V','x','D','\\','V','N','E','T','S','U','P','\0'};
32 ret
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
, wVNETSUP
, 0, KEY_READ
, &key
);
33 if (ret
== ERROR_SUCCESS
)
36 static const WCHAR wg
[] = { 'W','o','r','k','g','r','o','u','p',0 };
38 ret
= RegQueryValueExW(key
, wg
, NULL
, NULL
, NULL
, &size
);
39 if (ret
== ERROR_MORE_DATA
|| ret
== ERROR_SUCCESS
)
41 ptr
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sz
+ size
);
42 if (!ptr
) return NULL
;
43 ustr
= (UNICODE_STRING
*)(ptr
+ ofs
);
44 ustr
->MaximumLength
= size
;
45 ustr
->Buffer
= (WCHAR
*)(ptr
+ sz
);
46 ret
= RegQueryValueExW(key
, wg
, NULL
, NULL
, (LPBYTE
)ustr
->Buffer
, &size
);
47 if (ret
!= ERROR_SUCCESS
)
49 HeapFree(GetProcessHeap(), 0, ptr
);
52 else ustr
->Length
= size
- sizeof(WCHAR
);
58 static const WCHAR wDomain
[] = {'D','O','M','A','I','N','\0'};
59 ptr
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
60 sz
+ sizeof(wDomain
));
61 if (!ptr
) return NULL
;
62 ustr
= (UNICODE_STRING
*)(ptr
+ ofs
);
63 ustr
->MaximumLength
= sizeof(wDomain
);
64 ustr
->Buffer
= (WCHAR
*)(ptr
+ sz
);
65 ustr
->Length
= sizeof(wDomain
) - sizeof(WCHAR
);
66 memcpy(ustr
->Buffer
, wDomain
, sizeof(wDomain
));
72 PLSAPR_SERVER_NAME_bind(PLSAPR_SERVER_NAME pszSystemName
)
74 handle_t hBinding
= NULL
;
75 LPWSTR pszStringBinding
;
78 TRACE("PLSAPR_SERVER_NAME_bind() called\n");
80 status
= RpcStringBindingComposeW(NULL
,
88 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
92 /* Set the binding handle that will be used to bind to the server. */
93 status
= RpcBindingFromStringBindingW(pszStringBinding
,
97 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
100 status
= RpcStringFreeW(&pszStringBinding
);
103 TRACE("RpcStringFree returned 0x%x\n", status
);
111 PLSAPR_SERVER_NAME_unbind(PLSAPR_SERVER_NAME pszSystemName
,
116 TRACE("PLSAPR_SERVER_NAME_unbind() called\n");
118 status
= RpcBindingFree(&hBinding
);
121 TRACE("RpcBindingFree returned 0x%x\n", status
);
130 LsaClose(LSA_HANDLE ObjectHandle
)
134 TRACE("LsaClose(0x%p) called\n", ObjectHandle
);
138 Status
= LsarClose((PLSAPR_HANDLE
)&ObjectHandle
);
140 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
142 Status
= I_RpcMapWin32Status(RpcExceptionCode());
154 LsaDelete(LSA_HANDLE ObjectHandle
)
158 TRACE("LsaDelete(0x%p) called\n", ObjectHandle
);
162 Status
= LsarDelete((LSAPR_HANDLE
)ObjectHandle
);
164 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
166 Status
= I_RpcMapWin32Status(RpcExceptionCode());
180 LSA_HANDLE PolicyHandle
,
182 PLSA_UNICODE_STRING UserRights
,
185 FIXME("(%p,%p,%p,0x%08x) stub\n", PolicyHandle
, AccountSid
, UserRights
, CountOfRights
);
186 return STATUS_OBJECT_NAME_NOT_FOUND
;
194 LsaCreateTrustedDomainEx(
195 LSA_HANDLE PolicyHandle
,
196 PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation
,
197 PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation
,
198 ACCESS_MASK DesiredAccess
,
199 PLSA_HANDLE TrustedDomainHandle
)
201 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, TrustedDomainInformation
, AuthenticationInformation
,
202 DesiredAccess
, TrustedDomainHandle
);
203 return STATUS_NOT_IMPLEMENTED
;
211 LsaDeleteTrustedDomain(
212 LSA_HANDLE PolicyHandle
,
213 PSID TrustedDomainSid
)
215 FIXME("(%p,%p) stub\n", PolicyHandle
, TrustedDomainSid
);
216 return STATUS_SUCCESS
;
224 LsaEnumerateAccountRights(
225 LSA_HANDLE PolicyHandle
,
227 PLSA_UNICODE_STRING
*UserRights
,
228 PULONG CountOfRights
)
230 LSAPR_USER_RIGHT_SET UserRightsSet
;
233 TRACE("(%p,%p,%p,%p) stub\n", PolicyHandle
, AccountSid
, UserRights
, CountOfRights
);
235 UserRightsSet
.Entries
= 0;
236 UserRightsSet
.UserRights
= NULL
;
240 Status
= LsarEnmuerateAccountRights((LSAPR_HANDLE
)PolicyHandle
,
244 *CountOfRights
= UserRightsSet
.Entries
;
245 *UserRights
= (PUNICODE_STRING
)UserRightsSet
.UserRights
;
247 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
249 Status
= I_RpcMapWin32Status(RpcExceptionCode());
251 if (UserRightsSet
.UserRights
!= NULL
)
253 MIDL_user_free(UserRightsSet
.UserRights
);
266 LsaEnumerateAccountsWithUserRight(
267 LSA_HANDLE PolicyHandle
,
268 OPTIONAL PLSA_UNICODE_STRING UserRights
,
269 PVOID
*EnumerationBuffer
,
270 PULONG CountReturned
)
272 FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle
, UserRights
, EnumerationBuffer
, CountReturned
);
273 return STATUS_NO_MORE_ENTRIES
;
281 LsaEnumerateTrustedDomains(
282 LSA_HANDLE PolicyHandle
,
283 PLSA_ENUMERATION_HANDLE EnumerationContext
,
285 ULONG PreferedMaximumLength
,
286 PULONG CountReturned
)
288 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
,
289 Buffer
, PreferedMaximumLength
, CountReturned
);
291 if (CountReturned
) *CountReturned
= 0;
292 return STATUS_SUCCESS
;
300 LsaEnumerateTrustedDomainsEx(
301 LSA_HANDLE PolicyHandle
,
302 PLSA_ENUMERATION_HANDLE EnumerationContext
,
304 ULONG PreferedMaximumLength
,
305 PULONG CountReturned
)
307 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
, Buffer
,
308 PreferedMaximumLength
, CountReturned
);
309 if (CountReturned
) *CountReturned
= 0;
310 return STATUS_SUCCESS
;
318 LsaFreeMemory(PVOID Buffer
)
320 TRACE("(%p)\n", Buffer
);
321 return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
330 LSA_HANDLE PolicyHandle
,
332 PLSA_UNICODE_STRING Names
,
333 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
334 PLSA_TRANSLATED_SID
*Sids
)
336 PLSA_TRANSLATED_SID2 Sids2
;
337 LSA_TRANSLATED_SID
*TranslatedSids
;
341 TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle
, Count
, Names
,
342 ReferencedDomains
, Sids
);
344 /* Call LsaLookupNames2, which supersedes this function */
345 Status
= LsaLookupNames2(PolicyHandle
, Count
, 0, Names
, ReferencedDomains
, &Sids2
);
346 if (!NT_SUCCESS(Status
))
349 /* Translate the returned structure */
350 TranslatedSids
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Count
* sizeof(LSA_TRANSLATED_SID
));
353 LsaFreeMemory(Sids2
);
354 return SCESTATUS_NOT_ENOUGH_RESOURCE
;
356 RtlZeroMemory(Sids
, Count
* sizeof(PLSA_TRANSLATED_SID
));
357 for (i
= 0; i
< Count
; i
++)
359 TranslatedSids
[i
].Use
= Sids2
[i
].Use
;
360 if (Sids2
[i
].Use
!= SidTypeInvalid
&& Sids2
[i
].Use
!= SidTypeUnknown
)
362 TranslatedSids
[i
].DomainIndex
= Sids2
[i
].DomainIndex
;
363 if (Sids2
[i
].Use
!= SidTypeDomain
)
364 TranslatedSids
[i
].RelativeId
= *GetSidSubAuthority(Sids2
[i
].Sid
, 0);
367 LsaFreeMemory(Sids2
);
369 *Sids
= TranslatedSids
;
380 LSA_HANDLE PolicyHandle
,
383 PLSA_UNICODE_STRING Names
,
384 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
385 PLSA_TRANSLATED_SID2
*Sids
)
387 FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle
, Flags
,
388 Count
, Names
, ReferencedDomains
, Sids
);
389 if (Names
!= NULL
&& Count
> 0)
391 *ReferencedDomains
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST
));
392 *Sids
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Count
* sizeof(LSA_TRANSLATED_SID2
));
393 return STATUS_SOME_NOT_MAPPED
;
395 return STATUS_NONE_MAPPED
;
404 LSA_HANDLE PolicyHandle
,
407 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
408 PLSA_TRANSLATED_NAME
*Names
)
410 static const UNICODE_STRING UserName
= RTL_CONSTANT_STRING(L
"Administrator");
411 PLSA_REFERENCED_DOMAIN_LIST LocalDomains
;
412 PLSA_TRANSLATED_NAME LocalNames
;
414 TRACE("(%p,%u,%p,%p,%p) stub\n", PolicyHandle
, Count
, Sids
,
415 ReferencedDomains
, Names
);
417 WARN("LsaLookupSids(): stub. Always returning 'Administrator'\n");
419 return STATUS_NONE_MAPPED
;
420 LocalDomains
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_TRANSLATED_SID
));
422 return SCESTATUS_NOT_ENOUGH_RESOURCE
;
423 LocalNames
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_TRANSLATED_NAME
) + UserName
.MaximumLength
);
426 LsaFreeMemory(LocalDomains
);
427 return SCESTATUS_NOT_ENOUGH_RESOURCE
;
429 LocalDomains
[0].Entries
= 0;
430 LocalDomains
[0].Domains
= NULL
;
431 LocalNames
[0].Use
= SidTypeWellKnownGroup
;
432 LocalNames
[0].Name
.Buffer
= (LPWSTR
)((ULONG_PTR
)(LocalNames
) + sizeof(LSA_TRANSLATED_NAME
));
433 LocalNames
[0].Name
.Length
= UserName
.Length
;
434 LocalNames
[0].Name
.MaximumLength
= UserName
.MaximumLength
;
435 RtlCopyMemory(LocalNames
[0].Name
.Buffer
, UserName
.Buffer
, UserName
.MaximumLength
);
437 *ReferencedDomains
= LocalDomains
;
439 return STATUS_SUCCESS
;
442 /******************************************************************************
443 * LsaNtStatusToWinError
451 LsaNtStatusToWinError(NTSTATUS Status
)
453 TRACE("(%lx)\n", Status
);
454 return RtlNtStatusToDosError(Status
);
457 /******************************************************************************
471 IN PLSA_UNICODE_STRING SystemName
,
472 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes
,
473 IN ACCESS_MASK DesiredAccess
,
474 IN OUT PLSA_HANDLE PolicyHandle
)
478 TRACE("LsaOpenPolicy (%s,%p,0x%08x,%p)\n",
479 SystemName
? debugstr_w(SystemName
->Buffer
) : "(null)",
480 ObjectAttributes
, DesiredAccess
, PolicyHandle
);
484 *PolicyHandle
= NULL
;
486 Status
= LsarOpenPolicy(SystemName
? SystemName
->Buffer
: NULL
,
487 (PLSAPR_OBJECT_ATTRIBUTES
)ObjectAttributes
,
491 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
493 Status
= I_RpcMapWin32Status(RpcExceptionCode());
497 TRACE("LsaOpenPolicy() done (Status: 0x%08lx)\n", Status
);
508 LsaOpenTrustedDomainByName(
509 LSA_HANDLE PolicyHandle
,
510 PLSA_UNICODE_STRING TrustedDomainName
,
511 ACCESS_MASK DesiredAccess
,
512 PLSA_HANDLE TrustedDomainHandle
)
514 FIXME("(%p,%p,0x%08x,%p) stub\n", PolicyHandle
, TrustedDomainName
, DesiredAccess
, TrustedDomainHandle
);
515 return STATUS_OBJECT_NAME_NOT_FOUND
;
523 LsaQueryDomainInformationPolicy(
524 LSA_HANDLE PolicyHandle
,
525 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
528 FIXME("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
529 return STATUS_NOT_IMPLEMENTED
;
537 LsaQueryForestTrustInformation(
538 LSA_HANDLE PolicyHandle
,
539 PLSA_UNICODE_STRING TrustedDomainName
,
540 PLSA_FOREST_TRUST_INFORMATION
* ForestTrustInfo
)
542 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
);
543 return STATUS_NOT_IMPLEMENTED
;
550 LsaQueryInformationPolicy(LSA_HANDLE PolicyHandle
,
551 POLICY_INFORMATION_CLASS InformationClass
,
554 TRACE("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
556 if(!Buffer
) return STATUS_INVALID_PARAMETER
;
557 switch (InformationClass
)
559 case PolicyAuditEventsInformation
: /* 2 */
561 PPOLICY_AUDIT_EVENTS_INFO p
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
562 sizeof(POLICY_AUDIT_EVENTS_INFO
));
563 p
->AuditingMode
= FALSE
; /* no auditing */
567 case PolicyPrimaryDomainInformation
: /* 3 */
569 /* Only the domain name is valid for the local computer.
570 * All other fields are zero.
572 PPOLICY_PRIMARY_DOMAIN_INFO pinfo
;
574 pinfo
= ADVAPI_GetDomainName(sizeof(*pinfo
), offsetof(POLICY_PRIMARY_DOMAIN_INFO
, Name
));
576 TRACE("setting domain to %s\n", debugstr_w(pinfo
->Name
.Buffer
));
580 case PolicyAccountDomainInformation
: /* 5 */
584 POLICY_ACCOUNT_DOMAIN_INFO info
;
587 WCHAR domain
[MAX_COMPUTERNAME_LENGTH
+ 1];
589 SID_IDENTIFIER_AUTHORITY localSidAuthority
= {SECURITY_NT_AUTHORITY
};
591 DWORD dwSize
= MAX_COMPUTERNAME_LENGTH
+ 1;
592 struct di
* xdi
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*xdi
));
594 xdi
->info
.DomainName
.MaximumLength
= dwSize
* sizeof(WCHAR
);
595 xdi
->info
.DomainName
.Buffer
= xdi
->domain
;
596 if (GetComputerNameW(xdi
->info
.DomainName
.Buffer
, &dwSize
))
597 xdi
->info
.DomainName
.Length
= dwSize
* sizeof(WCHAR
);
599 TRACE("setting name to %s\n", debugstr_w(xdi
->info
.DomainName
.Buffer
));
601 xdi
->info
.DomainSid
= &xdi
->sid
;
602 xdi
->sid
.Revision
= SID_REVISION
;
603 xdi
->sid
.SubAuthorityCount
= 1;
604 xdi
->sid
.IdentifierAuthority
= localSidAuthority
;
605 xdi
->sid
.SubAuthority
[0] = SECURITY_LOCAL_SYSTEM_RID
;
610 case PolicyDnsDomainInformation
: /* 12 (0xc) */
612 /* Only the domain name is valid for the local computer.
613 * All other fields are zero.
615 PPOLICY_DNS_DOMAIN_INFO pinfo
;
617 pinfo
= ADVAPI_GetDomainName(sizeof(*pinfo
), offsetof(POLICY_DNS_DOMAIN_INFO
, Name
));
619 TRACE("setting domain to %s\n", debugstr_w(pinfo
->Name
.Buffer
));
624 case PolicyAuditLogInformation
:
625 case PolicyPdAccountInformation
:
626 case PolicyLsaServerRoleInformation
:
627 case PolicyReplicaSourceInformation
:
628 case PolicyDefaultQuotaInformation
:
629 case PolicyModificationInformation
:
630 case PolicyAuditFullSetInformation
:
631 case PolicyAuditFullQueryInformation
:
632 case PolicyEfsInformation
:
634 FIXME("category not implemented\n");
635 return STATUS_UNSUCCESSFUL
;
638 return STATUS_SUCCESS
;
646 LsaQueryTrustedDomainInfoByName(
647 LSA_HANDLE PolicyHandle
,
648 PLSA_UNICODE_STRING TrustedDomainName
,
649 TRUSTED_INFORMATION_CLASS InformationClass
,
652 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
653 return STATUS_OBJECT_NAME_NOT_FOUND
;
661 LsaQueryTrustedDomainInfo(
662 LSA_HANDLE PolicyHandle
,
663 PSID TrustedDomainSid
,
664 TRUSTED_INFORMATION_CLASS InformationClass
,
667 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
668 return STATUS_OBJECT_NAME_NOT_FOUND
;
676 LsaRemoveAccountRights(
677 LSA_HANDLE PolicyHandle
,
680 PLSA_UNICODE_STRING UserRights
,
683 FIXME("(%p,%p,%d,%p,0x%08x) stub\n", PolicyHandle
, AccountSid
, AllRights
, UserRights
, CountOfRights
);
684 return STATUS_SUCCESS
;
692 LsaRetrievePrivateData(
693 LSA_HANDLE PolicyHandle
,
694 PLSA_UNICODE_STRING KeyName
,
695 PLSA_UNICODE_STRING
*PrivateData
)
697 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
698 return STATUS_NOT_IMPLEMENTED
;
706 LsaSetDomainInformationPolicy(
707 LSA_HANDLE PolicyHandle
,
708 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
711 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
712 return STATUS_NOT_IMPLEMENTED
;
720 LsaSetInformationPolicy(
721 LSA_HANDLE PolicyHandle
,
722 POLICY_INFORMATION_CLASS InformationClass
,
725 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
726 return STATUS_UNSUCCESSFUL
;
734 LsaSetForestTrustInformation(
735 LSA_HANDLE PolicyHandle
,
736 PLSA_UNICODE_STRING TrustedDomainName
,
737 PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo
,
739 PLSA_FOREST_TRUST_COLLISION_INFORMATION
*CollisionInfo
)
741 FIXME("(%p,%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
, CheckOnly
, CollisionInfo
);
742 return STATUS_NOT_IMPLEMENTED
;
750 LsaSetTrustedDomainInfoByName(
751 LSA_HANDLE PolicyHandle
,
752 PLSA_UNICODE_STRING TrustedDomainName
,
753 TRUSTED_INFORMATION_CLASS InformationClass
,
756 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
757 return STATUS_SUCCESS
;
765 LsaSetTrustedDomainInformation(
766 LSA_HANDLE PolicyHandle
,
767 PSID TrustedDomainSid
,
768 TRUSTED_INFORMATION_CLASS InformationClass
,
771 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
772 return STATUS_SUCCESS
;
781 LSA_HANDLE PolicyHandle
,
782 PLSA_UNICODE_STRING KeyName
,
783 PLSA_UNICODE_STRING PrivateData
)
785 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
786 return STATUS_OBJECT_NAME_NOT_FOUND
;
795 PUNICODE_STRING
*UserName
,
796 PUNICODE_STRING
*DomainName
)
798 FIXME("(%p,%p) stub\n", UserName
, DomainName
);
799 return STATUS_NOT_IMPLEMENTED
;
807 LsaQueryInfoTrustedDomain (DWORD Unknonw0
,
811 FIXME("(%d,%d,%d) stub\n", Unknonw0
, Unknonw1
, Unknonw2
);
812 return STATUS_NOT_IMPLEMENTED
;