/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: dll/win32/advapi32/sec/lsa.c * PURPOSE: Local security authority functions * PROGRAMMER: Emanuele Aliberti * UPDATE HISTORY: * 19990322 EA created * 19990515 EA stubs * 20030202 KJK compressed stubs */ #include #include WINE_DEFAULT_DEBUG_CHANNEL(advapi); static BOOL LsapIsLocalComputer(PLSA_UNICODE_STRING ServerName) { DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; BOOL Result; LPWSTR buf; if (ServerName == NULL || ServerName->Length == 0 || ServerName->Buffer == NULL) return TRUE; buf = HeapAlloc(GetProcessHeap(), 0, dwSize * sizeof(WCHAR)); Result = GetComputerNameW(buf, &dwSize); if (Result && (ServerName->Buffer[0] == '\\') && (ServerName->Buffer[1] == '\\')) ServerName += 2; Result = Result && !lstrcmpW(ServerName->Buffer, buf); HeapFree(GetProcessHeap(), 0, buf); return Result; } handle_t __RPC_USER PLSAPR_SERVER_NAME_bind(PLSAPR_SERVER_NAME pszSystemName) { handle_t hBinding = NULL; LPWSTR pszStringBinding; RPC_STATUS status; TRACE("PLSAPR_SERVER_NAME_bind() called\n"); status = RpcStringBindingComposeW(NULL, L"ncacn_np", pszSystemName, L"\\pipe\\lsarpc", NULL, &pszStringBinding); if (status) { TRACE("RpcStringBindingCompose returned 0x%x\n", status); return NULL; } /* Set the binding handle that will be used to bind to the server. */ status = RpcBindingFromStringBindingW(pszStringBinding, &hBinding); if (status) { TRACE("RpcBindingFromStringBinding returned 0x%x\n", status); } status = RpcStringFreeW(&pszStringBinding); if (status) { TRACE("RpcStringFree returned 0x%x\n", status); } return hBinding; } void __RPC_USER PLSAPR_SERVER_NAME_unbind(PLSAPR_SERVER_NAME pszSystemName, handle_t hBinding) { RPC_STATUS status; TRACE("PLSAPR_SERVER_NAME_unbind() called\n"); status = RpcBindingFree(&hBinding); if (status) { TRACE("RpcBindingFree returned 0x%x\n", status); } } /* * @implemented */ NTSTATUS WINAPI LsaAddAccountRights(IN LSA_HANDLE PolicyHandle, IN PSID AccountSid, IN PLSA_UNICODE_STRING UserRights, IN ULONG CountOfRights) { LSAPR_USER_RIGHT_SET UserRightSet; NTSTATUS Status; TRACE("LsaAddAccountRights(%p %p %p 0x%08x)\n", PolicyHandle, AccountSid, UserRights, CountOfRights); UserRightSet.Entries = CountOfRights; UserRightSet.UserRights = (PRPC_UNICODE_STRING)UserRights; RpcTryExcept { Status = LsarAddAccountRights((LSAPR_HANDLE)PolicyHandle, (PRPC_SID)AccountSid, &UserRightSet); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaAddPrivilegesToAccount(IN LSA_HANDLE AccountHandle, IN PPRIVILEGE_SET PrivilegeSet) { NTSTATUS Status; TRACE("LsaAddPrivilegesToAccount(%p %p)\n", AccountHandle, PrivilegeSet); RpcTryExcept { Status = LsarAddPrivilegesToAccount((LSAPR_HANDLE)AccountHandle, (PLSAPR_PRIVILEGE_SET)PrivilegeSet); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaClearAuditLog(IN LSA_HANDLE PolicyHandle) { NTSTATUS Status; TRACE("LsaClearAuditLog(%p)\n", PolicyHandle); RpcTryExcept { Status = LsarClearAuditLog((LSAPR_HANDLE)PolicyHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaClose(IN LSA_HANDLE ObjectHandle) { NTSTATUS Status; TRACE("LsaClose(%p) called\n", ObjectHandle); RpcTryExcept { Status = LsarClose((PLSAPR_HANDLE)&ObjectHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaCreateAccount(IN LSA_HANDLE PolicyHandle, IN PSID AccountSid, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE AccountHandle) { NTSTATUS Status; TRACE("LsaCreateAccount(%p %p 0x%08lx %p)\n", PolicyHandle, AccountSid, DesiredAccess, AccountHandle); RpcTryExcept { Status = LsarCreateAccount((LSAPR_HANDLE)PolicyHandle, AccountSid, DesiredAccess, AccountHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaCreateSecret(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING SecretName, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE SecretHandle) { NTSTATUS Status; TRACE("LsaCreateSecret(%p %p 0x%08lx %p)\n", PolicyHandle, SecretName, DesiredAccess, SecretHandle); RpcTryExcept { Status = LsarCreateSecret((LSAPR_HANDLE)PolicyHandle, (PRPC_UNICODE_STRING)SecretName, DesiredAccess, SecretHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaCreateTrustedDomain(IN LSA_HANDLE PolicyHandle, IN PLSA_TRUST_INFORMATION TrustedDomainInformation, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE TrustedDomainHandle) { NTSTATUS Status; TRACE("LsaCreateTrustedDomain(%p %p 0x%08lx %p)\n", PolicyHandle, TrustedDomainInformation, DesiredAccess, TrustedDomainHandle); RpcTryExcept { Status = LsarCreateTrustedDomain((LSAPR_HANDLE)PolicyHandle, (PLSAPR_TRUST_INFORMATION)TrustedDomainInformation, DesiredAccess, (PLSAPR_HANDLE)TrustedDomainHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @unimplemented */ NTSTATUS WINAPI LsaCreateTrustedDomainEx(IN LSA_HANDLE PolicyHandle, IN PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation, IN PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE TrustedDomainHandle) { PLSAPR_TRUSTED_DOMAIN_AUTH_INFORMATION_INTERNAL EncryptedAuthInfo = NULL; NTSTATUS Status; TRACE("LsaCreateTrustedDomainEx(%p %p %p 0x%08lx %p) stub\n", PolicyHandle, TrustedDomainInformation, AuthenticationInformation, DesiredAccess, TrustedDomainHandle); RpcTryExcept { /* FIXME: Encrypt AuthenticationInformation */ Status = LsarCreateTrustedDomainEx2((LSAPR_HANDLE)PolicyHandle, (PLSAPR_TRUSTED_DOMAIN_INFORMATION_EX)TrustedDomainInformation, EncryptedAuthInfo, DesiredAccess, (PLSAPR_HANDLE)TrustedDomainHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaDelete(IN LSA_HANDLE ObjectHandle) { NTSTATUS Status; TRACE("LsaDelete(%p)\n", ObjectHandle); RpcTryExcept { Status = LsarDelete((LSAPR_HANDLE)ObjectHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaDeleteTrustedDomain(IN LSA_HANDLE PolicyHandle, IN PSID TrustedDomainSid) { NTSTATUS Status; TRACE("LsaDeleteTrustedDomain(%p %p)\n", PolicyHandle, TrustedDomainSid); RpcTryExcept { Status = LsarDeleteTrustedDomain((LSAPR_HANDLE)PolicyHandle, TrustedDomainSid); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaEnumerateAccountRights(IN LSA_HANDLE PolicyHandle, IN PSID AccountSid, OUT PLSA_UNICODE_STRING *UserRights, OUT PULONG CountOfRights) { LSAPR_USER_RIGHT_SET UserRightsSet; NTSTATUS Status; TRACE("LsaEnumerateAccountRights(%p %p %p %p)\n", PolicyHandle, AccountSid, UserRights, CountOfRights); UserRightsSet.Entries = 0; UserRightsSet.UserRights = NULL; RpcTryExcept { Status = LsarEnumerateAccountRights((LSAPR_HANDLE)PolicyHandle, AccountSid, &UserRightsSet); *UserRights = (PUNICODE_STRING)UserRightsSet.UserRights; *CountOfRights = UserRightsSet.Entries; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); if (UserRightsSet.UserRights != NULL) MIDL_user_free(UserRightsSet.UserRights); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaEnumerateAccounts(IN LSA_HANDLE PolicyHandle, IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned) { LSAPR_ACCOUNT_ENUM_BUFFER AccountEnumBuffer; NTSTATUS Status; TRACE("LsaEnumerateAccounts(%p %p %p %lu %p)\n", PolicyHandle, EnumerationContext, Buffer, PreferedMaximumLength, CountReturned); AccountEnumBuffer.EntriesRead = 0; AccountEnumBuffer.Information = NULL; RpcTryExcept { Status = LsarEnumerateAccounts((LSAPR_HANDLE)PolicyHandle, EnumerationContext, &AccountEnumBuffer, PreferedMaximumLength); *Buffer = AccountEnumBuffer.Information; *CountReturned = AccountEnumBuffer.EntriesRead; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (AccountEnumBuffer.Information != NULL) MIDL_user_free(AccountEnumBuffer.Information); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaEnumerateAccountsWithUserRight(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING UserRight OPTIONAL, OUT PVOID *Buffer, OUT PULONG CountReturned) { LSAPR_ACCOUNT_ENUM_BUFFER AccountEnumBuffer; NTSTATUS Status; TRACE("LsaEnumerateAccountsWithUserRight(%p %p %p %p) stub\n", PolicyHandle, UserRight, Buffer, CountReturned); AccountEnumBuffer.EntriesRead = 0; AccountEnumBuffer.Information = NULL; RpcTryExcept { Status = LsarEnumerateAccountsWithUserRight((LSAPR_HANDLE)PolicyHandle, (PRPC_UNICODE_STRING)UserRight, &AccountEnumBuffer); *Buffer = AccountEnumBuffer.Information; *CountReturned = AccountEnumBuffer.EntriesRead; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (AccountEnumBuffer.Information != NULL) MIDL_user_free(AccountEnumBuffer.Information); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaEnumeratePrivileges(IN LSA_HANDLE PolicyHandle, IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned) { LSAPR_PRIVILEGE_ENUM_BUFFER PrivilegeEnumBuffer; NTSTATUS Status; TRACE("LsaEnumeratePrivileges(%p %p %p %lu %p)\n", PolicyHandle, EnumerationContext, Buffer, PreferedMaximumLength, CountReturned); PrivilegeEnumBuffer.Entries = 0; PrivilegeEnumBuffer.Privileges = NULL; RpcTryExcept { Status = LsarEnumeratePrivileges((LSAPR_HANDLE)PolicyHandle, EnumerationContext, &PrivilegeEnumBuffer, PreferedMaximumLength); *Buffer = PrivilegeEnumBuffer.Privileges; *CountReturned = PrivilegeEnumBuffer.Entries; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (PrivilegeEnumBuffer.Privileges != NULL) MIDL_user_free(PrivilegeEnumBuffer.Privileges); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaEnumeratePrivilegesOfAccount(IN LSA_HANDLE AccountHandle, OUT PPRIVILEGE_SET *Privileges) { NTSTATUS Status; TRACE("LsaEnumeratePrivilegesOfAccount(%p %p)\n", AccountHandle, Privileges); RpcTryExcept { Status = LsarEnumeratePrivilegesAccount((LSAPR_HANDLE)AccountHandle, (LSAPR_PRIVILEGE_SET **)Privileges); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaEnumerateTrustedDomains(IN LSA_HANDLE PolicyHandle, IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned) { LSAPR_TRUSTED_ENUM_BUFFER TrustedEnumBuffer; NTSTATUS Status; TRACE("LsaEnumerateTrustedDomains(%p %p %p %lu %p)\n", PolicyHandle, EnumerationContext, Buffer, PreferedMaximumLength, CountReturned); if (Buffer == NULL) return STATUS_INVALID_PARAMETER; TrustedEnumBuffer.EntriesRead = 0; TrustedEnumBuffer.Information = NULL; RpcTryExcept { Status = LsarEnumerateTrustedDomains((LSAPR_HANDLE)PolicyHandle, EnumerationContext, &TrustedEnumBuffer, PreferedMaximumLength); *Buffer = TrustedEnumBuffer.Information; *CountReturned = TrustedEnumBuffer.EntriesRead; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (TrustedEnumBuffer.Information != NULL) MIDL_user_free(TrustedEnumBuffer.Information); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaEnumerateTrustedDomainsEx(IN LSA_HANDLE PolicyHandle, IN OUT PLSA_ENUMERATION_HANDLE EnumerationContext, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned) { LSAPR_TRUSTED_ENUM_BUFFER_EX TrustedEnumBuffer; NTSTATUS Status; TRACE("LsaEnumerateTrustedDomainsEx(%p %p %p %lu %p)\n", PolicyHandle, EnumerationContext, Buffer, PreferedMaximumLength, CountReturned); if (Buffer == NULL) return STATUS_INVALID_PARAMETER; TrustedEnumBuffer.EntriesRead = 0; TrustedEnumBuffer.EnumerationBuffer = NULL; RpcTryExcept { Status = LsarEnumerateTrustedDomainsEx((LSAPR_HANDLE)PolicyHandle, EnumerationContext, &TrustedEnumBuffer, PreferedMaximumLength); *Buffer = TrustedEnumBuffer.EnumerationBuffer; *CountReturned = TrustedEnumBuffer.EntriesRead; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (TrustedEnumBuffer.EnumerationBuffer != NULL) MIDL_user_free(TrustedEnumBuffer.EnumerationBuffer); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaFreeMemory(IN PVOID Buffer) { TRACE("LsaFreeMemory(%p)\n", Buffer); return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); } /* * @implemented */ NTSTATUS WINAPI LsaGetQuotasForAccount(IN LSA_HANDLE AccountHandle, OUT PQUOTA_LIMITS QuotaLimits) { NTSTATUS Status; TRACE("LsaGetQuotasForAccount(%p %p)\n", AccountHandle, QuotaLimits); RpcTryExcept { Status = LsarGetQuotasForAccount((LSAPR_HANDLE)AccountHandle, QuotaLimits); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaGetRemoteUserName(IN PLSA_UNICODE_STRING SystemName OPTIONAL, OUT PLSA_UNICODE_STRING *UserName, OUT PLSA_UNICODE_STRING *DomainName OPTIONAL) { PRPC_UNICODE_STRING UserNameString = NULL; PRPC_UNICODE_STRING DomainNameString = NULL; NTSTATUS Status; TRACE("LsaGetRemoteUserName(%s %p %p)\n", SystemName ? debugstr_w(SystemName->Buffer) : "(null)", UserName, DomainName); RpcTryExcept { Status = LsarGetUserName((PLSAPR_SERVER_NAME)SystemName, &UserNameString, (DomainName != NULL) ? &DomainNameString : NULL); *UserName = (PLSA_UNICODE_STRING)UserNameString; if (DomainName != NULL) *DomainName = (PLSA_UNICODE_STRING)DomainNameString; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (UserNameString != NULL) MIDL_user_free(UserNameString); if (DomainNameString != NULL) MIDL_user_free(DomainNameString); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaGetSystemAccessAccount(IN LSA_HANDLE AccountHandle, OUT PULONG SystemAccess) { NTSTATUS Status; TRACE("LsaGetSystemAccessAccount(%p %p)\n", AccountHandle, SystemAccess); RpcTryExcept { Status = LsarGetSystemAccessAccount((LSAPR_HANDLE)AccountHandle, (ACCESS_MASK *)SystemAccess); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaGetUserName(OUT PUNICODE_STRING *UserName, OUT PUNICODE_STRING *DomainName OPTIONAL) { PRPC_UNICODE_STRING UserNameString = NULL; PRPC_UNICODE_STRING DomainNameString = NULL; NTSTATUS Status; TRACE("LsaGetUserName(%p %p)\n", UserName, DomainName); RpcTryExcept { Status = LsarGetUserName(NULL, &UserNameString, (DomainName != NULL) ? &DomainNameString : NULL); *UserName = (PUNICODE_STRING)UserNameString; if (DomainName != NULL) *DomainName = (PUNICODE_STRING)DomainNameString; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (UserNameString != NULL) MIDL_user_free(UserNameString); if (DomainNameString != NULL) MIDL_user_free(DomainNameString); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaLookupNames(IN LSA_HANDLE PolicyHandle, IN ULONG Count, IN PLSA_UNICODE_STRING Names, OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, OUT PLSA_TRANSLATED_SID *Sids) { LSAPR_TRANSLATED_SIDS TranslatedSids = {0, NULL}; ULONG MappedCount = 0; NTSTATUS Status; TRACE("LsaLookupNames(%p %lu %p %p %p)\n", PolicyHandle, Count, Names, ReferencedDomains, Sids); if (ReferencedDomains == NULL || Sids == NULL) return STATUS_INVALID_PARAMETER; RpcTryExcept { *ReferencedDomains = NULL; *Sids = NULL; TranslatedSids.Entries = Count; Status = LsarLookupNames((LSAPR_HANDLE)PolicyHandle, Count, (PRPC_UNICODE_STRING)Names, (PLSAPR_REFERENCED_DOMAIN_LIST *)ReferencedDomains, &TranslatedSids, LsapLookupWksta, &MappedCount); *Sids = (PLSA_TRANSLATED_SID)TranslatedSids.Sids; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (TranslatedSids.Sids != NULL) MIDL_user_free(TranslatedSids.Sids); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaLookupNames2(IN LSA_HANDLE PolicyHandle, IN ULONG Flags, IN ULONG Count, IN PLSA_UNICODE_STRING Names, OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, OUT PLSA_TRANSLATED_SID2 *Sids) { LSAPR_TRANSLATED_SIDS_EX2 TranslatedSids = {0, NULL}; ULONG MappedCount = 0; NTSTATUS Status; TRACE("LsaLookupNames2(%p 0x%08x %lu %p %p %p)\n", PolicyHandle, Flags, Count, Names, ReferencedDomains, Sids); if (ReferencedDomains == NULL || Sids == NULL) return STATUS_INVALID_PARAMETER; RpcTryExcept { *ReferencedDomains = NULL; *Sids = NULL; TranslatedSids.Entries = Count; Status = LsarLookupNames3((LSAPR_HANDLE)PolicyHandle, Count, (PRPC_UNICODE_STRING)Names, (PLSAPR_REFERENCED_DOMAIN_LIST *)ReferencedDomains, &TranslatedSids, LsapLookupWksta, &MappedCount, Flags, 2); *Sids = (PLSA_TRANSLATED_SID2)TranslatedSids.Sids; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (TranslatedSids.Sids != NULL) MIDL_user_free(TranslatedSids.Sids); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaLookupPrivilegeDisplayName(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING Name, OUT PLSA_UNICODE_STRING *DisplayName, OUT PUSHORT LanguageReturned) { PRPC_UNICODE_STRING DisplayNameBuffer = NULL; NTSTATUS Status; TRACE("LsaLookupPrivilegeDisplayName(%p %p %p %p)\n", PolicyHandle, Name, DisplayName, LanguageReturned); RpcTryExcept { Status = LsarLookupPrivilegeDisplayName(PolicyHandle, (PRPC_UNICODE_STRING)Name, GetUserDefaultUILanguage(), GetSystemDefaultUILanguage(), &DisplayNameBuffer, LanguageReturned); *DisplayName = (PUNICODE_STRING)DisplayNameBuffer; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (DisplayNameBuffer != NULL) MIDL_user_free(DisplayNameBuffer); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaLookupPrivilegeName(IN LSA_HANDLE PolicyHandle, IN PLUID Value, OUT PUNICODE_STRING *Name) { PRPC_UNICODE_STRING NameBuffer = NULL; NTSTATUS Status; TRACE("LsaLookupPrivilegeName(%p %p %p)\n", PolicyHandle, Value, Name); RpcTryExcept { Status = LsarLookupPrivilegeName(PolicyHandle, Value, &NameBuffer); *Name = (PUNICODE_STRING)NameBuffer; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (NameBuffer != NULL) MIDL_user_free(NameBuffer); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaLookupPrivilegeValue(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING Name, OUT PLUID Value) { LUID Luid; NTSTATUS Status; TRACE("LsaLookupPrivilegeValue(%p %p %p)\n", PolicyHandle, Name, Value); RpcTryExcept { Status = LsarLookupPrivilegeValue(PolicyHandle, (PRPC_UNICODE_STRING)Name, &Luid); if (Status == STATUS_SUCCESS) *Value = Luid; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaLookupSids(IN LSA_HANDLE PolicyHandle, IN ULONG Count, IN PSID *Sids, OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, OUT PLSA_TRANSLATED_NAME *Names) { LSAPR_SID_ENUM_BUFFER SidEnumBuffer; LSAPR_TRANSLATED_NAMES TranslatedNames; ULONG MappedCount = 0; NTSTATUS Status; TRACE("LsaLookupSids(%p %lu %p %p %p)\n", PolicyHandle, Count, Sids, ReferencedDomains, Names); if (Count == 0) return STATUS_INVALID_PARAMETER; SidEnumBuffer.Entries = Count; SidEnumBuffer.SidInfo = (PLSAPR_SID_INFORMATION)Sids; RpcTryExcept { *ReferencedDomains = NULL; *Names = NULL; TranslatedNames.Entries = 0; TranslatedNames.Names = NULL; Status = LsarLookupSids((LSAPR_HANDLE)PolicyHandle, &SidEnumBuffer, (PLSAPR_REFERENCED_DOMAIN_LIST *)ReferencedDomains, &TranslatedNames, LsapLookupWksta, &MappedCount); *Names = (PLSA_TRANSLATED_NAME)TranslatedNames.Names; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (TranslatedNames.Names != NULL) { MIDL_user_free(TranslatedNames.Names); } Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /****************************************************************************** * LsaNtStatusToWinError * * PARAMS * Status [I] * * @implemented */ ULONG WINAPI LsaNtStatusToWinError(IN NTSTATUS Status) { TRACE("LsaNtStatusToWinError(0x%lx)\n", Status); return RtlNtStatusToDosError(Status); } /* * @implemented */ NTSTATUS WINAPI LsaOpenAccount(IN LSA_HANDLE PolicyHandle, IN PSID AccountSid, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE AccountHandle) { NTSTATUS Status; TRACE("LsaOpenAccount(%p %p 0x%08lx %p)\n", PolicyHandle, AccountSid, DesiredAccess, AccountHandle); RpcTryExcept { Status = LsarOpenAccount((LSAPR_HANDLE)PolicyHandle, AccountSid, DesiredAccess, AccountHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /****************************************************************************** * LsaOpenPolicy * * PARAMS * x1 [] * x2 [] * x3 [] * x4 [] * * @implemented */ NTSTATUS WINAPI LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName OPTIONAL, IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE PolicyHandle) { NTSTATUS Status; TRACE("LsaOpenPolicy(%s %p 0x%08lx %p)\n", SystemName ? debugstr_w(SystemName->Buffer) : "(null)", ObjectAttributes, DesiredAccess, PolicyHandle); /* FIXME: RPC should take care of this */ if (!LsapIsLocalComputer(SystemName)) return RPC_NT_SERVER_UNAVAILABLE; RpcTryExcept { *PolicyHandle = NULL; Status = LsarOpenPolicy(SystemName ? SystemName->Buffer : NULL, (PLSAPR_OBJECT_ATTRIBUTES)ObjectAttributes, DesiredAccess, PolicyHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; TRACE("LsaOpenPolicy() done (Status: 0x%08lx)\n", Status); return Status; } /* * @implemented */ NTSTATUS WINAPI LsaOpenPolicySce(IN PLSA_UNICODE_STRING SystemName OPTIONAL, IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE PolicyHandle) { NTSTATUS Status; TRACE("LsaOpenPolicySce(%s %p 0x%08lx %p)\n", SystemName ? debugstr_w(SystemName->Buffer) : "(null)", ObjectAttributes, DesiredAccess, PolicyHandle); /* FIXME: RPC should take care of this */ if (!LsapIsLocalComputer(SystemName)) return RPC_NT_SERVER_UNAVAILABLE; RpcTryExcept { *PolicyHandle = NULL; Status = LsarOpenPolicySce(SystemName ? SystemName->Buffer : NULL, (PLSAPR_OBJECT_ATTRIBUTES)ObjectAttributes, DesiredAccess, PolicyHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; TRACE("LsaOpenPolicySce() done (Status: 0x%08lx)\n", Status); return Status; } /* * @implemented */ NTSTATUS WINAPI LsaOpenSecret(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING SecretName, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE SecretHandle) { NTSTATUS Status; TRACE("LsaOpenSecret(%p %p 0x%08lx %p)\n", PolicyHandle, SecretName, DesiredAccess, SecretHandle); RpcTryExcept { *SecretHandle = NULL; Status = LsarOpenSecret((LSAPR_HANDLE)PolicyHandle, (PRPC_UNICODE_STRING)SecretName, DesiredAccess, SecretHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; TRACE("LsaOpenSecret() done (Status: 0x%08lx)\n", Status); return Status; } /* * @implemented */ NTSTATUS WINAPI LsaOpenTrustedDomain(IN LSA_HANDLE PolicyHandle, IN PSID TrustedDomainSid, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE TrustedDomainHandle) { NTSTATUS Status; TRACE("LsaOpenTrustedDomain(%p %p 0x%08lx %p)\n", PolicyHandle, TrustedDomainSid, DesiredAccess, TrustedDomainHandle); RpcTryExcept { Status = LsarOpenTrustedDomain((LSAPR_HANDLE)PolicyHandle, (PRPC_SID)TrustedDomainSid, DesiredAccess, (PLSAPR_HANDLE)TrustedDomainHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaOpenTrustedDomainByName(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING TrustedDomainName, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE TrustedDomainHandle) { NTSTATUS Status; TRACE("LsaOpenTrustedDomainByName(%p %p 0x%08lx %p)\n", PolicyHandle, TrustedDomainName, DesiredAccess, TrustedDomainHandle); RpcTryExcept { Status = LsarOpenTrustedDomainByName((LSAPR_HANDLE)PolicyHandle, (PRPC_UNICODE_STRING)TrustedDomainName, DesiredAccess, TrustedDomainHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaQueryDomainInformationPolicy(IN LSA_HANDLE PolicyHandle, IN POLICY_DOMAIN_INFORMATION_CLASS InformationClass, OUT PVOID *Buffer) { PLSAPR_POLICY_DOMAIN_INFORMATION PolicyInformation = NULL; NTSTATUS Status; TRACE("LsaQueryDomainInformationPolicy(%p %lu %p)\n", PolicyHandle, InformationClass, Buffer); RpcTryExcept { Status = LsarQueryDomainInformationPolicy((LSAPR_HANDLE)PolicyHandle, InformationClass, &PolicyInformation); *Buffer = PolicyInformation; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (PolicyInformation != NULL) MIDL_user_free(PolicyInformation); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaQueryForestTrustInformation(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING TrustedDomainName, OUT PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo) { NTSTATUS Status; TRACE("LsaQueryForestTrustInformation(%p %p %p)\n", PolicyHandle, TrustedDomainName, ForestTrustInfo); RpcTryExcept { Status = LsarQueryForestTrustInformation((LSAPR_HANDLE)PolicyHandle, TrustedDomainName, ForestTrustDomainInfo, ForestTrustInfo); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaQueryInfoTrustedDomain(IN LSA_HANDLE TrustedDomainHandle, IN TRUSTED_INFORMATION_CLASS InformationClass, OUT PVOID *Buffer) { PLSAPR_TRUSTED_DOMAIN_INFO TrustedDomainInformation = NULL; NTSTATUS Status; TRACE("LsaQueryInfoTrustedDomain(%p %d %p) stub\n", TrustedDomainHandle, InformationClass, Buffer); if (InformationClass == TrustedDomainAuthInformationInternal || InformationClass == TrustedDomainFullInformationInternal) return STATUS_INVALID_INFO_CLASS; RpcTryExcept { Status = LsarQueryInfoTrustedDomain((LSAPR_HANDLE)TrustedDomainHandle, InformationClass, &TrustedDomainInformation); *Buffer = TrustedDomainInformation; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (TrustedDomainInformation != NULL) MIDL_user_free(TrustedDomainInformation); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; TRACE("Done (Status: 0x%08x)\n", Status); return Status; } /* * @implemented */ NTSTATUS WINAPI LsaQueryInformationPolicy(IN LSA_HANDLE PolicyHandle, IN POLICY_INFORMATION_CLASS InformationClass, OUT PVOID *Buffer) { PLSAPR_POLICY_INFORMATION PolicyInformation = NULL; NTSTATUS Status; TRACE("LsaQueryInformationPolicy(%p %d %p)\n", PolicyHandle, InformationClass, Buffer); RpcTryExcept { Status = LsarQueryInformationPolicy((LSAPR_HANDLE)PolicyHandle, InformationClass, &PolicyInformation); *Buffer = PolicyInformation; } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (PolicyInformation != NULL) MIDL_user_free(PolicyInformation); Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; TRACE("Done (Status: 0x%08x)\n", Status); return Status; } /* * @implemented */ NTSTATUS WINAPI LsaQuerySecret(IN LSA_HANDLE SecretHandle, OUT PLSA_UNICODE_STRING *CurrentValue OPTIONAL, OUT PLARGE_INTEGER CurrentValueSetTime OPTIONAL, OUT PLSA_UNICODE_STRING *OldValue OPTIONAL, OUT PLARGE_INTEGER OldValueSetTime OPTIONAL) { PLSAPR_CR_CIPHER_VALUE EncryptedCurrentValue = NULL; PLSAPR_CR_CIPHER_VALUE EncryptedOldValue = NULL; PLSA_UNICODE_STRING DecryptedCurrentValue = NULL; PLSA_UNICODE_STRING DecryptedOldValue = NULL; SIZE_T BufferSize; NTSTATUS Status; TRACE("LsaQuerySecret(%p %p %p %p %p)\n", SecretHandle, CurrentValue, CurrentValueSetTime, OldValue, OldValueSetTime); RpcTryExcept { Status = LsarQuerySecret((PLSAPR_HANDLE)SecretHandle, &EncryptedCurrentValue, CurrentValueSetTime, &EncryptedOldValue, OldValueSetTime); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; if (!NT_SUCCESS(Status)) goto done; /* Decrypt the current value */ if (CurrentValue != NULL) { if (EncryptedCurrentValue == NULL) { *CurrentValue = NULL; } else { /* FIXME: Decrypt the current value */ BufferSize = sizeof(LSA_UNICODE_STRING) + EncryptedCurrentValue->MaximumLength; DecryptedCurrentValue = midl_user_allocate(BufferSize); if (DecryptedCurrentValue == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; } DecryptedCurrentValue->Length = (USHORT)EncryptedCurrentValue->Length; DecryptedCurrentValue->MaximumLength = (USHORT)EncryptedCurrentValue->MaximumLength; DecryptedCurrentValue->Buffer = (PWSTR)(DecryptedCurrentValue + 1); RtlCopyMemory(DecryptedCurrentValue->Buffer, EncryptedCurrentValue->Buffer, EncryptedCurrentValue->Length); *CurrentValue = DecryptedCurrentValue; } } /* Decrypt the old value */ if (OldValue != NULL) { if (EncryptedOldValue == NULL) { *OldValue = NULL; } else { /* FIXME: Decrypt the old value */ BufferSize = sizeof(LSA_UNICODE_STRING) + EncryptedOldValue->MaximumLength; DecryptedOldValue = midl_user_allocate(BufferSize); if (DecryptedOldValue == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; } DecryptedOldValue->Length = (USHORT)EncryptedOldValue->Length; DecryptedOldValue->MaximumLength = (USHORT)EncryptedOldValue->MaximumLength; DecryptedOldValue->Buffer = (PWSTR)(DecryptedOldValue + 1); RtlCopyMemory(DecryptedOldValue->Buffer, EncryptedOldValue->Buffer, EncryptedOldValue->Length); *OldValue = DecryptedOldValue; } } done: if (!NT_SUCCESS(Status)) { if (DecryptedCurrentValue != NULL) midl_user_free(DecryptedCurrentValue); if (DecryptedOldValue != NULL) midl_user_free(DecryptedOldValue); if (CurrentValue != NULL) *CurrentValue = NULL; if (OldValue != NULL) *OldValue = NULL; } if (EncryptedCurrentValue != NULL) midl_user_free(EncryptedCurrentValue); if (EncryptedOldValue != NULL) midl_user_free(EncryptedOldValue); return Status; } /* * @implemented */ NTSTATUS WINAPI LsaQuerySecurityObject(IN LSA_HANDLE ObjectHandle, IN SECURITY_INFORMATION SecurityInformation, OUT PSECURITY_DESCRIPTOR *SecurityDescriptor) { LSAPR_SR_SECURITY_DESCRIPTOR SdBuffer; PLSAPR_SR_SECURITY_DESCRIPTOR SdPointer; NTSTATUS Status; TRACE("LsaQuerySecurityObject(%p %lx %p)\n", ObjectHandle, SecurityInformation, SecurityDescriptor); SdBuffer.Length = 0; SdBuffer.SecurityDescriptor = NULL; SdPointer = &SdBuffer; RpcTryExcept { Status = LsarQuerySecurityObject((LSAPR_HANDLE)ObjectHandle, SecurityInformation, &SdPointer); if (NT_SUCCESS(Status)) { *SecurityDescriptor = SdBuffer.SecurityDescriptor; } else { *SecurityDescriptor = NULL; } } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaQueryTrustedDomainInfo(IN LSA_HANDLE PolicyHandle, IN PSID TrustedDomainSid, IN TRUSTED_INFORMATION_CLASS InformationClass, OUT PVOID *Buffer) { NTSTATUS Status; TRACE("LsaQueryTrustedDomainInfo(%p %p %d %p) stub\n", PolicyHandle, TrustedDomainSid, InformationClass, Buffer); if (InformationClass == TrustedDomainAuthInformationInternal || InformationClass == TrustedDomainFullInformationInternal) return STATUS_INVALID_INFO_CLASS; RpcTryExcept { Status = LsarQueryTrustedDomainInfo((LSAPR_HANDLE)PolicyHandle, (PRPC_SID)TrustedDomainSid, InformationClass, (PLSAPR_TRUSTED_DOMAIN_INFO *)Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaQueryTrustedDomainInfoByName(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING TrustedDomainName, IN TRUSTED_INFORMATION_CLASS InformationClass, OUT PVOID *Buffer) { NTSTATUS Status; TRACE("LsaQueryTrustedDomainInfoByName(%p %p %d %p)\n", PolicyHandle, TrustedDomainName, InformationClass, Buffer); if (InformationClass == TrustedDomainAuthInformationInternal || InformationClass == TrustedDomainFullInformationInternal) return STATUS_INVALID_INFO_CLASS; RpcTryExcept { Status = LsarQueryTrustedDomainInfoByName((LSAPR_HANDLE)PolicyHandle, (PRPC_UNICODE_STRING)TrustedDomainName, InformationClass, (PLSAPR_TRUSTED_DOMAIN_INFO *)Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaRemoveAccountRights(IN LSA_HANDLE PolicyHandle, IN PSID AccountSid, IN BOOLEAN AllRights, IN PLSA_UNICODE_STRING UserRights, IN ULONG CountOfRights) { NTSTATUS Status; LSAPR_USER_RIGHT_SET UserRightSet; TRACE("LsaRemoveAccountRights(%p %p %d %p %lu)\n", PolicyHandle, AccountSid, AllRights, UserRights, CountOfRights); UserRightSet.Entries = CountOfRights; UserRightSet.UserRights = (PRPC_UNICODE_STRING)UserRights; RpcTryExcept { Status = LsarRemoveAccountRights((LSAPR_HANDLE)PolicyHandle, (PRPC_SID)AccountSid, AllRights, &UserRightSet); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaRemovePrivilegesFromAccount(IN LSA_HANDLE AccountHandle, IN BOOLEAN AllPrivileges, IN PPRIVILEGE_SET Privileges OPTIONAL) { NTSTATUS Status; RpcTryExcept { Status = LsarRemovePrivilegesFromAccount((LSAPR_HANDLE)AccountHandle, AllPrivileges, (PLSAPR_PRIVILEGE_SET)Privileges); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaRetrievePrivateData(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING KeyName, OUT PLSA_UNICODE_STRING *PrivateData) { PLSAPR_CR_CIPHER_VALUE EncryptedData = NULL; PLSA_UNICODE_STRING DecryptedData = NULL; SIZE_T BufferSize; NTSTATUS Status; TRACE("LsaRetrievePrivateData(%p %p %p)\n", PolicyHandle, KeyName, PrivateData); RpcTryExcept { Status = LsarRetrievePrivateData((LSAPR_HANDLE)PolicyHandle, (PRPC_UNICODE_STRING)KeyName, &EncryptedData); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; if (EncryptedData == NULL) { *PrivateData = NULL; } else { BufferSize = sizeof(LSA_UNICODE_STRING) + EncryptedData->MaximumLength; DecryptedData = midl_user_allocate(BufferSize); if (DecryptedData == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; } DecryptedData->Length = (USHORT)EncryptedData->Length; DecryptedData->MaximumLength = (USHORT)EncryptedData->MaximumLength; DecryptedData->Buffer = (PWSTR)(DecryptedData + 1); RtlCopyMemory(DecryptedData->Buffer, EncryptedData->Buffer, EncryptedData->Length); *PrivateData = DecryptedData; } done: if (!NT_SUCCESS(Status)) { if (DecryptedData != NULL) midl_user_free(DecryptedData); *PrivateData = NULL; } if (EncryptedData != NULL) midl_user_free(EncryptedData); return Status; } /* * @implemented */ NTSTATUS WINAPI LsaSetDomainInformationPolicy(IN LSA_HANDLE PolicyHandle, IN POLICY_DOMAIN_INFORMATION_CLASS InformationClass, IN PVOID Buffer OPTIONAL) { NTSTATUS Status; TRACE("LsaSetDomainInformationPolicy(%p %d %p)\n", PolicyHandle, InformationClass, Buffer); RpcTryExcept { Status = LsarSetDomainInformationPolicy((LSAPR_HANDLE)PolicyHandle, InformationClass, (PLSAPR_POLICY_DOMAIN_INFORMATION)Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaSetForestTrustInformation(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING TrustedDomainName, IN PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo, IN BOOLEAN CheckOnly, OUT PLSA_FOREST_TRUST_COLLISION_INFORMATION *CollisionInfo) { NTSTATUS Status; TRACE("LsaSetForestTrustInformation(%p %p %p %d %p)\n", PolicyHandle, TrustedDomainName, ForestTrustInfo, CheckOnly, CollisionInfo); RpcTryExcept { Status = LsarSetForestTrustInformation((LSAPR_HANDLE)PolicyHandle, TrustedDomainName, ForestTrustDomainInfo, ForestTrustInfo, CheckOnly, CollisionInfo); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaSetInformationPolicy(IN LSA_HANDLE PolicyHandle, IN POLICY_INFORMATION_CLASS InformationClass, IN PVOID Buffer) { NTSTATUS Status; TRACE("LsaSetInformationPolicy(%p %d %p)\n", PolicyHandle, InformationClass, Buffer); RpcTryExcept { Status = LsarSetInformationPolicy((LSAPR_HANDLE)PolicyHandle, InformationClass, (PLSAPR_POLICY_INFORMATION)Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @unimplemented */ NTSTATUS WINAPI LsaSetInformationTrustedDomain(IN LSA_HANDLE TrustedDomainHandle, IN TRUSTED_INFORMATION_CLASS InformationClass, IN PVOID Buffer) { FIXME("LsaSetInformationTrustedDomain(%p %d %p)\n", TrustedDomainHandle, InformationClass, Buffer); return STATUS_NOT_IMPLEMENTED; } /* * @implemented */ NTSTATUS WINAPI LsaSetQuotasForAccount(IN LSA_HANDLE AccountHandle, IN PQUOTA_LIMITS QuotaLimits) { NTSTATUS Status; TRACE("LsaSetQuotasForAccount(%p %p)\n", AccountHandle, QuotaLimits); RpcTryExcept { Status = LsarSetQuotasForAccount((LSAPR_HANDLE)AccountHandle, QuotaLimits); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @implemented */ NTSTATUS WINAPI LsaSetSecret(IN LSA_HANDLE SecretHandle, IN PLSA_UNICODE_STRING CurrentValue OPTIONAL, IN PLSA_UNICODE_STRING OldValue OPTIONAL) { PLSAPR_CR_CIPHER_VALUE EncryptedCurrentValue = NULL; PLSAPR_CR_CIPHER_VALUE EncryptedOldValue = NULL; SIZE_T BufferSize; NTSTATUS Status; TRACE("LsaSetSecret(%p %p %p)\n", SecretHandle, EncryptedCurrentValue, EncryptedOldValue); if (CurrentValue != NULL) { BufferSize = sizeof(LSAPR_CR_CIPHER_VALUE) + CurrentValue->MaximumLength; EncryptedCurrentValue = midl_user_allocate(BufferSize); if (EncryptedCurrentValue == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; } EncryptedCurrentValue->Length = CurrentValue->Length; EncryptedCurrentValue->MaximumLength = CurrentValue->MaximumLength; EncryptedCurrentValue->Buffer = (BYTE *)(EncryptedCurrentValue + 1); if (EncryptedCurrentValue->Buffer != NULL) memcpy(EncryptedCurrentValue->Buffer, CurrentValue->Buffer, CurrentValue->Length); } if (OldValue != NULL) { BufferSize = sizeof(LSAPR_CR_CIPHER_VALUE) + OldValue->MaximumLength; EncryptedOldValue = midl_user_allocate(BufferSize); if (EncryptedOldValue == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; } EncryptedOldValue->Length = OldValue->Length; EncryptedOldValue->MaximumLength = OldValue->MaximumLength; EncryptedOldValue->Buffer = (BYTE*)(EncryptedOldValue + 1); if (EncryptedOldValue->Buffer != NULL) memcpy(EncryptedOldValue->Buffer, OldValue->Buffer, OldValue->Length); } RpcTryExcept { Status = LsarSetSecret((LSAPR_HANDLE)SecretHandle, EncryptedCurrentValue, EncryptedOldValue); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; done: if (EncryptedCurrentValue != NULL) midl_user_free(EncryptedCurrentValue); if (EncryptedOldValue != NULL) midl_user_free(EncryptedOldValue); return Status; } /* * @implemented */ NTSTATUS WINAPI LsaSetSecurityObject(IN LSA_HANDLE ObjectHandle, IN SECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor) { LSAPR_SR_SECURITY_DESCRIPTOR SdBuffer = {0, NULL}; ULONG SdLength = 0; NTSTATUS Status; TRACE("LsaSetSecurityObject(%p %lx %p)\n", ObjectHandle, SecurityInformation, SecurityDescriptor); Status = RtlMakeSelfRelativeSD(SecurityDescriptor, NULL, &SdLength); if (Status != STATUS_BUFFER_TOO_SMALL) return STATUS_INVALID_PARAMETER; SdBuffer.SecurityDescriptor = MIDL_user_allocate(SdLength); if (SdBuffer.SecurityDescriptor == NULL) return STATUS_INSUFFICIENT_RESOURCES; Status = RtlMakeSelfRelativeSD(SecurityDescriptor, (PSECURITY_DESCRIPTOR)SdBuffer.SecurityDescriptor, &SdLength); if (!NT_SUCCESS(Status)) goto done; SdBuffer.Length = SdLength; RpcTryExcept { Status = LsarSetSecurityObject((LSAPR_HANDLE)ObjectHandle, SecurityInformation, &SdBuffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; done: if (SdBuffer.SecurityDescriptor != NULL) MIDL_user_free(SdBuffer.SecurityDescriptor); return Status; } /* * @implemented */ NTSTATUS WINAPI LsaSetSystemAccessAccount(IN LSA_HANDLE AccountHandle, IN ULONG SystemAccess) { NTSTATUS Status; TRACE("LsaSetSystemAccessAccount(%p 0x%lx)\n", AccountHandle, SystemAccess); RpcTryExcept { Status = LsarSetSystemAccessAccount((LSAPR_HANDLE)AccountHandle, SystemAccess); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; return Status; } /* * @unimplemented */ NTSTATUS WINAPI LsaSetTrustedDomainInfoByName(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING TrustedDomainName, IN TRUSTED_INFORMATION_CLASS InformationClass, IN PVOID Buffer) { FIXME("LsaSetTrustedDomainInfoByName(%p %p %d %p) stub\n", PolicyHandle, TrustedDomainName, InformationClass, Buffer); return STATUS_SUCCESS; } /* * @unimplemented */ NTSTATUS WINAPI LsaSetTrustedDomainInformation(IN LSA_HANDLE PolicyHandle, IN PSID TrustedDomainSid, IN TRUSTED_INFORMATION_CLASS InformationClass, IN PVOID Buffer) { FIXME("LsaSetTrustedDomainInformation(%p %p %d %p) stub\n", PolicyHandle, TrustedDomainSid, InformationClass, Buffer); return STATUS_SUCCESS; } /* * @implemented */ NTSTATUS WINAPI LsaStorePrivateData(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING KeyName, IN PLSA_UNICODE_STRING PrivateData OPTIONAL) { PLSAPR_CR_CIPHER_VALUE EncryptedData = NULL; SIZE_T BufferSize; NTSTATUS Status; TRACE("LsaStorePrivateData(%p %p %p)\n", PolicyHandle, KeyName, PrivateData); if (PrivateData != NULL) { BufferSize = sizeof(LSAPR_CR_CIPHER_VALUE) + PrivateData->MaximumLength; EncryptedData = midl_user_allocate(BufferSize); if (EncryptedData == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; } EncryptedData->Length = PrivateData->Length; EncryptedData->MaximumLength = PrivateData->MaximumLength; EncryptedData->Buffer = (BYTE *)(EncryptedData + 1); if (EncryptedData->Buffer != NULL) RtlCopyMemory(EncryptedData->Buffer, PrivateData->Buffer, PrivateData->Length); } RpcTryExcept { Status = LsarStorePrivateData((LSAPR_HANDLE)PolicyHandle, (PRPC_UNICODE_STRING)KeyName, EncryptedData); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept; done: if (EncryptedData != NULL) midl_user_free(EncryptedData); return Status; } /* EOF */