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_NOT_IMPLEMENTED
;
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_NOT_IMPLEMENTED
;
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
);
231 return STATUS_NOT_IMPLEMENTED
;
239 LsaEnumerateAccountsWithUserRight(
240 LSA_HANDLE PolicyHandle
,
241 OPTIONAL PLSA_UNICODE_STRING UserRights
,
242 PVOID
*EnumerationBuffer
,
243 PULONG CountReturned
)
245 FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle
, UserRights
, EnumerationBuffer
, CountReturned
);
246 return STATUS_NOT_IMPLEMENTED
;
254 LsaEnumerateTrustedDomains(
255 LSA_HANDLE PolicyHandle
,
256 PLSA_ENUMERATION_HANDLE EnumerationContext
,
258 ULONG PreferedMaximumLength
,
259 PULONG CountReturned
)
261 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
,
262 Buffer
, PreferedMaximumLength
, CountReturned
);
263 return STATUS_NOT_IMPLEMENTED
;
271 LsaEnumerateTrustedDomainsEx(
272 LSA_HANDLE PolicyHandle
,
273 PLSA_ENUMERATION_HANDLE EnumerationContext
,
275 ULONG PreferedMaximumLength
,
276 PULONG CountReturned
)
278 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle
, EnumerationContext
, Buffer
,
279 PreferedMaximumLength
, CountReturned
);
280 return STATUS_NOT_IMPLEMENTED
;
287 LsaFreeMemory(PVOID Buffer
)
289 TRACE("(%p)\n", Buffer
);
290 return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
299 LSA_HANDLE PolicyHandle
,
301 PLSA_UNICODE_STRING Names
,
302 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
303 PLSA_TRANSLATED_SID
*Sids
)
305 PLSA_TRANSLATED_SID2 Sids2
;
306 LSA_TRANSLATED_SID
*TranslatedSids
;
310 TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle
, Count
, Names
,
311 ReferencedDomains
, Sids
);
313 /* Call LsaLookupNames2, which supersedes this function */
314 Status
= LsaLookupNames2(PolicyHandle
, Count
, 0, Names
, ReferencedDomains
, &Sids2
);
315 if (!NT_SUCCESS(Status
))
318 /* Translate the returned structure */
319 TranslatedSids
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Count
* sizeof(LSA_TRANSLATED_SID
));
322 LsaFreeMemory(Sids2
);
323 return SCESTATUS_NOT_ENOUGH_RESOURCE
;
325 RtlZeroMemory(Sids
, Count
* sizeof(PLSA_TRANSLATED_SID
));
326 for (i
= 0; i
< Count
; i
++)
328 TranslatedSids
[i
].Use
= Sids2
[i
].Use
;
329 if (Sids2
[i
].Use
!= SidTypeInvalid
&& Sids2
[i
].Use
!= SidTypeUnknown
)
331 TranslatedSids
[i
].DomainIndex
= Sids2
[i
].DomainIndex
;
332 if (Sids2
[i
].Use
!= SidTypeDomain
)
333 TranslatedSids
[i
].RelativeId
= *GetSidSubAuthority(Sids2
[i
].Sid
, 0);
336 LsaFreeMemory(Sids2
);
338 *Sids
= TranslatedSids
;
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 return STATUS_NONE_MAPPED
;
367 LSA_HANDLE PolicyHandle
,
370 PLSA_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
371 PLSA_TRANSLATED_NAME
*Names
)
373 static const UNICODE_STRING UserName
= RTL_CONSTANT_STRING(L
"Administrator");
374 PLSA_REFERENCED_DOMAIN_LIST LocalDomains
;
375 PLSA_TRANSLATED_NAME LocalNames
;
377 TRACE("(%p,%u,%p,%p,%p) stub\n", PolicyHandle
, Count
, Sids
,
378 ReferencedDomains
, Names
);
380 WARN("LsaLookupSids(): stub. Always returning 'Administrator'\n");
382 return STATUS_NONE_MAPPED
;
383 LocalDomains
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_TRANSLATED_SID
));
385 return SCESTATUS_NOT_ENOUGH_RESOURCE
;
386 LocalNames
= RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_TRANSLATED_NAME
) + UserName
.MaximumLength
);
389 LsaFreeMemory(LocalDomains
);
390 return SCESTATUS_NOT_ENOUGH_RESOURCE
;
392 LocalDomains
[0].Entries
= 0;
393 LocalDomains
[0].Domains
= NULL
;
394 LocalNames
[0].Use
= SidTypeWellKnownGroup
;
395 LocalNames
[0].Name
.Buffer
= (LPWSTR
)((ULONG_PTR
)(LocalNames
) + sizeof(LSA_TRANSLATED_NAME
));
396 LocalNames
[0].Name
.Length
= UserName
.Length
;
397 LocalNames
[0].Name
.MaximumLength
= UserName
.MaximumLength
;
398 RtlCopyMemory(LocalNames
[0].Name
.Buffer
, UserName
.Buffer
, UserName
.MaximumLength
);
400 *ReferencedDomains
= LocalDomains
;
402 return STATUS_SUCCESS
;
405 /******************************************************************************
406 * LsaNtStatusToWinError
414 LsaNtStatusToWinError(NTSTATUS Status
)
416 TRACE("(%lx)\n", Status
);
417 return RtlNtStatusToDosError(Status
);
420 /******************************************************************************
434 IN PLSA_UNICODE_STRING SystemName
,
435 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes
,
436 IN ACCESS_MASK DesiredAccess
,
437 IN OUT PLSA_HANDLE PolicyHandle
)
441 TRACE("LsaOpenPolicy (%s,%p,0x%08x,%p)\n",
442 SystemName
? debugstr_w(SystemName
->Buffer
) : "(null)",
443 ObjectAttributes
, DesiredAccess
, PolicyHandle
);
447 *PolicyHandle
= NULL
;
449 Status
= LsarOpenPolicy(SystemName
? SystemName
->Buffer
: NULL
,
450 (PLSAPR_OBJECT_ATTRIBUTES
)ObjectAttributes
,
454 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
456 Status
= I_RpcMapWin32Status(RpcExceptionCode());
460 TRACE("LsaOpenPolicy() done (Status: 0x%08lx)\n", Status
);
471 LsaOpenTrustedDomainByName(
472 LSA_HANDLE PolicyHandle
,
473 PLSA_UNICODE_STRING TrustedDomainName
,
474 ACCESS_MASK DesiredAccess
,
475 PLSA_HANDLE TrustedDomainHandle
)
477 FIXME("(%p,%p,0x%08x,%p) stub\n", PolicyHandle
, TrustedDomainName
, DesiredAccess
, TrustedDomainHandle
);
478 return STATUS_NOT_IMPLEMENTED
;
486 LsaQueryDomainInformationPolicy(
487 LSA_HANDLE PolicyHandle
,
488 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
491 FIXME("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
492 return STATUS_NOT_IMPLEMENTED
;
500 LsaQueryForestTrustInformation(
501 LSA_HANDLE PolicyHandle
,
502 PLSA_UNICODE_STRING TrustedDomainName
,
503 PLSA_FOREST_TRUST_INFORMATION
* ForestTrustInfo
)
505 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
);
506 return STATUS_NOT_IMPLEMENTED
;
513 LsaQueryInformationPolicy(LSA_HANDLE PolicyHandle
,
514 POLICY_INFORMATION_CLASS InformationClass
,
517 TRACE("(%p,0x%08x,%p)\n", PolicyHandle
, InformationClass
, Buffer
);
519 if(!Buffer
) return STATUS_INVALID_PARAMETER
;
520 switch (InformationClass
)
522 case PolicyAuditEventsInformation
: /* 2 */
524 PPOLICY_AUDIT_EVENTS_INFO p
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
,
525 sizeof(POLICY_AUDIT_EVENTS_INFO
));
526 p
->AuditingMode
= FALSE
; /* no auditing */
530 case PolicyPrimaryDomainInformation
: /* 3 */
532 /* Only the domain name is valid for the local computer.
533 * All other fields are zero.
535 PPOLICY_PRIMARY_DOMAIN_INFO pinfo
;
537 pinfo
= ADVAPI_GetDomainName(sizeof(*pinfo
), offsetof(POLICY_PRIMARY_DOMAIN_INFO
, Name
));
539 TRACE("setting domain to %s\n", debugstr_w(pinfo
->Name
.Buffer
));
543 case PolicyAccountDomainInformation
: /* 5 */
547 POLICY_ACCOUNT_DOMAIN_INFO info
;
550 WCHAR domain
[MAX_COMPUTERNAME_LENGTH
+ 1];
552 SID_IDENTIFIER_AUTHORITY localSidAuthority
= {SECURITY_NT_AUTHORITY
};
554 DWORD dwSize
= MAX_COMPUTERNAME_LENGTH
+ 1;
555 struct di
* xdi
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*xdi
));
557 xdi
->info
.DomainName
.MaximumLength
= dwSize
* sizeof(WCHAR
);
558 xdi
->info
.DomainName
.Buffer
= xdi
->domain
;
559 if (GetComputerNameW(xdi
->info
.DomainName
.Buffer
, &dwSize
))
560 xdi
->info
.DomainName
.Length
= dwSize
* sizeof(WCHAR
);
562 TRACE("setting name to %s\n", debugstr_w(xdi
->info
.DomainName
.Buffer
));
564 xdi
->info
.DomainSid
= &xdi
->sid
;
565 xdi
->sid
.Revision
= SID_REVISION
;
566 xdi
->sid
.SubAuthorityCount
= 1;
567 xdi
->sid
.IdentifierAuthority
= localSidAuthority
;
568 xdi
->sid
.SubAuthority
[0] = SECURITY_LOCAL_SYSTEM_RID
;
573 case PolicyDnsDomainInformation
: /* 12 (0xc) */
575 /* Only the domain name is valid for the local computer.
576 * All other fields are zero.
578 PPOLICY_DNS_DOMAIN_INFO pinfo
;
580 pinfo
= ADVAPI_GetDomainName(sizeof(*pinfo
), offsetof(POLICY_DNS_DOMAIN_INFO
, Name
));
582 TRACE("setting domain to %s\n", debugstr_w(pinfo
->Name
.Buffer
));
587 case PolicyAuditLogInformation
:
588 case PolicyPdAccountInformation
:
589 case PolicyLsaServerRoleInformation
:
590 case PolicyReplicaSourceInformation
:
591 case PolicyDefaultQuotaInformation
:
592 case PolicyModificationInformation
:
593 case PolicyAuditFullSetInformation
:
594 case PolicyAuditFullQueryInformation
:
595 case PolicyEfsInformation
:
597 FIXME("category not implemented\n");
598 return STATUS_UNSUCCESSFUL
;
601 return STATUS_SUCCESS
;
609 LsaQueryTrustedDomainInfoByName(
610 LSA_HANDLE PolicyHandle
,
611 PLSA_UNICODE_STRING TrustedDomainName
,
612 TRUSTED_INFORMATION_CLASS InformationClass
,
615 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
616 return STATUS_NOT_IMPLEMENTED
;
624 LsaQueryTrustedDomainInfo(
625 LSA_HANDLE PolicyHandle
,
626 PSID TrustedDomainSid
,
627 TRUSTED_INFORMATION_CLASS InformationClass
,
630 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
631 return STATUS_NOT_IMPLEMENTED
;
639 LsaRemoveAccountRights(
640 LSA_HANDLE PolicyHandle
,
643 PLSA_UNICODE_STRING UserRights
,
646 FIXME("(%p,%p,%d,%p,0x%08x) stub\n", PolicyHandle
, AccountSid
, AllRights
, UserRights
, CountOfRights
);
647 return STATUS_NOT_IMPLEMENTED
;
655 LsaRetrievePrivateData(
656 LSA_HANDLE PolicyHandle
,
657 PLSA_UNICODE_STRING KeyName
,
658 PLSA_UNICODE_STRING
*PrivateData
)
660 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
661 return STATUS_NOT_IMPLEMENTED
;
669 LsaSetDomainInformationPolicy(
670 LSA_HANDLE PolicyHandle
,
671 POLICY_DOMAIN_INFORMATION_CLASS InformationClass
,
674 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
675 return STATUS_NOT_IMPLEMENTED
;
683 LsaSetInformationPolicy(
684 LSA_HANDLE PolicyHandle
,
685 POLICY_INFORMATION_CLASS InformationClass
,
688 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle
, InformationClass
, Buffer
);
689 return STATUS_NOT_IMPLEMENTED
;
697 LsaSetForestTrustInformation(
698 LSA_HANDLE PolicyHandle
,
699 PLSA_UNICODE_STRING TrustedDomainName
,
700 PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo
,
702 PLSA_FOREST_TRUST_COLLISION_INFORMATION
*CollisionInfo
)
704 FIXME("(%p,%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, ForestTrustInfo
, CheckOnly
, CollisionInfo
);
705 return STATUS_NOT_IMPLEMENTED
;
713 LsaSetTrustedDomainInfoByName(
714 LSA_HANDLE PolicyHandle
,
715 PLSA_UNICODE_STRING TrustedDomainName
,
716 TRUSTED_INFORMATION_CLASS InformationClass
,
719 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainName
, InformationClass
, Buffer
);
720 return STATUS_NOT_IMPLEMENTED
;
728 LsaSetTrustedDomainInformation(
729 LSA_HANDLE PolicyHandle
,
730 PSID TrustedDomainSid
,
731 TRUSTED_INFORMATION_CLASS InformationClass
,
734 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle
, TrustedDomainSid
, InformationClass
, Buffer
);
735 return STATUS_NOT_IMPLEMENTED
;
744 LSA_HANDLE PolicyHandle
,
745 PLSA_UNICODE_STRING KeyName
,
746 PLSA_UNICODE_STRING PrivateData
)
748 FIXME("(%p,%p,%p) stub\n", PolicyHandle
, KeyName
, PrivateData
);
749 return STATUS_NOT_IMPLEMENTED
;
758 PUNICODE_STRING
*UserName
,
759 PUNICODE_STRING
*DomainName
)
761 FIXME("(%p,%p) stub\n", UserName
, DomainName
);
762 return STATUS_NOT_IMPLEMENTED
;
770 LsaQueryInfoTrustedDomain (DWORD Unknonw0
,
774 FIXME("(%d,%d,%d) stub\n", Unknonw0
, Unknonw1
, Unknonw2
);
775 return STATUS_NOT_IMPLEMENTED
;