Create a branch for cmake bringup.
[reactos.git] / dll / win32 / advapi32 / sec / lsa.c
1 /*
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
7 * UPDATE HISTORY:
8 * 19990322 EA created
9 * 19990515 EA stubs
10 * 20030202 KJK compressed stubs
11 *
12 */
13 #include <advapi32.h>
14 #include "wine/debug.h"
15 #include "wine/unicode.h"
16
17 WINE_DEFAULT_DEBUG_CHANNEL(advapi);
18
19 /* imported from wine 1.1.14 */
20 static void* ADVAPI_GetDomainName(unsigned sz, unsigned ofs)
21 {
22 HKEY key;
23 LONG ret;
24 BYTE* ptr = NULL;
25 UNICODE_STRING* ustr;
26
27 static const WCHAR wVNETSUP[] = {
28 'S','y','s','t','e','m','\\',
29 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
30 'S','e','r','v','i','c','e','s','\\',
31 'V','x','D','\\','V','N','E','T','S','U','P','\0'};
32
33 ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wVNETSUP, 0, KEY_READ, &key);
34 if (ret == ERROR_SUCCESS)
35 {
36 DWORD size = 0;
37 static const WCHAR wg[] = { 'W','o','r','k','g','r','o','u','p',0 };
38
39 ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size);
40 if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS)
41 {
42 ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sz + size);
43 if (!ptr) return NULL;
44 ustr = (UNICODE_STRING*)(ptr + ofs);
45 ustr->MaximumLength = size;
46 ustr->Buffer = (WCHAR*)(ptr + sz);
47 ret = RegQueryValueExW(key, wg, NULL, NULL, (LPBYTE)ustr->Buffer, &size);
48 if (ret != ERROR_SUCCESS)
49 {
50 HeapFree(GetProcessHeap(), 0, ptr);
51 ptr = NULL;
52 }
53 else ustr->Length = size - sizeof(WCHAR);
54 }
55 RegCloseKey(key);
56 }
57 if (!ptr)
58 {
59 static const WCHAR wDomain[] = {'D','O','M','A','I','N','\0'};
60 ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
61 sz + sizeof(wDomain));
62 if (!ptr) return NULL;
63 ustr = (UNICODE_STRING*)(ptr + ofs);
64 ustr->MaximumLength = sizeof(wDomain);
65 ustr->Buffer = (WCHAR*)(ptr + sz);
66 ustr->Length = sizeof(wDomain) - sizeof(WCHAR);
67 memcpy(ustr->Buffer, wDomain, sizeof(wDomain));
68 }
69 return ptr;
70 }
71
72
73 static BOOL LsapIsLocalComputer(PLSA_UNICODE_STRING ServerName)
74 {
75 DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
76 BOOL Result;
77 LPWSTR buf;
78
79 if (ServerName == NULL || ServerName->Length == 0 || ServerName->Buffer == NULL)
80 return TRUE;
81
82 buf = HeapAlloc(GetProcessHeap(), 0, dwSize * sizeof(WCHAR));
83 Result = GetComputerNameW(buf, &dwSize);
84 if (Result && (ServerName->Buffer[0] == '\\') && (ServerName->Buffer[1] == '\\'))
85 ServerName += 2;
86 Result = Result && !lstrcmpW(ServerName->Buffer, buf);
87 HeapFree(GetProcessHeap(), 0, buf);
88
89 return Result;
90 }
91
92
93 handle_t __RPC_USER
94 PLSAPR_SERVER_NAME_bind(PLSAPR_SERVER_NAME pszSystemName)
95 {
96 handle_t hBinding = NULL;
97 LPWSTR pszStringBinding;
98 RPC_STATUS status;
99
100 TRACE("PLSAPR_SERVER_NAME_bind() called\n");
101
102 status = RpcStringBindingComposeW(NULL,
103 L"ncacn_np",
104 pszSystemName,
105 L"\\pipe\\lsarpc",
106 NULL,
107 &pszStringBinding);
108 if (status)
109 {
110 TRACE("RpcStringBindingCompose returned 0x%x\n", status);
111 return NULL;
112 }
113
114 /* Set the binding handle that will be used to bind to the server. */
115 status = RpcBindingFromStringBindingW(pszStringBinding,
116 &hBinding);
117 if (status)
118 {
119 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status);
120 }
121
122 status = RpcStringFreeW(&pszStringBinding);
123 if (status)
124 {
125 TRACE("RpcStringFree returned 0x%x\n", status);
126 }
127
128 return hBinding;
129 }
130
131
132 void __RPC_USER
133 PLSAPR_SERVER_NAME_unbind(PLSAPR_SERVER_NAME pszSystemName,
134 handle_t hBinding)
135 {
136 RPC_STATUS status;
137
138 TRACE("PLSAPR_SERVER_NAME_unbind() called\n");
139
140 status = RpcBindingFree(&hBinding);
141 if (status)
142 {
143 TRACE("RpcBindingFree returned 0x%x\n", status);
144 }
145 }
146
147
148 /*
149 * @implemented
150 */
151 NTSTATUS WINAPI
152 LsaClose(LSA_HANDLE ObjectHandle)
153 {
154 NTSTATUS Status;
155
156 TRACE("LsaClose(0x%p) called\n", ObjectHandle);
157
158 RpcTryExcept
159 {
160 Status = LsarClose((PLSAPR_HANDLE)&ObjectHandle);
161 }
162 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
163 {
164 Status = I_RpcMapWin32Status(RpcExceptionCode());
165 }
166 RpcEndExcept;
167
168 return Status;
169 }
170
171
172 /*
173 * @implemented
174 */
175 NTSTATUS WINAPI
176 LsaDelete(LSA_HANDLE ObjectHandle)
177 {
178 NTSTATUS Status;
179
180 TRACE("LsaDelete(0x%p) called\n", ObjectHandle);
181
182 RpcTryExcept
183 {
184 Status = LsarDelete((LSAPR_HANDLE)ObjectHandle);
185 }
186 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
187 {
188 Status = I_RpcMapWin32Status(RpcExceptionCode());
189 }
190 RpcEndExcept;
191
192 return Status;
193 }
194
195
196 /*
197 * @unimplemented
198 */
199 NTSTATUS
200 WINAPI
201 LsaAddAccountRights(
202 LSA_HANDLE PolicyHandle,
203 PSID AccountSid,
204 PLSA_UNICODE_STRING UserRights,
205 ULONG CountOfRights)
206 {
207 FIXME("(%p,%p,%p,0x%08x) stub\n", PolicyHandle, AccountSid, UserRights, CountOfRights);
208 return STATUS_OBJECT_NAME_NOT_FOUND;
209 }
210
211 /*
212 * @unimplemented
213 */
214 NTSTATUS
215 WINAPI
216 LsaCreateTrustedDomainEx(
217 LSA_HANDLE PolicyHandle,
218 PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation,
219 PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation,
220 ACCESS_MASK DesiredAccess,
221 PLSA_HANDLE TrustedDomainHandle)
222 {
223 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle, TrustedDomainInformation, AuthenticationInformation,
224 DesiredAccess, TrustedDomainHandle);
225 return STATUS_SUCCESS;
226 }
227
228 /*
229 * @unimplemented
230 */
231 NTSTATUS
232 WINAPI
233 LsaDeleteTrustedDomain(
234 LSA_HANDLE PolicyHandle,
235 PSID TrustedDomainSid)
236 {
237 FIXME("(%p,%p) stub\n", PolicyHandle, TrustedDomainSid);
238 return STATUS_SUCCESS;
239 }
240
241 /*
242 * @implemented
243 */
244 NTSTATUS
245 WINAPI
246 LsaEnumerateAccountRights(
247 LSA_HANDLE PolicyHandle,
248 PSID AccountSid,
249 PLSA_UNICODE_STRING *UserRights,
250 PULONG CountOfRights)
251 {
252 LSAPR_USER_RIGHT_SET UserRightsSet;
253 NTSTATUS Status;
254
255 TRACE("(%p,%p,%p,%p) stub\n", PolicyHandle, AccountSid, UserRights, CountOfRights);
256
257 UserRightsSet.Entries = 0;
258 UserRightsSet.UserRights = NULL;
259
260 RpcTryExcept
261 {
262 Status = LsarEnmuerateAccountRights((LSAPR_HANDLE)PolicyHandle,
263 AccountSid,
264 &UserRightsSet);
265
266 *CountOfRights = UserRightsSet.Entries;
267 *UserRights = (PUNICODE_STRING)UserRightsSet.UserRights;
268 }
269 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
270 {
271 Status = I_RpcMapWin32Status(RpcExceptionCode());
272
273 if (UserRightsSet.UserRights != NULL)
274 {
275 MIDL_user_free(UserRightsSet.UserRights);
276 }
277 }
278 RpcEndExcept;
279
280 return Status;
281 }
282
283 /*
284 * @unimplemented
285 */
286 NTSTATUS
287 WINAPI
288 LsaEnumerateAccountsWithUserRight(
289 LSA_HANDLE PolicyHandle,
290 OPTIONAL PLSA_UNICODE_STRING UserRights,
291 PVOID *EnumerationBuffer,
292 PULONG CountReturned)
293 {
294 FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle, UserRights, EnumerationBuffer, CountReturned);
295 return STATUS_NO_MORE_ENTRIES;
296 }
297
298 /*
299 * @unimplemented
300 */
301 NTSTATUS
302 WINAPI
303 LsaEnumerateTrustedDomains(
304 LSA_HANDLE PolicyHandle,
305 PLSA_ENUMERATION_HANDLE EnumerationContext,
306 PVOID *Buffer,
307 ULONG PreferedMaximumLength,
308 PULONG CountReturned)
309 {
310 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle, EnumerationContext,
311 Buffer, PreferedMaximumLength, CountReturned);
312
313 if (CountReturned) *CountReturned = 0;
314 return STATUS_SUCCESS;
315 }
316
317 /*
318 * @unimplemented
319 */
320 NTSTATUS
321 WINAPI
322 LsaEnumerateTrustedDomainsEx(
323 LSA_HANDLE PolicyHandle,
324 PLSA_ENUMERATION_HANDLE EnumerationContext,
325 PVOID *Buffer,
326 ULONG PreferedMaximumLength,
327 PULONG CountReturned)
328 {
329 FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle, EnumerationContext, Buffer,
330 PreferedMaximumLength, CountReturned);
331 if (CountReturned) *CountReturned = 0;
332 return STATUS_SUCCESS;
333 }
334
335 /*
336 * @implemented
337 */
338 NTSTATUS
339 WINAPI
340 LsaFreeMemory(PVOID Buffer)
341 {
342 TRACE("(%p)\n", Buffer);
343 return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
344 }
345
346 /*
347 * @implemented
348 */
349 NTSTATUS
350 WINAPI
351 LsaLookupNames(IN LSA_HANDLE PolicyHandle,
352 IN ULONG Count,
353 IN PLSA_UNICODE_STRING Names,
354 OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
355 OUT PLSA_TRANSLATED_SID *Sids)
356 {
357 LSAPR_TRANSLATED_SIDS TranslatedSids;
358 ULONG MappedCount = 0;
359 NTSTATUS Status;
360
361 TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle, Count, Names,
362 ReferencedDomains, Sids);
363
364 RpcTryExcept
365 {
366 *ReferencedDomains = NULL;
367 *Sids = NULL;
368
369 TranslatedSids.Entries = Count;
370 TranslatedSids.Sids = *Sids;
371
372 Status = LsarLookupNames((LSAPR_HANDLE)PolicyHandle,
373 Count,
374 (PRPC_UNICODE_STRING)Names,
375 (PLSAPR_REFERENCED_DOMAIN_LIST *)ReferencedDomains,
376 &TranslatedSids,
377 LsapLookupWksta,
378 &MappedCount);
379
380 *Sids = (PLSA_TRANSLATED_SID)TranslatedSids.Sids;
381 }
382 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
383 {
384 if (TranslatedSids.Sids != NULL)
385 {
386 MIDL_user_free(TranslatedSids.Sids);
387 }
388
389 Status = I_RpcMapWin32Status(RpcExceptionCode());
390 }
391 RpcEndExcept;
392
393 return Status;
394 }
395
396 /*
397 * @unimplemented
398 */
399 NTSTATUS
400 WINAPI
401 LsaLookupNames2(
402 LSA_HANDLE PolicyHandle,
403 ULONG Flags,
404 ULONG Count,
405 PLSA_UNICODE_STRING Names,
406 PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
407 PLSA_TRANSLATED_SID2 *Sids)
408 {
409 FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle, Flags,
410 Count, Names, ReferencedDomains, Sids);
411 if (Names != NULL && Count > 0)
412 {
413 *ReferencedDomains = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST));
414 *Sids = RtlAllocateHeap(RtlGetProcessHeap(), 0, Count * sizeof(LSA_TRANSLATED_SID2));
415 return STATUS_SOME_NOT_MAPPED;
416 }
417 return STATUS_NONE_MAPPED;
418 }
419
420 /*
421 * @unmplemented
422 */
423 NTSTATUS
424 WINAPI
425 LsaLookupPrivilegeName(IN LSA_HANDLE PolicyHandle,
426 IN PLUID Value,
427 OUT PUNICODE_STRING *Name)
428 {
429 PRPC_UNICODE_STRING NameBuffer = NULL;
430 NTSTATUS Status;
431
432 TRACE("(%p,%p,%p)\n", PolicyHandle, Value, Name);
433
434 RpcTryExcept
435 {
436 Status = LsarLookupPrivilegeName(PolicyHandle,
437 Value,
438 &NameBuffer);
439
440 *Name = (PUNICODE_STRING)NameBuffer;
441 }
442 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
443 {
444 if (NameBuffer != NULL)
445 MIDL_user_free(NameBuffer);
446
447 Status = I_RpcMapWin32Status(RpcExceptionCode());
448 }
449 RpcEndExcept;
450
451 return Status;
452 }
453
454 /*
455 * @implemented
456 */
457 NTSTATUS
458 WINAPI
459 LsaLookupPrivilegeValue(IN LSA_HANDLE PolicyHandle,
460 IN PLSA_UNICODE_STRING Name,
461 OUT PLUID Value)
462 {
463 LUID Luid;
464 NTSTATUS Status;
465
466 TRACE("(%p,%p,%p)\n", PolicyHandle, Name, Value);
467
468 RpcTryExcept
469 {
470 Status = LsarLookupPrivilegeValue(PolicyHandle,
471 (PRPC_UNICODE_STRING)Name,
472 &Luid);
473 if (Status == STATUS_SUCCESS)
474 *Value = Luid;
475 }
476 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
477 {
478 Status = I_RpcMapWin32Status(RpcExceptionCode());
479 }
480 RpcEndExcept;
481
482 return Status;
483 }
484
485 /*
486 * @implemented
487 */
488 NTSTATUS
489 WINAPI
490 LsaLookupSids(IN LSA_HANDLE PolicyHandle,
491 IN ULONG Count,
492 IN PSID *Sids,
493 OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
494 OUT PLSA_TRANSLATED_NAME *Names)
495 {
496 LSAPR_SID_ENUM_BUFFER SidEnumBuffer;
497 LSAPR_TRANSLATED_NAMES TranslatedNames;
498 ULONG MappedCount = 0;
499 NTSTATUS Status;
500
501 TRACE("(%p,%u,%p,%p,%p)\n", PolicyHandle, Count, Sids,
502 ReferencedDomains, Names);
503
504 if (Count == 0)
505 return STATUS_INVALID_PARAMETER;
506
507 SidEnumBuffer.Entries = Count;
508 SidEnumBuffer.SidInfo = (PLSAPR_SID_INFORMATION)Sids;
509
510 RpcTryExcept
511 {
512 *ReferencedDomains = NULL;
513 *Names = NULL;
514
515 TranslatedNames.Entries = 0;
516 TranslatedNames.Names = NULL;
517
518 Status = LsarLookupSids((LSAPR_HANDLE)PolicyHandle,
519 &SidEnumBuffer,
520 (PLSAPR_REFERENCED_DOMAIN_LIST *)ReferencedDomains,
521 &TranslatedNames,
522 LsapLookupWksta,
523 &MappedCount);
524
525 *Names = (PLSA_TRANSLATED_NAME)TranslatedNames.Names;
526 }
527 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
528 {
529 if (TranslatedNames.Names != NULL)
530 {
531 MIDL_user_free(TranslatedNames.Names);
532 }
533
534 Status = I_RpcMapWin32Status(RpcExceptionCode());
535 }
536 RpcEndExcept;
537
538 return Status;
539 }
540
541 /******************************************************************************
542 * LsaNtStatusToWinError
543 *
544 * PARAMS
545 * Status [I]
546 *
547 * @implemented
548 */
549 ULONG WINAPI
550 LsaNtStatusToWinError(NTSTATUS Status)
551 {
552 TRACE("(%lx)\n", Status);
553 return RtlNtStatusToDosError(Status);
554 }
555
556 /******************************************************************************
557 * LsaOpenPolicy
558 *
559 * PARAMS
560 * x1 []
561 * x2 []
562 * x3 []
563 * x4 []
564 *
565 * @unimplemented
566 */
567 NTSTATUS
568 WINAPI
569 LsaOpenPolicy(
570 IN PLSA_UNICODE_STRING SystemName,
571 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes,
572 IN ACCESS_MASK DesiredAccess,
573 IN OUT PLSA_HANDLE PolicyHandle)
574 {
575 NTSTATUS Status;
576
577 TRACE("LsaOpenPolicy (%s,%p,0x%08x,%p)\n",
578 SystemName ? debugstr_w(SystemName->Buffer) : "(null)",
579 ObjectAttributes, DesiredAccess, PolicyHandle);
580
581 /* FIXME: RPC should take care of this */
582 if (!LsapIsLocalComputer(SystemName))
583 return RPC_NT_SERVER_UNAVAILABLE;
584
585 RpcTryExcept
586 {
587 *PolicyHandle = NULL;
588
589 Status = LsarOpenPolicy(SystemName ? SystemName->Buffer : NULL,
590 (PLSAPR_OBJECT_ATTRIBUTES)ObjectAttributes,
591 DesiredAccess,
592 PolicyHandle);
593 }
594 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
595 {
596 Status = I_RpcMapWin32Status(RpcExceptionCode());
597 }
598 RpcEndExcept;
599
600 TRACE("LsaOpenPolicy() done (Status: 0x%08lx)\n", Status);
601
602 return Status;
603 }
604
605
606 /*
607 * @unimplemented
608 */
609 NTSTATUS
610 WINAPI
611 LsaOpenTrustedDomainByName(
612 LSA_HANDLE PolicyHandle,
613 PLSA_UNICODE_STRING TrustedDomainName,
614 ACCESS_MASK DesiredAccess,
615 PLSA_HANDLE TrustedDomainHandle)
616 {
617 FIXME("(%p,%p,0x%08x,%p) stub\n", PolicyHandle, TrustedDomainName, DesiredAccess, TrustedDomainHandle);
618 return STATUS_OBJECT_NAME_NOT_FOUND;
619 }
620
621 /*
622 * @unimplemented
623 */
624 NTSTATUS
625 WINAPI
626 LsaQueryDomainInformationPolicy(
627 LSA_HANDLE PolicyHandle,
628 POLICY_DOMAIN_INFORMATION_CLASS InformationClass,
629 PVOID *Buffer)
630 {
631 FIXME("(%p,0x%08x,%p)\n", PolicyHandle, InformationClass, Buffer);
632 return STATUS_NOT_IMPLEMENTED;
633 }
634
635 /*
636 * @unimplemented
637 */
638 NTSTATUS
639 WINAPI
640 LsaQueryForestTrustInformation(
641 LSA_HANDLE PolicyHandle,
642 PLSA_UNICODE_STRING TrustedDomainName,
643 PLSA_FOREST_TRUST_INFORMATION * ForestTrustInfo)
644 {
645 FIXME("(%p,%p,%p) stub\n", PolicyHandle, TrustedDomainName, ForestTrustInfo);
646 return STATUS_NOT_IMPLEMENTED;
647 }
648
649 /*
650 * @unimplemented
651 */
652 NTSTATUS WINAPI
653 LsaQueryInformationPolicy(LSA_HANDLE PolicyHandle,
654 POLICY_INFORMATION_CLASS InformationClass,
655 PVOID *Buffer)
656 {
657 TRACE("(%p,0x%08x,%p)\n", PolicyHandle, InformationClass, Buffer);
658
659 if(!Buffer) return STATUS_INVALID_PARAMETER;
660 switch (InformationClass)
661 {
662 case PolicyAuditEventsInformation: /* 2 */
663 {
664 PPOLICY_AUDIT_EVENTS_INFO p = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY,
665 sizeof(POLICY_AUDIT_EVENTS_INFO));
666 p->AuditingMode = FALSE; /* no auditing */
667 *Buffer = p;
668 }
669 break;
670 case PolicyPrimaryDomainInformation: /* 3 */
671 {
672 /* Only the domain name is valid for the local computer.
673 * All other fields are zero.
674 */
675 PPOLICY_PRIMARY_DOMAIN_INFO pinfo;
676
677 pinfo = ADVAPI_GetDomainName(sizeof(*pinfo), offsetof(POLICY_PRIMARY_DOMAIN_INFO, Name));
678
679 TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer));
680
681 *Buffer = pinfo;
682 }
683 case PolicyAccountDomainInformation: /* 5 */
684 {
685 struct di
686 {
687 POLICY_ACCOUNT_DOMAIN_INFO info;
688 SID sid;
689 DWORD padding[3];
690 WCHAR domain[MAX_COMPUTERNAME_LENGTH + 1];
691 };
692
693 DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
694 struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
695
696 xdi->info.DomainName.MaximumLength = dwSize * sizeof(WCHAR);
697 xdi->info.DomainName.Buffer = xdi->domain;
698 if (GetComputerNameW(xdi->info.DomainName.Buffer, &dwSize))
699 xdi->info.DomainName.Length = dwSize * sizeof(WCHAR);
700
701 TRACE("setting name to %s\n", debugstr_w(xdi->info.DomainName.Buffer));
702
703 xdi->info.DomainSid = &xdi->sid;
704
705 /* read the computer SID from the registry */
706 if (!ADVAPI_GetComputerSid(&xdi->sid))
707 {
708 HeapFree(GetProcessHeap(), 0, xdi);
709
710 WARN("Computer SID not found\n");
711
712 return STATUS_UNSUCCESSFUL;
713 }
714
715 *Buffer = xdi;
716 }
717 break;
718 case PolicyDnsDomainInformation: /* 12 (0xc) */
719 {
720 /* Only the domain name is valid for the local computer.
721 * All other fields are zero.
722 */
723 PPOLICY_DNS_DOMAIN_INFO pinfo;
724
725 pinfo = ADVAPI_GetDomainName(sizeof(*pinfo), offsetof(POLICY_DNS_DOMAIN_INFO, Name));
726
727 TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer));
728
729 *Buffer = pinfo;
730 }
731 break;
732 case PolicyAuditLogInformation:
733 case PolicyPdAccountInformation:
734 case PolicyLsaServerRoleInformation:
735 case PolicyReplicaSourceInformation:
736 case PolicyDefaultQuotaInformation:
737 case PolicyModificationInformation:
738 case PolicyAuditFullSetInformation:
739 case PolicyAuditFullQueryInformation:
740 case PolicyEfsInformation:
741 {
742 FIXME("category not implemented\n");
743 return STATUS_UNSUCCESSFUL;
744 }
745 }
746 return STATUS_SUCCESS;
747 }
748
749 /*
750 * @unimplemented
751 */
752 NTSTATUS
753 WINAPI
754 LsaQueryTrustedDomainInfoByName(
755 LSA_HANDLE PolicyHandle,
756 PLSA_UNICODE_STRING TrustedDomainName,
757 TRUSTED_INFORMATION_CLASS InformationClass,
758 PVOID *Buffer)
759 {
760 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle, TrustedDomainName, InformationClass, Buffer);
761 return STATUS_OBJECT_NAME_NOT_FOUND;
762 }
763
764 /*
765 * @unimplemented
766 */
767 NTSTATUS
768 WINAPI
769 LsaQueryTrustedDomainInfo(
770 LSA_HANDLE PolicyHandle,
771 PSID TrustedDomainSid,
772 TRUSTED_INFORMATION_CLASS InformationClass,
773 PVOID *Buffer)
774 {
775 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle, TrustedDomainSid, InformationClass, Buffer);
776 return STATUS_OBJECT_NAME_NOT_FOUND;
777 }
778
779 /*
780 * @unimplemented
781 */
782 NTSTATUS
783 WINAPI
784 LsaRemoveAccountRights(
785 LSA_HANDLE PolicyHandle,
786 PSID AccountSid,
787 BOOLEAN AllRights,
788 PLSA_UNICODE_STRING UserRights,
789 ULONG CountOfRights)
790 {
791 FIXME("(%p,%p,%d,%p,0x%08x) stub\n", PolicyHandle, AccountSid, AllRights, UserRights, CountOfRights);
792 return STATUS_SUCCESS;
793 }
794
795 /*
796 * @unimplemented
797 */
798 NTSTATUS
799 WINAPI
800 LsaRetrievePrivateData(
801 LSA_HANDLE PolicyHandle,
802 PLSA_UNICODE_STRING KeyName,
803 PLSA_UNICODE_STRING *PrivateData)
804 {
805 FIXME("(%p,%p,%p) stub\n", PolicyHandle, KeyName, PrivateData);
806 return STATUS_OBJECT_NAME_NOT_FOUND;
807 }
808
809 /*
810 * @unimplemented
811 */
812 NTSTATUS
813 WINAPI
814 LsaSetDomainInformationPolicy(
815 LSA_HANDLE PolicyHandle,
816 POLICY_DOMAIN_INFORMATION_CLASS InformationClass,
817 PVOID Buffer)
818 {
819 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle, InformationClass, Buffer);
820 return STATUS_UNSUCCESSFUL;
821 }
822
823 /*
824 * @unimplemented
825 */
826 NTSTATUS
827 WINAPI
828 LsaSetInformationPolicy(
829 LSA_HANDLE PolicyHandle,
830 POLICY_INFORMATION_CLASS InformationClass,
831 PVOID Buffer)
832 {
833 FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle, InformationClass, Buffer);
834 return STATUS_UNSUCCESSFUL;
835 }
836
837 /*
838 * @unimplemented
839 */
840 NTSTATUS WINAPI LsaSetSecret(
841 IN LSA_HANDLE SecretHandle,
842 IN PLSA_UNICODE_STRING EncryptedCurrentValue,
843 IN PLSA_UNICODE_STRING EncryptedOldValue)
844 {
845 FIXME("(%p,%p,%p) stub\n", SecretHandle, EncryptedCurrentValue,
846 EncryptedOldValue);
847 return STATUS_SUCCESS;
848 }
849
850 /*
851 * @unimplemented
852 */
853 NTSTATUS
854 WINAPI
855 LsaSetForestTrustInformation(
856 LSA_HANDLE PolicyHandle,
857 PLSA_UNICODE_STRING TrustedDomainName,
858 PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo,
859 BOOL CheckOnly,
860 PLSA_FOREST_TRUST_COLLISION_INFORMATION *CollisionInfo)
861 {
862 FIXME("(%p,%p,%p,%d,%p) stub\n", PolicyHandle, TrustedDomainName, ForestTrustInfo, CheckOnly, CollisionInfo);
863 return STATUS_NOT_IMPLEMENTED;
864 }
865
866 /*
867 * @unimplemented
868 */
869 NTSTATUS
870 WINAPI
871 LsaSetTrustedDomainInfoByName(
872 LSA_HANDLE PolicyHandle,
873 PLSA_UNICODE_STRING TrustedDomainName,
874 TRUSTED_INFORMATION_CLASS InformationClass,
875 PVOID Buffer)
876 {
877 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle, TrustedDomainName, InformationClass, Buffer);
878 return STATUS_SUCCESS;
879 }
880
881 /*
882 * @unimplemented
883 */
884 NTSTATUS WINAPI LsaRegisterPolicyChangeNotification(
885 POLICY_NOTIFICATION_INFORMATION_CLASS class,
886 HANDLE event)
887 {
888 FIXME("(%d,%p) stub\n", class, event);
889 return STATUS_UNSUCCESSFUL;
890 }
891
892 /*
893 * @unimplemented
894 */
895 NTSTATUS
896 WINAPI
897 LsaSetTrustedDomainInformation(
898 LSA_HANDLE PolicyHandle,
899 PSID TrustedDomainSid,
900 TRUSTED_INFORMATION_CLASS InformationClass,
901 PVOID Buffer)
902 {
903 FIXME("(%p,%p,%d,%p) stub\n", PolicyHandle, TrustedDomainSid, InformationClass, Buffer);
904 return STATUS_SUCCESS;
905 }
906
907 /*
908 * @unimplemented
909 */
910 NTSTATUS
911 WINAPI
912 LsaStorePrivateData(
913 LSA_HANDLE PolicyHandle,
914 PLSA_UNICODE_STRING KeyName,
915 PLSA_UNICODE_STRING PrivateData)
916 {
917 FIXME("(%p,%p,%p) stub\n", PolicyHandle, KeyName, PrivateData);
918 return STATUS_OBJECT_NAME_NOT_FOUND;
919 }
920
921 /*
922 * @unimplemented
923 */
924 NTSTATUS WINAPI LsaUnregisterPolicyChangeNotification(
925 POLICY_NOTIFICATION_INFORMATION_CLASS class,
926 HANDLE event)
927 {
928 FIXME("(%d,%p) stub\n", class, event);
929 return STATUS_SUCCESS;
930 }
931
932 /*
933 * @unimplemented
934 */
935 NTSTATUS
936 WINAPI
937 LsaGetUserName(
938 PUNICODE_STRING *UserName,
939 PUNICODE_STRING *DomainName)
940 {
941 FIXME("(%p,%p) stub\n", UserName, DomainName);
942 return STATUS_NOT_IMPLEMENTED;
943 }
944
945 /*
946 * @unimplemented
947 */
948 NTSTATUS
949 WINAPI
950 LsaQueryInfoTrustedDomain (DWORD Unknonw0,
951 DWORD Unknonw1,
952 DWORD Unknonw2)
953 {
954 FIXME("(%d,%d,%d) stub\n", Unknonw0, Unknonw1, Unknonw2);
955 return STATUS_NOT_IMPLEMENTED;
956 }
957
958
959 /* EOF */