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 14 #include <advapi32.h> 15 16 #include <lsa_c.h> 17 18 WINE_DEFAULT_DEBUG_CHANNEL(advapi); 19 20 static 21 BOOL 22 LsapIsLocalComputer(PLSA_UNICODE_STRING ServerName) 23 { 24 DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; 25 BOOL Result; 26 LPWSTR buf; 27 28 if (ServerName == NULL || ServerName->Length == 0 || ServerName->Buffer == NULL) 29 return TRUE; 30 31 buf = HeapAlloc(GetProcessHeap(), 0, dwSize * sizeof(WCHAR)); 32 Result = GetComputerNameW(buf, &dwSize); 33 if (Result && (ServerName->Buffer[0] == '\\') && (ServerName->Buffer[1] == '\\')) 34 ServerName += 2; 35 Result = Result && !lstrcmpW(ServerName->Buffer, buf); 36 HeapFree(GetProcessHeap(), 0, buf); 37 38 return Result; 39 } 40 41 42 handle_t 43 __RPC_USER 44 PLSAPR_SERVER_NAME_bind(PLSAPR_SERVER_NAME pszSystemName) 45 { 46 handle_t hBinding = NULL; 47 LPWSTR pszStringBinding; 48 RPC_STATUS status; 49 50 TRACE("PLSAPR_SERVER_NAME_bind() called\n"); 51 52 status = RpcStringBindingComposeW(NULL, 53 L"ncacn_np", 54 pszSystemName, 55 L"\\pipe\\lsarpc", 56 NULL, 57 &pszStringBinding); 58 if (status) 59 { 60 TRACE("RpcStringBindingCompose returned 0x%x\n", status); 61 return NULL; 62 } 63 64 /* Set the binding handle that will be used to bind to the server. */ 65 status = RpcBindingFromStringBindingW(pszStringBinding, 66 &hBinding); 67 if (status) 68 { 69 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status); 70 } 71 72 status = RpcStringFreeW(&pszStringBinding); 73 if (status) 74 { 75 TRACE("RpcStringFree returned 0x%x\n", status); 76 } 77 78 return hBinding; 79 } 80 81 82 void 83 __RPC_USER 84 PLSAPR_SERVER_NAME_unbind(PLSAPR_SERVER_NAME pszSystemName, 85 handle_t hBinding) 86 { 87 RPC_STATUS status; 88 89 TRACE("PLSAPR_SERVER_NAME_unbind() called\n"); 90 91 status = RpcBindingFree(&hBinding); 92 if (status) 93 { 94 TRACE("RpcBindingFree returned 0x%x\n", status); 95 } 96 } 97 98 99 /* 100 * @implemented 101 */ 102 NTSTATUS 103 WINAPI 104 LsaAddAccountRights(IN LSA_HANDLE PolicyHandle, 105 IN PSID AccountSid, 106 IN PLSA_UNICODE_STRING UserRights, 107 IN ULONG CountOfRights) 108 { 109 LSAPR_USER_RIGHT_SET UserRightSet; 110 NTSTATUS Status; 111 112 TRACE("LsaAddAccountRights(%p %p %p 0x%08x)\n", 113 PolicyHandle, AccountSid, UserRights, CountOfRights); 114 115 UserRightSet.Entries = CountOfRights; 116 UserRightSet.UserRights = (PRPC_UNICODE_STRING)UserRights; 117 118 RpcTryExcept 119 { 120 Status = LsarAddAccountRights((LSAPR_HANDLE)PolicyHandle, 121 (PRPC_SID)AccountSid, 122 &UserRightSet); 123 124 } 125 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 126 { 127 Status = I_RpcMapWin32Status(RpcExceptionCode()); 128 } 129 RpcEndExcept; 130 131 return Status; 132 } 133 134 135 /* 136 * @implemented 137 */ 138 NTSTATUS 139 WINAPI 140 LsaAddPrivilegesToAccount(IN LSA_HANDLE AccountHandle, 141 IN PPRIVILEGE_SET PrivilegeSet) 142 { 143 NTSTATUS Status; 144 145 TRACE("LsaAddPrivilegesToAccount(%p %p)\n", 146 AccountHandle, PrivilegeSet); 147 148 RpcTryExcept 149 { 150 Status = LsarAddPrivilegesToAccount((LSAPR_HANDLE)AccountHandle, 151 (PLSAPR_PRIVILEGE_SET)PrivilegeSet); 152 } 153 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 154 { 155 Status = I_RpcMapWin32Status(RpcExceptionCode()); 156 } 157 RpcEndExcept; 158 159 return Status; 160 } 161 162 163 /* 164 * @implemented 165 */ 166 NTSTATUS 167 WINAPI 168 LsaClearAuditLog(IN LSA_HANDLE PolicyHandle) 169 { 170 NTSTATUS Status; 171 172 TRACE("LsaClearAuditLog(%p)\n", PolicyHandle); 173 174 RpcTryExcept 175 { 176 Status = LsarClearAuditLog((LSAPR_HANDLE)PolicyHandle); 177 } 178 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 179 { 180 Status = I_RpcMapWin32Status(RpcExceptionCode()); 181 } 182 RpcEndExcept; 183 184 return Status; 185 } 186 187 188 /* 189 * @implemented 190 */ 191 NTSTATUS 192 WINAPI 193 LsaClose(IN LSA_HANDLE ObjectHandle) 194 { 195 NTSTATUS Status; 196 197 TRACE("LsaClose(%p) called\n", ObjectHandle); 198 199 RpcTryExcept 200 { 201 Status = LsarClose((PLSAPR_HANDLE)&ObjectHandle); 202 } 203 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 204 { 205 Status = I_RpcMapWin32Status(RpcExceptionCode()); 206 } 207 RpcEndExcept; 208 209 return Status; 210 } 211 212 213 /* 214 * @implemented 215 */ 216 NTSTATUS 217 WINAPI 218 LsaCreateAccount(IN LSA_HANDLE PolicyHandle, 219 IN PSID AccountSid, 220 IN ACCESS_MASK DesiredAccess, 221 OUT PLSA_HANDLE AccountHandle) 222 { 223 NTSTATUS Status; 224 225 TRACE("LsaCreateAccount(%p %p 0x%08lx %p)\n", 226 PolicyHandle, AccountSid, DesiredAccess, AccountHandle); 227 228 RpcTryExcept 229 { 230 Status = LsarCreateAccount((LSAPR_HANDLE)PolicyHandle, 231 AccountSid, 232 DesiredAccess, 233 AccountHandle); 234 } 235 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 236 { 237 Status = I_RpcMapWin32Status(RpcExceptionCode()); 238 } 239 RpcEndExcept; 240 241 return Status; 242 } 243 244 245 /* 246 * @implemented 247 */ 248 NTSTATUS 249 WINAPI 250 LsaCreateSecret(IN LSA_HANDLE PolicyHandle, 251 IN PLSA_UNICODE_STRING SecretName, 252 IN ACCESS_MASK DesiredAccess, 253 OUT PLSA_HANDLE SecretHandle) 254 { 255 NTSTATUS Status; 256 257 TRACE("LsaCreateSecret(%p %p 0x%08lx %p)\n", 258 PolicyHandle, SecretName, DesiredAccess, SecretHandle); 259 260 RpcTryExcept 261 { 262 Status = LsarCreateSecret((LSAPR_HANDLE)PolicyHandle, 263 (PRPC_UNICODE_STRING)SecretName, 264 DesiredAccess, 265 SecretHandle); 266 } 267 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 268 { 269 Status = I_RpcMapWin32Status(RpcExceptionCode()); 270 } 271 RpcEndExcept; 272 273 return Status; 274 } 275 276 277 /* 278 * @implemented 279 */ 280 NTSTATUS 281 WINAPI 282 LsaCreateTrustedDomain(IN LSA_HANDLE PolicyHandle, 283 IN PLSA_TRUST_INFORMATION TrustedDomainInformation, 284 IN ACCESS_MASK DesiredAccess, 285 OUT PLSA_HANDLE TrustedDomainHandle) 286 { 287 NTSTATUS Status; 288 289 TRACE("LsaCreateTrustedDomain(%p %p 0x%08lx %p)\n", 290 PolicyHandle, TrustedDomainInformation, DesiredAccess, TrustedDomainHandle); 291 292 RpcTryExcept 293 { 294 Status = LsarCreateTrustedDomain((LSAPR_HANDLE)PolicyHandle, 295 (PLSAPR_TRUST_INFORMATION)TrustedDomainInformation, 296 DesiredAccess, 297 (PLSAPR_HANDLE)TrustedDomainHandle); 298 } 299 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 300 { 301 Status = I_RpcMapWin32Status(RpcExceptionCode()); 302 } 303 RpcEndExcept; 304 305 return Status; 306 } 307 308 309 /* 310 * @unimplemented 311 */ 312 NTSTATUS 313 WINAPI 314 LsaCreateTrustedDomainEx(IN LSA_HANDLE PolicyHandle, 315 IN PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation, 316 IN PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation, 317 IN ACCESS_MASK DesiredAccess, 318 OUT PLSA_HANDLE TrustedDomainHandle) 319 { 320 PLSAPR_TRUSTED_DOMAIN_AUTH_INFORMATION_INTERNAL EncryptedAuthInfo = NULL; 321 NTSTATUS Status; 322 323 TRACE("LsaCreateTrustedDomainEx(%p %p %p 0x%08lx %p) stub\n", 324 PolicyHandle, TrustedDomainInformation, AuthenticationInformation, 325 DesiredAccess, TrustedDomainHandle); 326 327 RpcTryExcept 328 { 329 /* FIXME: Encrypt AuthenticationInformation */ 330 331 Status = LsarCreateTrustedDomainEx2((LSAPR_HANDLE)PolicyHandle, 332 (PLSAPR_TRUSTED_DOMAIN_INFORMATION_EX)TrustedDomainInformation, 333 EncryptedAuthInfo, 334 DesiredAccess, 335 (PLSAPR_HANDLE)TrustedDomainHandle); 336 } 337 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 338 { 339 Status = I_RpcMapWin32Status(RpcExceptionCode()); 340 } 341 RpcEndExcept; 342 343 return Status; 344 } 345 346 347 /* 348 * @implemented 349 */ 350 NTSTATUS 351 WINAPI 352 LsaDelete(IN LSA_HANDLE ObjectHandle) 353 { 354 NTSTATUS Status; 355 356 TRACE("LsaDelete(%p)\n", ObjectHandle); 357 358 RpcTryExcept 359 { 360 Status = LsarDelete((LSAPR_HANDLE)ObjectHandle); 361 } 362 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 363 { 364 Status = I_RpcMapWin32Status(RpcExceptionCode()); 365 } 366 RpcEndExcept; 367 368 return Status; 369 } 370 371 372 /* 373 * @implemented 374 */ 375 NTSTATUS 376 WINAPI 377 LsaDeleteTrustedDomain(IN LSA_HANDLE PolicyHandle, 378 IN PSID TrustedDomainSid) 379 { 380 NTSTATUS Status; 381 382 TRACE("LsaDeleteTrustedDomain(%p %p)\n", 383 PolicyHandle, TrustedDomainSid); 384 385 RpcTryExcept 386 { 387 Status = LsarDeleteTrustedDomain((LSAPR_HANDLE)PolicyHandle, 388 TrustedDomainSid); 389 } 390 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 391 { 392 Status = I_RpcMapWin32Status(RpcExceptionCode()); 393 } 394 RpcEndExcept; 395 396 return Status; 397 } 398 399 400 /* 401 * @implemented 402 */ 403 NTSTATUS 404 WINAPI 405 LsaEnumerateAccountRights(IN LSA_HANDLE PolicyHandle, 406 IN PSID AccountSid, 407 OUT PLSA_UNICODE_STRING *UserRights, 408 OUT PULONG CountOfRights) 409 { 410 LSAPR_USER_RIGHT_SET UserRightsSet; 411 NTSTATUS Status; 412 413 TRACE("LsaEnumerateAccountRights(%p %p %p %p)\n", 414 PolicyHandle, AccountSid, UserRights, CountOfRights); 415 416 UserRightsSet.Entries = 0; 417 UserRightsSet.UserRights = NULL; 418 419 RpcTryExcept 420 { 421 Status = LsarEnumerateAccountRights((LSAPR_HANDLE)PolicyHandle, 422 AccountSid, 423 &UserRightsSet); 424 425 *UserRights = (PUNICODE_STRING)UserRightsSet.UserRights; 426 *CountOfRights = UserRightsSet.Entries; 427 } 428 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 429 { 430 Status = I_RpcMapWin32Status(RpcExceptionCode()); 431 432 if (UserRightsSet.UserRights != NULL) 433 MIDL_user_free(UserRightsSet.UserRights); 434 } 435 RpcEndExcept; 436 437 return Status; 438 } 439 440 441 /* 442 * @implemented 443 */ 444 NTSTATUS 445 WINAPI 446 LsaEnumerateAccounts(IN LSA_HANDLE PolicyHandle, 447 IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext, 448 OUT PVOID *Buffer, 449 IN ULONG PreferedMaximumLength, 450 OUT PULONG CountReturned) 451 { 452 LSAPR_ACCOUNT_ENUM_BUFFER AccountEnumBuffer; 453 NTSTATUS Status; 454 455 TRACE("LsaEnumerateAccounts(%p %p %p %lu %p)\n", 456 PolicyHandle, EnumerationContext, Buffer, 457 PreferedMaximumLength, CountReturned); 458 459 AccountEnumBuffer.EntriesRead = 0; 460 AccountEnumBuffer.Information = NULL; 461 462 RpcTryExcept 463 { 464 Status = LsarEnumerateAccounts((LSAPR_HANDLE)PolicyHandle, 465 EnumerationContext, 466 &AccountEnumBuffer, 467 PreferedMaximumLength); 468 469 *Buffer = AccountEnumBuffer.Information; 470 *CountReturned = AccountEnumBuffer.EntriesRead; 471 } 472 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 473 { 474 if (AccountEnumBuffer.Information != NULL) 475 MIDL_user_free(AccountEnumBuffer.Information); 476 477 Status = I_RpcMapWin32Status(RpcExceptionCode()); 478 } 479 RpcEndExcept; 480 481 return Status; 482 } 483 484 485 /* 486 * @implemented 487 */ 488 NTSTATUS 489 WINAPI 490 LsaEnumerateAccountsWithUserRight(IN LSA_HANDLE PolicyHandle, 491 IN PLSA_UNICODE_STRING UserRight OPTIONAL, 492 OUT PVOID *Buffer, 493 OUT PULONG CountReturned) 494 { 495 LSAPR_ACCOUNT_ENUM_BUFFER AccountEnumBuffer; 496 NTSTATUS Status; 497 498 TRACE("LsaEnumerateAccountsWithUserRight(%p %p %p %p) stub\n", 499 PolicyHandle, UserRight, Buffer, CountReturned); 500 501 AccountEnumBuffer.EntriesRead = 0; 502 AccountEnumBuffer.Information = NULL; 503 504 RpcTryExcept 505 { 506 Status = LsarEnumerateAccountsWithUserRight((LSAPR_HANDLE)PolicyHandle, 507 (PRPC_UNICODE_STRING)UserRight, 508 &AccountEnumBuffer); 509 510 *Buffer = AccountEnumBuffer.Information; 511 *CountReturned = AccountEnumBuffer.EntriesRead; 512 } 513 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 514 { 515 if (AccountEnumBuffer.Information != NULL) 516 MIDL_user_free(AccountEnumBuffer.Information); 517 518 Status = I_RpcMapWin32Status(RpcExceptionCode()); 519 } 520 RpcEndExcept; 521 522 return Status; 523 } 524 525 526 /* 527 * @implemented 528 */ 529 NTSTATUS 530 WINAPI 531 LsaEnumeratePrivileges(IN LSA_HANDLE PolicyHandle, 532 IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext, 533 OUT PVOID *Buffer, 534 IN ULONG PreferedMaximumLength, 535 OUT PULONG CountReturned) 536 { 537 LSAPR_PRIVILEGE_ENUM_BUFFER PrivilegeEnumBuffer; 538 NTSTATUS Status; 539 540 TRACE("LsaEnumeratePrivileges(%p %p %p %lu %p)\n", 541 PolicyHandle, EnumerationContext, Buffer, 542 PreferedMaximumLength, CountReturned); 543 544 PrivilegeEnumBuffer.Entries = 0; 545 PrivilegeEnumBuffer.Privileges = NULL; 546 547 RpcTryExcept 548 { 549 Status = LsarEnumeratePrivileges((LSAPR_HANDLE)PolicyHandle, 550 EnumerationContext, 551 &PrivilegeEnumBuffer, 552 PreferedMaximumLength); 553 554 *Buffer = PrivilegeEnumBuffer.Privileges; 555 *CountReturned = PrivilegeEnumBuffer.Entries; 556 557 } 558 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 559 { 560 if (PrivilegeEnumBuffer.Privileges != NULL) 561 MIDL_user_free(PrivilegeEnumBuffer.Privileges); 562 563 Status = I_RpcMapWin32Status(RpcExceptionCode()); 564 } 565 RpcEndExcept; 566 567 return Status; 568 } 569 570 571 /* 572 * @implemented 573 */ 574 NTSTATUS 575 WINAPI 576 LsaEnumeratePrivilegesOfAccount(IN LSA_HANDLE AccountHandle, 577 OUT PPRIVILEGE_SET *Privileges) 578 { 579 NTSTATUS Status; 580 581 TRACE("LsaEnumeratePrivilegesOfAccount(%p %p)\n", 582 AccountHandle, Privileges); 583 584 RpcTryExcept 585 { 586 Status = LsarEnumeratePrivilegesAccount((LSAPR_HANDLE)AccountHandle, 587 (LSAPR_PRIVILEGE_SET **)Privileges); 588 } 589 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 590 { 591 Status = I_RpcMapWin32Status(RpcExceptionCode()); 592 } 593 RpcEndExcept; 594 595 return Status; 596 } 597 598 599 /* 600 * @unimplemented 601 */ 602 NTSTATUS 603 WINAPI 604 LsaEnumerateTrustedDomains(IN LSA_HANDLE PolicyHandle, 605 IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext, 606 OUT PVOID *Buffer, 607 IN ULONG PreferedMaximumLength, 608 OUT PULONG CountReturned) 609 { 610 FIXME("LsaEnumerateTrustedDomains(%p %p %p %lu %p) stub\n", 611 PolicyHandle, EnumerationContext, Buffer, 612 PreferedMaximumLength, CountReturned); 613 614 if (CountReturned) 615 *CountReturned = 0; 616 617 return STATUS_SUCCESS; 618 } 619 620 621 /* 622 * @unimplemented 623 */ 624 NTSTATUS 625 WINAPI 626 LsaEnumerateTrustedDomainsEx(IN LSA_HANDLE PolicyHandle, 627 IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext, 628 OUT PVOID *Buffer, 629 IN ULONG PreferedMaximumLength, 630 OUT PULONG CountReturned) 631 { 632 FIXME("LsaEnumerateTrustedDomainsEx(%p %p %p %lu %p) stub\n", 633 PolicyHandle, EnumerationContext, Buffer, 634 PreferedMaximumLength, CountReturned); 635 636 if (CountReturned) 637 *CountReturned = 0; 638 639 return STATUS_SUCCESS; 640 } 641 642 643 /* 644 * @implemented 645 */ 646 NTSTATUS 647 WINAPI 648 LsaFreeMemory(IN PVOID Buffer) 649 { 650 TRACE("LsaFreeMemory(%p)\n", Buffer); 651 return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); 652 } 653 654 655 /* 656 * @implemented 657 */ 658 NTSTATUS 659 WINAPI 660 LsaGetQuotasForAccount(IN LSA_HANDLE AccountHandle, 661 OUT PQUOTA_LIMITS QuotaLimits) 662 { 663 NTSTATUS Status; 664 665 TRACE("LsaGetQuotasForAccount(%p %p)\n", 666 AccountHandle, QuotaLimits); 667 668 RpcTryExcept 669 { 670 Status = LsarGetQuotasForAccount((LSAPR_HANDLE)AccountHandle, 671 QuotaLimits); 672 } 673 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 674 { 675 Status = I_RpcMapWin32Status(RpcExceptionCode()); 676 } 677 RpcEndExcept; 678 679 return Status; 680 } 681 682 683 /* 684 * @unimplemented 685 */ 686 NTSTATUS 687 WINAPI 688 LsaGetRemoteUserName(IN PLSA_UNICODE_STRING SystemName OPTIONAL, 689 OUT PLSA_UNICODE_STRING *UserName, 690 OUT PLSA_UNICODE_STRING *DomainName OPTIONAL) 691 { 692 PRPC_UNICODE_STRING UserNameString = NULL; 693 PRPC_UNICODE_STRING DomainNameString = NULL; 694 NTSTATUS Status; 695 696 TRACE("LsaGetRemoteUserName(%s %p %p)\n", 697 SystemName ? debugstr_w(SystemName->Buffer) : "(null)", 698 UserName, DomainName); 699 700 RpcTryExcept 701 { 702 Status = LsarGetUserName((PLSAPR_SERVER_NAME)SystemName, 703 &UserNameString, 704 (DomainName != NULL) ? &DomainNameString : NULL); 705 706 *UserName = (PLSA_UNICODE_STRING)UserNameString; 707 708 if (DomainName != NULL) 709 *DomainName = (PLSA_UNICODE_STRING)DomainNameString; 710 } 711 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 712 { 713 if (UserNameString != NULL) 714 MIDL_user_free(UserNameString); 715 716 if (DomainNameString != NULL) 717 MIDL_user_free(DomainNameString); 718 719 Status = I_RpcMapWin32Status(RpcExceptionCode()); 720 } 721 RpcEndExcept; 722 723 return Status; 724 } 725 726 727 /* 728 * @implemented 729 */ 730 NTSTATUS 731 WINAPI 732 LsaGetSystemAccessAccount(IN LSA_HANDLE AccountHandle, 733 OUT PULONG SystemAccess) 734 { 735 NTSTATUS Status; 736 737 TRACE("LsaGetSystemAccessAccount(%p %p)\n", 738 AccountHandle, SystemAccess); 739 740 RpcTryExcept 741 { 742 Status = LsarGetSystemAccessAccount((LSAPR_HANDLE)AccountHandle, 743 (ACCESS_MASK *)SystemAccess); 744 } 745 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 746 { 747 Status = I_RpcMapWin32Status(RpcExceptionCode()); 748 } 749 RpcEndExcept; 750 751 return Status; 752 } 753 754 755 /* 756 * @implemented 757 */ 758 NTSTATUS 759 WINAPI 760 LsaGetUserName(OUT PUNICODE_STRING *UserName, 761 OUT PUNICODE_STRING *DomainName OPTIONAL) 762 { 763 PRPC_UNICODE_STRING UserNameString = NULL; 764 PRPC_UNICODE_STRING DomainNameString = NULL; 765 NTSTATUS Status; 766 767 TRACE("LsaGetUserName(%p %p)\n", 768 UserName, DomainName); 769 770 RpcTryExcept 771 { 772 Status = LsarGetUserName(NULL, 773 &UserNameString, 774 (DomainName != NULL) ? &DomainNameString : NULL); 775 776 *UserName = (PUNICODE_STRING)UserNameString; 777 778 if (DomainName != NULL) 779 *DomainName = (PUNICODE_STRING)DomainNameString; 780 } 781 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 782 { 783 if (UserNameString != NULL) 784 MIDL_user_free(UserNameString); 785 786 if (DomainNameString != NULL) 787 MIDL_user_free(DomainNameString); 788 789 Status = I_RpcMapWin32Status(RpcExceptionCode()); 790 } 791 RpcEndExcept; 792 793 return Status; 794 } 795 796 797 /* 798 * @implemented 799 */ 800 NTSTATUS 801 WINAPI 802 LsaLookupNames(IN LSA_HANDLE PolicyHandle, 803 IN ULONG Count, 804 IN PLSA_UNICODE_STRING Names, 805 OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, 806 OUT PLSA_TRANSLATED_SID *Sids) 807 { 808 LSAPR_TRANSLATED_SIDS TranslatedSids = {0, NULL}; 809 ULONG MappedCount = 0; 810 NTSTATUS Status; 811 812 TRACE("LsaLookupNames(%p %lu %p %p %p)\n", 813 PolicyHandle, Count, Names, ReferencedDomains, Sids); 814 815 if (ReferencedDomains == NULL || Sids == NULL) 816 return STATUS_INVALID_PARAMETER; 817 818 RpcTryExcept 819 { 820 *ReferencedDomains = NULL; 821 *Sids = NULL; 822 823 TranslatedSids.Entries = Count; 824 825 Status = LsarLookupNames((LSAPR_HANDLE)PolicyHandle, 826 Count, 827 (PRPC_UNICODE_STRING)Names, 828 (PLSAPR_REFERENCED_DOMAIN_LIST *)ReferencedDomains, 829 &TranslatedSids, 830 LsapLookupWksta, 831 &MappedCount); 832 833 *Sids = (PLSA_TRANSLATED_SID)TranslatedSids.Sids; 834 } 835 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 836 { 837 if (TranslatedSids.Sids != NULL) 838 MIDL_user_free(TranslatedSids.Sids); 839 840 Status = I_RpcMapWin32Status(RpcExceptionCode()); 841 } 842 RpcEndExcept; 843 844 return Status; 845 } 846 847 848 /* 849 * @implemented 850 */ 851 NTSTATUS 852 WINAPI 853 LsaLookupNames2(IN LSA_HANDLE PolicyHandle, 854 IN ULONG Flags, 855 IN ULONG Count, 856 IN PLSA_UNICODE_STRING Names, 857 OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, 858 OUT PLSA_TRANSLATED_SID2 *Sids) 859 { 860 LSAPR_TRANSLATED_SIDS_EX2 TranslatedSids = {0, NULL}; 861 ULONG MappedCount = 0; 862 NTSTATUS Status; 863 864 TRACE("LsaLookupNames2(%p 0x%08x %lu %p %p %p)\n", 865 PolicyHandle, Flags, Count, Names, ReferencedDomains, Sids); 866 867 if (ReferencedDomains == NULL || Sids == NULL) 868 return STATUS_INVALID_PARAMETER; 869 870 RpcTryExcept 871 { 872 *ReferencedDomains = NULL; 873 *Sids = NULL; 874 875 TranslatedSids.Entries = Count; 876 877 Status = LsarLookupNames3((LSAPR_HANDLE)PolicyHandle, 878 Count, 879 (PRPC_UNICODE_STRING)Names, 880 (PLSAPR_REFERENCED_DOMAIN_LIST *)ReferencedDomains, 881 &TranslatedSids, 882 LsapLookupWksta, 883 &MappedCount, 884 Flags, 885 2); 886 887 *Sids = (PLSA_TRANSLATED_SID2)TranslatedSids.Sids; 888 } 889 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 890 { 891 if (TranslatedSids.Sids != NULL) 892 MIDL_user_free(TranslatedSids.Sids); 893 894 Status = I_RpcMapWin32Status(RpcExceptionCode()); 895 } 896 RpcEndExcept; 897 898 return Status; 899 } 900 901 902 /* 903 * @unimplemented 904 */ 905 NTSTATUS 906 WINAPI 907 LsaLookupPrivilegeDisplayName(IN LSA_HANDLE PolicyHandle, 908 IN PLSA_UNICODE_STRING Name, 909 OUT PLSA_UNICODE_STRING *DisplayName, 910 OUT PSHORT LanguageReturned) 911 { 912 FIXME("LsaLookupPrivilegeDisplayName(%p %p %p %p)\n", 913 PolicyHandle, Name, DisplayName, LanguageReturned); 914 return STATUS_NOT_IMPLEMENTED; 915 } 916 917 918 /* 919 * @implemented 920 */ 921 NTSTATUS 922 WINAPI 923 LsaLookupPrivilegeName(IN LSA_HANDLE PolicyHandle, 924 IN PLUID Value, 925 OUT PUNICODE_STRING *Name) 926 { 927 PRPC_UNICODE_STRING NameBuffer = NULL; 928 NTSTATUS Status; 929 930 TRACE("LsaLookupPrivilegeName(%p %p %p)\n", 931 PolicyHandle, Value, Name); 932 933 RpcTryExcept 934 { 935 Status = LsarLookupPrivilegeName(PolicyHandle, 936 Value, 937 &NameBuffer); 938 939 *Name = (PUNICODE_STRING)NameBuffer; 940 } 941 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 942 { 943 if (NameBuffer != NULL) 944 MIDL_user_free(NameBuffer); 945 946 Status = I_RpcMapWin32Status(RpcExceptionCode()); 947 } 948 RpcEndExcept; 949 950 return Status; 951 } 952 953 954 /* 955 * @implemented 956 */ 957 NTSTATUS 958 WINAPI 959 LsaLookupPrivilegeValue(IN LSA_HANDLE PolicyHandle, 960 IN PLSA_UNICODE_STRING Name, 961 OUT PLUID Value) 962 { 963 LUID Luid; 964 NTSTATUS Status; 965 966 TRACE("LsaLookupPrivilegeValue(%p %p %p)\n", 967 PolicyHandle, Name, Value); 968 969 RpcTryExcept 970 { 971 Status = LsarLookupPrivilegeValue(PolicyHandle, 972 (PRPC_UNICODE_STRING)Name, 973 &Luid); 974 if (Status == STATUS_SUCCESS) 975 *Value = Luid; 976 } 977 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 978 { 979 Status = I_RpcMapWin32Status(RpcExceptionCode()); 980 } 981 RpcEndExcept; 982 983 return Status; 984 } 985 986 987 /* 988 * @implemented 989 */ 990 NTSTATUS 991 WINAPI 992 LsaLookupSids(IN LSA_HANDLE PolicyHandle, 993 IN ULONG Count, 994 IN PSID *Sids, 995 OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, 996 OUT PLSA_TRANSLATED_NAME *Names) 997 { 998 LSAPR_SID_ENUM_BUFFER SidEnumBuffer; 999 LSAPR_TRANSLATED_NAMES TranslatedNames; 1000 ULONG MappedCount = 0; 1001 NTSTATUS Status; 1002 1003 TRACE("LsaLookupSids(%p %lu %p %p %p)\n", 1004 PolicyHandle, Count, Sids, ReferencedDomains, Names); 1005 1006 if (Count == 0) 1007 return STATUS_INVALID_PARAMETER; 1008 1009 SidEnumBuffer.Entries = Count; 1010 SidEnumBuffer.SidInfo = (PLSAPR_SID_INFORMATION)Sids; 1011 1012 RpcTryExcept 1013 { 1014 *ReferencedDomains = NULL; 1015 *Names = NULL; 1016 1017 TranslatedNames.Entries = 0; 1018 TranslatedNames.Names = NULL; 1019 1020 Status = LsarLookupSids((LSAPR_HANDLE)PolicyHandle, 1021 &SidEnumBuffer, 1022 (PLSAPR_REFERENCED_DOMAIN_LIST *)ReferencedDomains, 1023 &TranslatedNames, 1024 LsapLookupWksta, 1025 &MappedCount); 1026 1027 *Names = (PLSA_TRANSLATED_NAME)TranslatedNames.Names; 1028 } 1029 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1030 { 1031 if (TranslatedNames.Names != NULL) 1032 { 1033 MIDL_user_free(TranslatedNames.Names); 1034 } 1035 1036 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1037 } 1038 RpcEndExcept; 1039 1040 return Status; 1041 } 1042 1043 1044 /****************************************************************************** 1045 * LsaNtStatusToWinError 1046 * 1047 * PARAMS 1048 * Status [I] 1049 * 1050 * @implemented 1051 */ 1052 ULONG 1053 WINAPI 1054 LsaNtStatusToWinError(IN NTSTATUS Status) 1055 { 1056 TRACE("LsaNtStatusToWinError(0x%lx)\n", Status); 1057 return RtlNtStatusToDosError(Status); 1058 } 1059 1060 1061 /* 1062 * @implemented 1063 */ 1064 NTSTATUS 1065 WINAPI 1066 LsaOpenAccount(IN LSA_HANDLE PolicyHandle, 1067 IN PSID AccountSid, 1068 IN ACCESS_MASK DesiredAccess, 1069 OUT PLSA_HANDLE AccountHandle) 1070 { 1071 NTSTATUS Status; 1072 1073 TRACE("LsaOpenAccount(%p %p 0x%08lx %p)\n", 1074 PolicyHandle, AccountSid, DesiredAccess, AccountHandle); 1075 1076 RpcTryExcept 1077 { 1078 Status = LsarOpenAccount((LSAPR_HANDLE)PolicyHandle, 1079 AccountSid, 1080 DesiredAccess, 1081 AccountHandle); 1082 } 1083 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1084 { 1085 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1086 } 1087 RpcEndExcept; 1088 1089 return Status; 1090 } 1091 1092 1093 /****************************************************************************** 1094 * LsaOpenPolicy 1095 * 1096 * PARAMS 1097 * x1 [] 1098 * x2 [] 1099 * x3 [] 1100 * x4 [] 1101 * 1102 * @implemented 1103 */ 1104 NTSTATUS 1105 WINAPI 1106 LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName OPTIONAL, 1107 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, 1108 IN ACCESS_MASK DesiredAccess, 1109 OUT PLSA_HANDLE PolicyHandle) 1110 { 1111 NTSTATUS Status; 1112 1113 TRACE("LsaOpenPolicy(%s %p 0x%08lx %p)\n", 1114 SystemName ? debugstr_w(SystemName->Buffer) : "(null)", 1115 ObjectAttributes, DesiredAccess, PolicyHandle); 1116 1117 /* FIXME: RPC should take care of this */ 1118 if (!LsapIsLocalComputer(SystemName)) 1119 return RPC_NT_SERVER_UNAVAILABLE; 1120 1121 RpcTryExcept 1122 { 1123 *PolicyHandle = NULL; 1124 1125 Status = LsarOpenPolicy(SystemName ? SystemName->Buffer : NULL, 1126 (PLSAPR_OBJECT_ATTRIBUTES)ObjectAttributes, 1127 DesiredAccess, 1128 PolicyHandle); 1129 } 1130 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1131 { 1132 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1133 } 1134 RpcEndExcept; 1135 1136 TRACE("LsaOpenPolicy() done (Status: 0x%08lx)\n", Status); 1137 1138 return Status; 1139 } 1140 1141 1142 /* 1143 * @unimplemented 1144 */ 1145 NTSTATUS 1146 WINAPI 1147 LsaOpenPolicySce(IN PLSA_UNICODE_STRING SystemName OPTIONAL, 1148 IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, 1149 IN ACCESS_MASK DesiredAccess, 1150 OUT PLSA_HANDLE PolicyHandle) 1151 { 1152 FIXME("LsaOpenPolicySce(%s %p 0x%08lx %p)\n", 1153 SystemName ? debugstr_w(SystemName->Buffer) : "(null)", 1154 ObjectAttributes, DesiredAccess, PolicyHandle); 1155 return STATUS_NOT_IMPLEMENTED; 1156 } 1157 1158 1159 /* 1160 * @implemented 1161 */ 1162 NTSTATUS 1163 WINAPI 1164 LsaOpenSecret(IN LSA_HANDLE PolicyHandle, 1165 IN PLSA_UNICODE_STRING SecretName, 1166 IN ACCESS_MASK DesiredAccess, 1167 OUT PLSA_HANDLE SecretHandle) 1168 { 1169 NTSTATUS Status; 1170 1171 TRACE("LsaOpenSecret(%p %p 0x%08lx %p)\n", 1172 PolicyHandle, SecretName, DesiredAccess, SecretHandle); 1173 1174 RpcTryExcept 1175 { 1176 *SecretHandle = NULL; 1177 1178 Status = LsarOpenSecret((LSAPR_HANDLE)PolicyHandle, 1179 (PRPC_UNICODE_STRING)SecretName, 1180 DesiredAccess, 1181 SecretHandle); 1182 } 1183 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1184 { 1185 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1186 } 1187 RpcEndExcept; 1188 1189 TRACE("LsaOpenSecret() done (Status: 0x%08lx)\n", Status); 1190 1191 return Status; 1192 } 1193 1194 1195 /* 1196 * @implemented 1197 */ 1198 NTSTATUS 1199 WINAPI 1200 LsaOpenTrustedDomain(IN LSA_HANDLE PolicyHandle, 1201 IN PSID TrustedDomainSid, 1202 IN ACCESS_MASK DesiredAccess, 1203 OUT PLSA_HANDLE TrustedDomainHandle) 1204 { 1205 NTSTATUS Status; 1206 1207 TRACE("LsaOpenTrustedDomain(%p %p 0x%08lx %p)\n", 1208 PolicyHandle, TrustedDomainSid, DesiredAccess, TrustedDomainHandle); 1209 1210 RpcTryExcept 1211 { 1212 Status = LsarOpenTrustedDomain((LSAPR_HANDLE)PolicyHandle, 1213 (PRPC_SID)TrustedDomainSid, 1214 DesiredAccess, 1215 (PLSAPR_HANDLE)TrustedDomainHandle); 1216 } 1217 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1218 { 1219 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1220 } 1221 RpcEndExcept; 1222 1223 return Status; 1224 } 1225 1226 1227 /* 1228 * @implemented 1229 */ 1230 NTSTATUS 1231 WINAPI 1232 LsaOpenTrustedDomainByName(IN LSA_HANDLE PolicyHandle, 1233 IN PLSA_UNICODE_STRING TrustedDomainName, 1234 IN ACCESS_MASK DesiredAccess, 1235 OUT PLSA_HANDLE TrustedDomainHandle) 1236 { 1237 NTSTATUS Status; 1238 1239 TRACE("LsaOpenTrustedDomainByName(%p %p 0x%08lx %p)\n", 1240 PolicyHandle, TrustedDomainName, DesiredAccess, TrustedDomainHandle); 1241 1242 RpcTryExcept 1243 { 1244 Status = LsarOpenTrustedDomainByName((LSAPR_HANDLE)PolicyHandle, 1245 (PRPC_UNICODE_STRING)TrustedDomainName, 1246 DesiredAccess, 1247 TrustedDomainHandle); 1248 } 1249 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1250 { 1251 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1252 } 1253 RpcEndExcept; 1254 1255 return Status; 1256 } 1257 1258 1259 /* 1260 * @implemented 1261 */ 1262 NTSTATUS 1263 WINAPI 1264 LsaQueryDomainInformationPolicy(IN LSA_HANDLE PolicyHandle, 1265 IN POLICY_DOMAIN_INFORMATION_CLASS InformationClass, 1266 OUT PVOID *Buffer) 1267 { 1268 PLSAPR_POLICY_DOMAIN_INFORMATION PolicyInformation = NULL; 1269 NTSTATUS Status; 1270 1271 TRACE("LsaQueryDomainInformationPolicy(%p %lu %p)\n", 1272 PolicyHandle, InformationClass, Buffer); 1273 1274 RpcTryExcept 1275 { 1276 Status = LsarQueryDomainInformationPolicy((LSAPR_HANDLE)PolicyHandle, 1277 InformationClass, 1278 &PolicyInformation); 1279 1280 *Buffer = PolicyInformation; 1281 } 1282 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1283 { 1284 if (PolicyInformation != NULL) 1285 MIDL_user_free(PolicyInformation); 1286 1287 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1288 } 1289 RpcEndExcept; 1290 1291 return Status; 1292 } 1293 1294 1295 /* 1296 * @implemented 1297 */ 1298 NTSTATUS 1299 WINAPI 1300 LsaQueryForestTrustInformation(IN LSA_HANDLE PolicyHandle, 1301 IN PLSA_UNICODE_STRING TrustedDomainName, 1302 OUT PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo) 1303 { 1304 NTSTATUS Status; 1305 1306 TRACE("LsaQueryForestTrustInformation(%p %p %p)\n", 1307 PolicyHandle, TrustedDomainName, ForestTrustInfo); 1308 1309 RpcTryExcept 1310 { 1311 Status = LsarQueryForestTrustInformation((LSAPR_HANDLE)PolicyHandle, 1312 TrustedDomainName, 1313 ForestTrustDomainInfo, 1314 ForestTrustInfo); 1315 } 1316 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1317 { 1318 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1319 } 1320 RpcEndExcept; 1321 1322 return Status; 1323 } 1324 1325 1326 /* 1327 * @unimplemented 1328 */ 1329 NTSTATUS 1330 WINAPI 1331 LsaQueryInfoTrustedDomain(IN LSA_HANDLE TrustedDomainHandle, 1332 IN TRUSTED_INFORMATION_CLASS InformationClass, 1333 OUT PVOID *Buffer) 1334 { 1335 FIXME("LsaQueryInfoTrustedDomain(%p %d %p) stub\n", 1336 TrustedDomainHandle, InformationClass, Buffer); 1337 return STATUS_NOT_IMPLEMENTED; 1338 } 1339 1340 1341 /* 1342 * @implemented 1343 */ 1344 NTSTATUS 1345 WINAPI 1346 LsaQueryInformationPolicy(IN LSA_HANDLE PolicyHandle, 1347 IN POLICY_INFORMATION_CLASS InformationClass, 1348 OUT PVOID *Buffer) 1349 { 1350 PLSAPR_POLICY_INFORMATION PolicyInformation = NULL; 1351 NTSTATUS Status; 1352 1353 TRACE("LsaQueryInformationPolicy(%p %d %p)\n", 1354 PolicyHandle, InformationClass, Buffer); 1355 1356 RpcTryExcept 1357 { 1358 Status = LsarQueryInformationPolicy((LSAPR_HANDLE)PolicyHandle, 1359 InformationClass, 1360 &PolicyInformation); 1361 *Buffer = PolicyInformation; 1362 } 1363 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1364 { 1365 if (PolicyInformation != NULL) 1366 MIDL_user_free(PolicyInformation); 1367 1368 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1369 } 1370 RpcEndExcept; 1371 1372 TRACE("Done (Status: 0x%08x)\n", Status); 1373 1374 return Status; 1375 } 1376 1377 1378 /* 1379 * @unimplemented 1380 */ 1381 NTSTATUS 1382 WINAPI 1383 LsaQuerySecret(IN LSA_HANDLE SecretHandle, 1384 OUT PLSA_UNICODE_STRING *CurrentValue OPTIONAL, 1385 OUT PLARGE_INTEGER CurrentValueSetTime OPTIONAL, 1386 OUT PLSA_UNICODE_STRING *OldValue OPTIONAL, 1387 OUT PLARGE_INTEGER OldValueSetTime OPTIONAL) 1388 { 1389 PLSAPR_CR_CIPHER_VALUE EncryptedCurrentValue = NULL; 1390 PLSAPR_CR_CIPHER_VALUE EncryptedOldValue = NULL; 1391 PLSA_UNICODE_STRING DecryptedCurrentValue = NULL; 1392 PLSA_UNICODE_STRING DecryptedOldValue = NULL; 1393 SIZE_T BufferSize; 1394 NTSTATUS Status; 1395 1396 TRACE("LsaQuerySecret(%p %p %p %p %p)\n", 1397 SecretHandle, CurrentValue, CurrentValueSetTime, 1398 OldValue, OldValueSetTime); 1399 1400 RpcTryExcept 1401 { 1402 Status = LsarQuerySecret((PLSAPR_HANDLE)SecretHandle, 1403 &EncryptedCurrentValue, 1404 CurrentValueSetTime, 1405 &EncryptedOldValue, 1406 OldValueSetTime); 1407 } 1408 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1409 { 1410 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1411 } 1412 RpcEndExcept; 1413 1414 if (!NT_SUCCESS(Status)) 1415 goto done; 1416 1417 /* Decrypt the current value */ 1418 if (CurrentValue != NULL) 1419 { 1420 if (EncryptedCurrentValue == NULL) 1421 { 1422 *CurrentValue = NULL; 1423 } 1424 else 1425 { 1426 /* FIXME: Decrypt the current value */ 1427 BufferSize = sizeof(LSA_UNICODE_STRING) + EncryptedCurrentValue->MaximumLength; 1428 DecryptedCurrentValue = midl_user_allocate(BufferSize); 1429 if (DecryptedCurrentValue == NULL) 1430 { 1431 Status = STATUS_INSUFFICIENT_RESOURCES; 1432 goto done; 1433 } 1434 1435 DecryptedCurrentValue->Length = (USHORT)EncryptedCurrentValue->Length; 1436 DecryptedCurrentValue->MaximumLength = (USHORT)EncryptedCurrentValue->MaximumLength; 1437 DecryptedCurrentValue->Buffer = (PWSTR)(DecryptedCurrentValue + 1); 1438 RtlCopyMemory(DecryptedCurrentValue->Buffer, 1439 EncryptedCurrentValue->Buffer, 1440 EncryptedCurrentValue->Length); 1441 1442 *CurrentValue = DecryptedCurrentValue; 1443 } 1444 } 1445 1446 /* Decrypt the old value */ 1447 if (OldValue != NULL) 1448 { 1449 if (EncryptedOldValue == NULL) 1450 { 1451 *OldValue = NULL; 1452 } 1453 else 1454 { 1455 /* FIXME: Decrypt the old value */ 1456 BufferSize = sizeof(LSA_UNICODE_STRING) + EncryptedOldValue->MaximumLength; 1457 DecryptedOldValue = midl_user_allocate(BufferSize); 1458 if (DecryptedOldValue == NULL) 1459 { 1460 Status = STATUS_INSUFFICIENT_RESOURCES; 1461 goto done; 1462 } 1463 1464 DecryptedOldValue->Length = (USHORT)EncryptedOldValue->Length; 1465 DecryptedOldValue->MaximumLength = (USHORT)EncryptedOldValue->MaximumLength; 1466 DecryptedOldValue->Buffer = (PWSTR)(DecryptedOldValue + 1); 1467 RtlCopyMemory(DecryptedOldValue->Buffer, 1468 EncryptedOldValue->Buffer, 1469 EncryptedOldValue->Length); 1470 1471 *OldValue = DecryptedOldValue; 1472 } 1473 } 1474 1475 done: 1476 if (!NT_SUCCESS(Status)) 1477 { 1478 if (DecryptedCurrentValue != NULL) 1479 midl_user_free(DecryptedCurrentValue); 1480 1481 if (DecryptedOldValue != NULL) 1482 midl_user_free(DecryptedOldValue); 1483 1484 if (CurrentValue != NULL) 1485 *CurrentValue = NULL; 1486 1487 if (OldValue != NULL) 1488 *OldValue = NULL; 1489 } 1490 1491 if (EncryptedCurrentValue != NULL) 1492 midl_user_free(EncryptedCurrentValue); 1493 1494 if (EncryptedOldValue != NULL) 1495 midl_user_free(EncryptedOldValue); 1496 1497 return Status; 1498 } 1499 1500 1501 /* 1502 * @implemented 1503 */ 1504 NTSTATUS 1505 WINAPI 1506 LsaQuerySecurityObject(IN LSA_HANDLE ObjectHandle, 1507 IN SECURITY_INFORMATION SecurityInformation, 1508 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor) 1509 { 1510 LSAPR_SR_SECURITY_DESCRIPTOR SdBuffer; 1511 PLSAPR_SR_SECURITY_DESCRIPTOR SdPointer; 1512 NTSTATUS Status; 1513 1514 TRACE("LsaQuerySecurityObject(%p %lx %p)\n", 1515 ObjectHandle, SecurityInformation, SecurityDescriptor); 1516 1517 SdBuffer.Length = 0; 1518 SdBuffer.SecurityDescriptor = NULL; 1519 1520 SdPointer = &SdBuffer; 1521 1522 RpcTryExcept 1523 { 1524 Status = LsarQuerySecurityObject((LSAPR_HANDLE)ObjectHandle, 1525 SecurityInformation, 1526 &SdPointer); 1527 if (NT_SUCCESS(Status)) 1528 { 1529 *SecurityDescriptor = SdBuffer.SecurityDescriptor; 1530 } 1531 else 1532 { 1533 *SecurityDescriptor = NULL; 1534 } 1535 } 1536 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1537 { 1538 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1539 } 1540 RpcEndExcept; 1541 1542 return Status; 1543 } 1544 1545 1546 /* 1547 * @unimplemented 1548 */ 1549 NTSTATUS 1550 WINAPI 1551 LsaQueryTrustedDomainInfo(IN LSA_HANDLE PolicyHandle, 1552 IN PSID TrustedDomainSid, 1553 IN TRUSTED_INFORMATION_CLASS InformationClass, 1554 OUT PVOID *Buffer) 1555 { 1556 FIXME("LsaQueryTrustedDomainInfo(%p %p %d %p) stub\n", 1557 PolicyHandle, TrustedDomainSid, InformationClass, Buffer); 1558 return STATUS_OBJECT_NAME_NOT_FOUND; 1559 } 1560 1561 1562 /* 1563 * @implemented 1564 */ 1565 NTSTATUS 1566 WINAPI 1567 LsaQueryTrustedDomainInfoByName(IN LSA_HANDLE PolicyHandle, 1568 IN PLSA_UNICODE_STRING TrustedDomainName, 1569 IN TRUSTED_INFORMATION_CLASS InformationClass, 1570 OUT PVOID *Buffer) 1571 { 1572 NTSTATUS Status; 1573 1574 TRACE("LsaQueryTrustedDomainInfoByName(%p %p %d %p)\n", 1575 PolicyHandle, TrustedDomainName, InformationClass, Buffer); 1576 1577 if (InformationClass == TrustedDomainAuthInformationInternal || 1578 InformationClass == TrustedDomainFullInformationInternal) 1579 return STATUS_INVALID_INFO_CLASS; 1580 1581 RpcTryExcept 1582 { 1583 Status = LsarQueryTrustedDomainInfoByName((LSAPR_HANDLE)PolicyHandle, 1584 (PRPC_UNICODE_STRING)TrustedDomainName, 1585 InformationClass, 1586 (PLSAPR_TRUSTED_DOMAIN_INFO *)Buffer); 1587 } 1588 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1589 { 1590 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1591 } 1592 RpcEndExcept; 1593 1594 return Status; 1595 } 1596 1597 1598 /* 1599 * @implemented 1600 */ 1601 NTSTATUS 1602 WINAPI 1603 LsaRemoveAccountRights(IN LSA_HANDLE PolicyHandle, 1604 IN PSID AccountSid, 1605 IN BOOLEAN AllRights, 1606 IN PLSA_UNICODE_STRING UserRights, 1607 IN ULONG CountOfRights) 1608 { 1609 LSAPR_USER_RIGHT_SET UserRightSet; 1610 1611 TRACE("LsaRemoveAccountRights(%p %p %d %p %lu)\n", 1612 PolicyHandle, AccountSid, AllRights, UserRights, CountOfRights); 1613 1614 UserRightSet.Entries = CountOfRights; 1615 UserRightSet.UserRights = (PRPC_UNICODE_STRING)UserRights; 1616 1617 RpcTryExcept 1618 { 1619 LsarRemoveAccountRights((LSAPR_HANDLE)PolicyHandle, 1620 (PRPC_SID)AccountSid, 1621 AllRights, 1622 &UserRightSet); 1623 } 1624 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1625 { 1626 I_RpcMapWin32Status(RpcExceptionCode()); 1627 } 1628 RpcEndExcept; 1629 1630 return STATUS_SUCCESS; 1631 } 1632 1633 1634 /* 1635 * @implemented 1636 */ 1637 NTSTATUS 1638 WINAPI 1639 LsaRemovePrivilegesFromAccount(IN LSA_HANDLE AccountHandle, 1640 IN BOOLEAN AllPrivileges, 1641 IN PPRIVILEGE_SET Privileges OPTIONAL) 1642 { 1643 NTSTATUS Status; 1644 1645 RpcTryExcept 1646 { 1647 Status = LsarRemovePrivilegesFromAccount((LSAPR_HANDLE)AccountHandle, 1648 AllPrivileges, 1649 (PLSAPR_PRIVILEGE_SET)Privileges); 1650 } 1651 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1652 { 1653 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1654 } 1655 RpcEndExcept; 1656 1657 return Status; 1658 } 1659 1660 1661 /* 1662 * @unimplemented 1663 */ 1664 NTSTATUS 1665 WINAPI 1666 LsaRetrievePrivateData(IN LSA_HANDLE PolicyHandle, 1667 IN PLSA_UNICODE_STRING KeyName, 1668 OUT PLSA_UNICODE_STRING *PrivateData) 1669 { 1670 FIXME("LsaRetrievePrivateData(%p %p %p) stub\n", 1671 PolicyHandle, KeyName, PrivateData); 1672 return STATUS_OBJECT_NAME_NOT_FOUND; 1673 } 1674 1675 1676 /* 1677 * @implemented 1678 */ 1679 NTSTATUS 1680 WINAPI 1681 LsaSetDomainInformationPolicy(IN LSA_HANDLE PolicyHandle, 1682 IN POLICY_DOMAIN_INFORMATION_CLASS InformationClass, 1683 IN PVOID Buffer OPTIONAL) 1684 { 1685 NTSTATUS Status; 1686 1687 TRACE("LsaSetDomainInformationPolicy(%p %d %p)\n", 1688 PolicyHandle, InformationClass, Buffer); 1689 1690 RpcTryExcept 1691 { 1692 Status = LsarSetDomainInformationPolicy((LSAPR_HANDLE)PolicyHandle, 1693 InformationClass, 1694 (PLSAPR_POLICY_DOMAIN_INFORMATION)Buffer); 1695 } 1696 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1697 { 1698 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1699 } 1700 RpcEndExcept; 1701 1702 return Status; 1703 } 1704 1705 1706 /* 1707 * @implemented 1708 */ 1709 NTSTATUS 1710 WINAPI 1711 LsaSetForestTrustInformation(IN LSA_HANDLE PolicyHandle, 1712 IN PLSA_UNICODE_STRING TrustedDomainName, 1713 IN PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo, 1714 IN BOOL CheckOnly, 1715 OUT PLSA_FOREST_TRUST_COLLISION_INFORMATION *CollisionInfo) 1716 { 1717 NTSTATUS Status; 1718 1719 TRACE("LsaSetForestTrustInformation(%p %p %p %d %p)\n", 1720 PolicyHandle, TrustedDomainName, ForestTrustInfo, CheckOnly, CollisionInfo); 1721 1722 RpcTryExcept 1723 { 1724 Status = LsarSetForestTrustInformation((LSAPR_HANDLE)PolicyHandle, 1725 TrustedDomainName, 1726 ForestTrustDomainInfo, 1727 ForestTrustInfo, 1728 CheckOnly, 1729 CollisionInfo); 1730 } 1731 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1732 { 1733 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1734 } 1735 RpcEndExcept; 1736 1737 return Status; 1738 } 1739 1740 1741 /* 1742 * @implemented 1743 */ 1744 NTSTATUS 1745 WINAPI 1746 LsaSetInformationPolicy(IN LSA_HANDLE PolicyHandle, 1747 IN POLICY_INFORMATION_CLASS InformationClass, 1748 IN PVOID Buffer) 1749 { 1750 NTSTATUS Status; 1751 1752 TRACE("LsaSetInformationPolicy(%p %d %p)\n", 1753 PolicyHandle, InformationClass, Buffer); 1754 1755 RpcTryExcept 1756 { 1757 Status = LsarSetInformationPolicy((LSAPR_HANDLE)PolicyHandle, 1758 InformationClass, 1759 (PLSAPR_POLICY_INFORMATION)Buffer); 1760 } 1761 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1762 { 1763 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1764 } 1765 RpcEndExcept; 1766 1767 return Status; 1768 } 1769 1770 1771 /* 1772 * @unimplemented 1773 */ 1774 NTSTATUS 1775 WINAPI 1776 LsaSetInformationTrustedDomain(IN LSA_HANDLE TrustedDomainHandle, 1777 IN TRUSTED_INFORMATION_CLASS InformationClass, 1778 IN PVOID Buffer) 1779 { 1780 FIXME("LsaSetInformationTrustedDomain(%p %d %p)\n", 1781 TrustedDomainHandle, InformationClass, Buffer); 1782 return STATUS_NOT_IMPLEMENTED; 1783 } 1784 1785 1786 /* 1787 * @implemented 1788 */ 1789 NTSTATUS 1790 WINAPI 1791 LsaSetQuotasForAccount(IN LSA_HANDLE AccountHandle, 1792 IN PQUOTA_LIMITS QuotaLimits) 1793 { 1794 NTSTATUS Status; 1795 1796 TRACE("LsaSetQuotasForAccount(%p %p)\n", 1797 AccountHandle, QuotaLimits); 1798 1799 RpcTryExcept 1800 { 1801 Status = LsarSetQuotasForAccount((LSAPR_HANDLE)AccountHandle, 1802 QuotaLimits); 1803 } 1804 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1805 { 1806 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1807 } 1808 RpcEndExcept; 1809 1810 return Status; 1811 } 1812 1813 1814 /* 1815 * @implemented 1816 */ 1817 NTSTATUS 1818 WINAPI 1819 LsaSetSecret(IN LSA_HANDLE SecretHandle, 1820 IN PLSA_UNICODE_STRING CurrentValue OPTIONAL, 1821 IN PLSA_UNICODE_STRING OldValue OPTIONAL) 1822 { 1823 PLSAPR_CR_CIPHER_VALUE EncryptedCurrentValue = NULL; 1824 PLSAPR_CR_CIPHER_VALUE EncryptedOldValue = NULL; 1825 SIZE_T BufferSize; 1826 NTSTATUS Status; 1827 1828 TRACE("LsaSetSecret(%p %p %p)\n", 1829 SecretHandle, EncryptedCurrentValue, EncryptedOldValue); 1830 1831 if (CurrentValue != NULL) 1832 { 1833 BufferSize = sizeof(LSAPR_CR_CIPHER_VALUE) + CurrentValue->MaximumLength; 1834 EncryptedCurrentValue = midl_user_allocate(BufferSize); 1835 if (EncryptedCurrentValue == NULL) 1836 { 1837 Status = STATUS_INSUFFICIENT_RESOURCES; 1838 goto done; 1839 } 1840 1841 EncryptedCurrentValue->Length = CurrentValue->Length; 1842 EncryptedCurrentValue->MaximumLength = CurrentValue->MaximumLength; 1843 EncryptedCurrentValue->Buffer = (BYTE *)(EncryptedCurrentValue + 1); 1844 if (EncryptedCurrentValue->Buffer != NULL) 1845 memcpy(EncryptedCurrentValue->Buffer, CurrentValue->Buffer, CurrentValue->Length); 1846 } 1847 1848 if (OldValue != NULL) 1849 { 1850 BufferSize = sizeof(LSAPR_CR_CIPHER_VALUE) + OldValue->MaximumLength; 1851 EncryptedOldValue = midl_user_allocate(BufferSize); 1852 if (EncryptedOldValue == NULL) 1853 { 1854 Status = STATUS_INSUFFICIENT_RESOURCES; 1855 goto done; 1856 } 1857 1858 EncryptedOldValue->Length = OldValue->Length; 1859 EncryptedOldValue->MaximumLength = OldValue->MaximumLength; 1860 EncryptedOldValue->Buffer = (BYTE*)(EncryptedOldValue + 1); 1861 if (EncryptedOldValue->Buffer != NULL) 1862 memcpy(EncryptedOldValue->Buffer, OldValue->Buffer, OldValue->Length); 1863 } 1864 1865 RpcTryExcept 1866 { 1867 Status = LsarSetSecret((LSAPR_HANDLE)SecretHandle, 1868 EncryptedCurrentValue, 1869 EncryptedOldValue); 1870 } 1871 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1872 { 1873 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1874 } 1875 RpcEndExcept; 1876 1877 done: 1878 if (EncryptedCurrentValue != NULL) 1879 midl_user_free(EncryptedCurrentValue); 1880 1881 if (EncryptedOldValue != NULL) 1882 midl_user_free(EncryptedOldValue); 1883 1884 return Status; 1885 } 1886 1887 1888 /* 1889 * @implemented 1890 */ 1891 NTSTATUS 1892 WINAPI 1893 LsaSetSecurityObject(IN LSA_HANDLE ObjectHandle, 1894 IN SECURITY_INFORMATION SecurityInformation, 1895 IN PSECURITY_DESCRIPTOR SecurityDescriptor) 1896 { 1897 LSAPR_SR_SECURITY_DESCRIPTOR SdBuffer = {0, NULL}; 1898 ULONG SdLength = 0; 1899 NTSTATUS Status; 1900 1901 TRACE("LsaSetSecurityObject(%p %lx %p)\n", 1902 ObjectHandle, SecurityInformation, SecurityDescriptor); 1903 1904 Status = RtlMakeSelfRelativeSD(SecurityDescriptor, 1905 NULL, 1906 &SdLength); 1907 if (Status != STATUS_BUFFER_TOO_SMALL) 1908 return STATUS_INVALID_PARAMETER; 1909 1910 SdBuffer.SecurityDescriptor = MIDL_user_allocate(SdLength); 1911 if (SdBuffer.SecurityDescriptor == NULL) 1912 return STATUS_INSUFFICIENT_RESOURCES; 1913 1914 Status = RtlMakeSelfRelativeSD(SecurityDescriptor, 1915 (PSECURITY_DESCRIPTOR)SdBuffer.SecurityDescriptor, 1916 &SdLength); 1917 if (!NT_SUCCESS(Status)) 1918 goto done; 1919 1920 SdBuffer.Length = SdLength; 1921 1922 RpcTryExcept 1923 { 1924 Status = LsarSetSecurityObject((LSAPR_HANDLE)ObjectHandle, 1925 SecurityInformation, 1926 &SdBuffer); 1927 } 1928 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1929 { 1930 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1931 } 1932 RpcEndExcept; 1933 1934 done: 1935 if (SdBuffer.SecurityDescriptor != NULL) 1936 MIDL_user_free(SdBuffer.SecurityDescriptor); 1937 1938 return Status; 1939 } 1940 1941 1942 /* 1943 * @implemented 1944 */ 1945 NTSTATUS 1946 WINAPI 1947 LsaSetSystemAccessAccount(IN LSA_HANDLE AccountHandle, 1948 IN ULONG SystemAccess) 1949 { 1950 NTSTATUS Status; 1951 1952 TRACE("LsaSetSystemAccessAccount(%p 0x%lx)\n", 1953 AccountHandle, SystemAccess); 1954 1955 RpcTryExcept 1956 { 1957 Status = LsarSetSystemAccessAccount((LSAPR_HANDLE)AccountHandle, 1958 SystemAccess); 1959 } 1960 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 1961 { 1962 Status = I_RpcMapWin32Status(RpcExceptionCode()); 1963 } 1964 RpcEndExcept; 1965 1966 return Status; 1967 } 1968 1969 1970 /* 1971 * @unimplemented 1972 */ 1973 NTSTATUS 1974 WINAPI 1975 LsaSetTrustedDomainInfoByName(IN LSA_HANDLE PolicyHandle, 1976 IN PLSA_UNICODE_STRING TrustedDomainName, 1977 IN TRUSTED_INFORMATION_CLASS InformationClass, 1978 IN PVOID Buffer) 1979 { 1980 FIXME("LsaSetTrustedDomainInfoByName(%p %p %d %p) stub\n", 1981 PolicyHandle, TrustedDomainName, InformationClass, Buffer); 1982 return STATUS_SUCCESS; 1983 } 1984 1985 1986 /* 1987 * @unimplemented 1988 */ 1989 NTSTATUS 1990 WINAPI 1991 LsaSetTrustedDomainInformation(IN LSA_HANDLE PolicyHandle, 1992 IN PSID TrustedDomainSid, 1993 IN TRUSTED_INFORMATION_CLASS InformationClass, 1994 IN PVOID Buffer) 1995 { 1996 FIXME("LsaSetTrustedDomainInformation(%p %p %d %p) stub\n", 1997 PolicyHandle, TrustedDomainSid, InformationClass, Buffer); 1998 return STATUS_SUCCESS; 1999 } 2000 2001 2002 /* 2003 * @unimplemented 2004 */ 2005 NTSTATUS 2006 WINAPI 2007 LsaStorePrivateData(IN LSA_HANDLE PolicyHandle, 2008 IN PLSA_UNICODE_STRING KeyName, 2009 IN PLSA_UNICODE_STRING PrivateData OPTIONAL) 2010 { 2011 FIXME("LsaStorePrivateData(%p %p %p) stub\n", 2012 PolicyHandle, KeyName, PrivateData); 2013 return STATUS_OBJECT_NAME_NOT_FOUND; 2014 } 2015 2016 /* EOF */ 2017