2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/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 FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle
, AccountSid
, UserRights
, CountOfRights
);
233 return STATUS_OBJECT_NAME_NOT_FOUND
;
241 LsaEnumerateAccountsWithUserRight(
242 LSA_HANDLE PolicyHandle
,
243 OPTIONAL PLSA_UNICODE_STRING UserRights
,
244 PVOID
*EnumerationBuffer
,
245 PULONG CountReturned
)
247 FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle
, UserRights
, EnumerationBuffer
, CountReturned
);
248 return STATUS_NO_MORE_ENTRIES
;
256 LsaEnumerateTrustedDomains(
257 LSA_HANDLE PolicyHandle
,
258 PLSA_ENUMERATION_HANDLE EnumerationContext
,
260 ULONG PreferedMaximumLength
,
261 PULONG CountReturned
)
263 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
,
264 Buffer
, PreferedMaximumLength
, CountReturned
);
266 if (CountReturned
) *CountReturned
= 0;
267 return STATUS_SUCCESS
;
275 LsaEnumerateTrustedDomainsEx(
276 LSA_HANDLE PolicyHandle
,
277 PLSA_ENUMERATION_HANDLE EnumerationContext
,
279 ULONG PreferedMaximumLength
,
280 PULONG CountReturned
)
282 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
, Buffer
,
283 PreferedMaximumLength
, CountReturned
);
284 if (CountReturned
) *CountReturned
= 0;
285 return STATUS_SUCCESS
;
292 LsaFreeMemory(PVOID Buffer
)
294 TRACE("(%p)\n", Buffer
);
295 return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
304 LSA_HANDLE PolicyHandle
,
306 PLSA_UNICODE_STRING Names
,
307 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
308 PLSA_TRANSLATED_SID
*Sids
)
310 PLSA_TRANSLATED_SID2 Sids2
;
311 LSA_TRANSLATED_SID
*TranslatedSids
;
315 TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle
, Count
, Names
,
316 ReferencedDomains
, Sids
);
318 /* Call LsaLookupNames2, which supersedes this function */
319 Status
= LsaLookupNames2(PolicyHandle
, Count
, 0, Names
, ReferencedDomains
, &Sids2
);
320 if (!NT_SUCCESS(Status
))
323 /* Translate the returned structure */
324 TranslatedSids
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Count
* sizeof(LSA_TRANSLATED_SID
));
327 LsaFreeMemory(Sids2
);
328 return SCESTATUS_NOT_ENOUGH_RESOURCE
;
330 RtlZeroMemory(Sids
, Count
* sizeof(PLSA_TRANSLATED_SID
));
331 for (i
= 0; i
< Count
; i
++)
333 TranslatedSids
[i
].Use
= Sids2
[i
].Use
;
334 if (Sids2
[i
].Use
!= SidTypeInvalid
&& Sids2
[i
].Use
!= SidTypeUnknown
)
336 TranslatedSids
[i
].DomainIndex
= Sids2
[i
].DomainIndex
;
337 if (Sids2
[i
].Use
!= SidTypeDomain
)
338 TranslatedSids
[i
].RelativeId
= *GetSidSubAuthority(Sids2
[i
].Sid
, 0);
341 LsaFreeMemory(Sids2
);
343 *Sids
= TranslatedSids
;
354 LSA_HANDLE PolicyHandle
,
357 PLSA_UNICODE_STRING Names
,
358 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
359 PLSA_TRANSLATED_SID2
*Sids
)
361 FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle
, Flags
,
362 Count
, Names
, ReferencedDomains
, Sids
);
363 return STATUS_NONE_MAPPED
;
372 LSA_HANDLE PolicyHandle
,
375 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
376 PLSA_TRANSLATED_NAME
*Names
)
378 static const UNICODE_STRING UserName
= RTL_CONSTANT_STRING(L
"Administrator");
379 PLSA_REFERENCED_DOMAIN_LIST LocalDomains
;
380 PLSA_TRANSLATED_NAME LocalNames
;
382 TRACE("(%p,%u,%p,%p,%p) stub\n", PolicyHandle
, Count
, Sids
,
383 ReferencedDomains
, Names
);
385 WARN("LsaLookupSids(): stub. Always returning 'Administrator'\n");
387 return STATUS_NONE_MAPPED
;
388 LocalDomains
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_TRANSLATED_SID
));
390 return SCESTATUS_NOT_ENOUGH_RESOURCE
;
391 LocalNames
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_TRANSLATED_NAME
) + UserName
.MaximumLength
);
394 LsaFreeMemory(LocalDomains
);
395 return SCESTATUS_NOT_ENOUGH_RESOURCE
;
397 LocalDomains
[0].Entries
= 0;
398 LocalDomains
[0].Domains
= NULL
;
399 LocalNames
[0].Use
= SidTypeWellKnownGroup
;
400 LocalNames
[0].Name
.Buffer
= (LPWSTR
)((ULONG_PTR
)(LocalNames
) + sizeof(LSA_TRANSLATED_NAME
));
401 LocalNames
[0].Name
.Length
= UserName
.Length
;
402 LocalNames
[0].Name
.MaximumLength
= UserName
.MaximumLength
;
403 RtlCopyMemory(LocalNames
[0].Name
.Buffer
, UserName
.Buffer
, UserName
.MaximumLength
);
405 *ReferencedDomains
= LocalDomains
;
407 return STATUS_SUCCESS
;
410 /******************************************************************************
411 * LsaNtStatusToWinError
419 LsaNtStatusToWinError(NTSTATUS Status
)
421 TRACE("(%lx)\n", Status
);
422 return RtlNtStatusToDosError(Status
);
425 /******************************************************************************
439 IN PLSA_UNICODE_STRING SystemName
,
440 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes
,
441 IN ACCESS_MASK DesiredAccess
,
442 IN OUT PLSA_HANDLE PolicyHandle
)
446 TRACE("LsaOpenPolicy (%s,%p,0x%08x,%p)\n",
447 SystemName
? debugstr_w(SystemName
->Buffer
) : "(null)",
448 ObjectAttributes
, DesiredAccess
, PolicyHandle
);
452 *PolicyHandle
= NULL
;
454 Status
= LsarOpenPolicy(SystemName
? SystemName
->Buffer
: NULL
,
455 (PLSAPR_OBJECT_ATTRIBUTES
)ObjectAttributes
,
459 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
461 Status
= I_RpcMapWin32Status(RpcExceptionCode());
465 TRACE("LsaOpenPolicy() done (Status: 0x%08lx)\n", Status
);
476 LsaOpenTrustedDomainByName(
477 LSA_HANDLE PolicyHandle
,
478 PLSA_UNICODE_STRING TrustedDomainName
,
479 ACCESS_MASK DesiredAccess
,
480 PLSA_HANDLE TrustedDomainHandle
)
482 FIXME("(%p,%p,0x%08x,%p) stub\n", PolicyHandle
, TrustedDomainName
, DesiredAccess
, TrustedDomainHandle
);
483 return STATUS_OBJECT_NAME_NOT_FOUND
;
491 LsaQueryDomainInformationPolicy(
492 LSA_HANDLE PolicyHandle
,
493 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
496 FIXME("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
497 return STATUS_NOT_IMPLEMENTED
;
505 LsaQueryForestTrustInformation(
506 LSA_HANDLE PolicyHandle
,
507 PLSA_UNICODE_STRING TrustedDomainName
,
508 PLSA_FOREST_TRUST_INFORMATION
* ForestTrustInfo
)
510 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
);
511 return STATUS_NOT_IMPLEMENTED
;
518 LsaQueryInformationPolicy(LSA_HANDLE PolicyHandle
,
519 POLICY_INFORMATION_CLASS InformationClass
,
522 TRACE("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
524 if(!Buffer
) return STATUS_INVALID_PARAMETER
;
525 switch (InformationClass
)
527 case PolicyAuditEventsInformation
: /* 2 */
529 PPOLICY_AUDIT_EVENTS_INFO p
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
530 sizeof(POLICY_AUDIT_EVENTS_INFO
));
531 p
->AuditingMode
= FALSE
; /* no auditing */
535 case PolicyPrimaryDomainInformation
: /* 3 */
537 /* Only the domain name is valid for the local computer.
538 * All other fields are zero.
540 PPOLICY_PRIMARY_DOMAIN_INFO pinfo
;
542 pinfo
= ADVAPI_GetDomainName(sizeof(*pinfo
), offsetof(POLICY_PRIMARY_DOMAIN_INFO
, Name
));
544 TRACE("setting domain to %s\n", debugstr_w(pinfo
->Name
.Buffer
));
548 case PolicyAccountDomainInformation
: /* 5 */
552 POLICY_ACCOUNT_DOMAIN_INFO info
;
555 WCHAR domain
[MAX_COMPUTERNAME_LENGTH
+ 1];
557 SID_IDENTIFIER_AUTHORITY localSidAuthority
= {SECURITY_NT_AUTHORITY
};
559 DWORD dwSize
= MAX_COMPUTERNAME_LENGTH
+ 1;
560 struct di
* xdi
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*xdi
));
562 xdi
->info
.DomainName
.MaximumLength
= dwSize
* sizeof(WCHAR
);
563 xdi
->info
.DomainName
.Buffer
= xdi
->domain
;
564 if (GetComputerNameW(xdi
->info
.DomainName
.Buffer
, &dwSize
))
565 xdi
->info
.DomainName
.Length
= dwSize
* sizeof(WCHAR
);
567 TRACE("setting name to %s\n", debugstr_w(xdi
->info
.DomainName
.Buffer
));
569 xdi
->info
.DomainSid
= &xdi
->sid
;
570 xdi
->sid
.Revision
= SID_REVISION
;
571 xdi
->sid
.SubAuthorityCount
= 1;
572 xdi
->sid
.IdentifierAuthority
= localSidAuthority
;
573 xdi
->sid
.SubAuthority
[0] = SECURITY_LOCAL_SYSTEM_RID
;
578 case PolicyDnsDomainInformation
: /* 12 (0xc) */
580 /* Only the domain name is valid for the local computer.
581 * All other fields are zero.
583 PPOLICY_DNS_DOMAIN_INFO pinfo
;
585 pinfo
= ADVAPI_GetDomainName(sizeof(*pinfo
), offsetof(POLICY_DNS_DOMAIN_INFO
, Name
));
587 TRACE("setting domain to %s\n", debugstr_w(pinfo
->Name
.Buffer
));
592 case PolicyAuditLogInformation
:
593 case PolicyPdAccountInformation
:
594 case PolicyLsaServerRoleInformation
:
595 case PolicyReplicaSourceInformation
:
596 case PolicyDefaultQuotaInformation
:
597 case PolicyModificationInformation
:
598 case PolicyAuditFullSetInformation
:
599 case PolicyAuditFullQueryInformation
:
600 case PolicyEfsInformation
:
602 FIXME("category not implemented\n");
603 return STATUS_UNSUCCESSFUL
;
606 return STATUS_SUCCESS
;
614 LsaQueryTrustedDomainInfoByName(
615 LSA_HANDLE PolicyHandle
,
616 PLSA_UNICODE_STRING TrustedDomainName
,
617 TRUSTED_INFORMATION_CLASS InformationClass
,
620 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
621 return STATUS_OBJECT_NAME_NOT_FOUND
;
629 LsaQueryTrustedDomainInfo(
630 LSA_HANDLE PolicyHandle
,
631 PSID TrustedDomainSid
,
632 TRUSTED_INFORMATION_CLASS InformationClass
,
635 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
636 return STATUS_OBJECT_NAME_NOT_FOUND
;
644 LsaRemoveAccountRights(
645 LSA_HANDLE PolicyHandle
,
648 PLSA_UNICODE_STRING UserRights
,
651 FIXME("(%p,%p,%d,%p,0x%08x) stub\n", PolicyHandle
, AccountSid
, AllRights
, UserRights
, CountOfRights
);
652 return STATUS_SUCCESS
;
660 LsaRetrievePrivateData(
661 LSA_HANDLE PolicyHandle
,
662 PLSA_UNICODE_STRING KeyName
,
663 PLSA_UNICODE_STRING
*PrivateData
)
665 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
666 return STATUS_NOT_IMPLEMENTED
;
674 LsaSetDomainInformationPolicy(
675 LSA_HANDLE PolicyHandle
,
676 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
679 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
680 return STATUS_NOT_IMPLEMENTED
;
688 LsaSetInformationPolicy(
689 LSA_HANDLE PolicyHandle
,
690 POLICY_INFORMATION_CLASS InformationClass
,
693 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
694 return STATUS_UNSUCCESSFUL
;
702 LsaSetForestTrustInformation(
703 LSA_HANDLE PolicyHandle
,
704 PLSA_UNICODE_STRING TrustedDomainName
,
705 PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo
,
707 PLSA_FOREST_TRUST_COLLISION_INFORMATION
*CollisionInfo
)
709 FIXME("(%p,%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
, CheckOnly
, CollisionInfo
);
710 return STATUS_NOT_IMPLEMENTED
;
718 LsaSetTrustedDomainInfoByName(
719 LSA_HANDLE PolicyHandle
,
720 PLSA_UNICODE_STRING TrustedDomainName
,
721 TRUSTED_INFORMATION_CLASS InformationClass
,
724 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
725 return STATUS_SUCCESS
;
733 LsaSetTrustedDomainInformation(
734 LSA_HANDLE PolicyHandle
,
735 PSID TrustedDomainSid
,
736 TRUSTED_INFORMATION_CLASS InformationClass
,
739 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
740 return STATUS_SUCCESS
;
749 LSA_HANDLE PolicyHandle
,
750 PLSA_UNICODE_STRING KeyName
,
751 PLSA_UNICODE_STRING PrivateData
)
753 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
754 return STATUS_OBJECT_NAME_NOT_FOUND
;
763 PUNICODE_STRING
*UserName
,
764 PUNICODE_STRING
*DomainName
)
766 FIXME("(%p,%p) stub\n", UserName
, DomainName
);
767 return STATUS_NOT_IMPLEMENTED
;
775 LsaQueryInfoTrustedDomain (DWORD Unknonw0
,
779 FIXME("(%d,%d,%d) stub\n", Unknonw0
, Unknonw1
, Unknonw2
);
780 return STATUS_NOT_IMPLEMENTED
;