reactos/dll/win32/advapi32/sec/lsa.c
David L Bean dcaf5686ce
[ADVAPI32] Don't treat a structure pointer as a string pointer (#5478)
Add a string pointer local variable, assign it and operate on it.
This should eliminate an exception and make LsapIsLocalComputer()
function operate correctly.

CORE-18996
2023-07-27 01:58:44 +03:00

2258 lines
58 KiB
C

/*
* 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 <advapi32.h>
#include <lsa_c.h>
WINE_DEFAULT_DEBUG_CHANNEL(advapi);
static
BOOL
LsapIsLocalComputer(PLSA_UNICODE_STRING ServerName)
{
DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
BOOL Result;
LPWSTR buf;
PCWSTR pSrvName;
if (ServerName == NULL || ServerName->Length == 0 || ServerName->Buffer == NULL)
return TRUE;
pSrvName = ServerName->Buffer;
buf = HeapAlloc(GetProcessHeap(), 0, dwSize * sizeof(WCHAR));
Result = GetComputerNameW(buf, &dwSize);
if (Result && (pSrvName[0] == L'\\') && (pSrvName[1] == L'\\'))
pSrvName += 2;
Result = Result && !lstrcmpW(pSrvName, 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 */