mirror of
https://github.com/reactos/reactos.git
synced 2024-12-30 19:14:31 +00:00
[ADVAPI32/LSASRV]
- Implement LsaLookupNames2 in advapi32.dll. - Implement LsarLookupNames3 in lsasrv.dll as a mock-up which returns a hard-coded user account (Administrator). This fixes several wine tests. svn path=/trunk/; revision=51257
This commit is contained in:
parent
862d46f96e
commit
35a75304b7
2 changed files with 170 additions and 22 deletions
|
@ -430,20 +430,22 @@ LsaLookupNames(IN LSA_HANDLE PolicyHandle,
|
|||
OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
|
||||
OUT PLSA_TRANSLATED_SID *Sids)
|
||||
{
|
||||
LSAPR_TRANSLATED_SIDS TranslatedSids;
|
||||
LSAPR_TRANSLATED_SIDS TranslatedSids = {0, NULL};
|
||||
ULONG MappedCount = 0;
|
||||
NTSTATUS Status;
|
||||
|
||||
TRACE("(%p,0x%08x,%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;
|
||||
TranslatedSids.Sids = *Sids;
|
||||
|
||||
Status = LsarLookupNames((LSAPR_HANDLE)PolicyHandle,
|
||||
Count,
|
||||
|
@ -458,9 +460,7 @@ LsaLookupNames(IN LSA_HANDLE PolicyHandle,
|
|||
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
if (TranslatedSids.Sids != NULL)
|
||||
{
|
||||
MIDL_user_free(TranslatedSids.Sids);
|
||||
}
|
||||
|
||||
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||
}
|
||||
|
@ -471,27 +471,56 @@ LsaLookupNames(IN LSA_HANDLE PolicyHandle,
|
|||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
NTSTATUS
|
||||
WINAPI
|
||||
LsaLookupNames2(
|
||||
LSA_HANDLE PolicyHandle,
|
||||
ULONG Flags,
|
||||
ULONG Count,
|
||||
PLSA_UNICODE_STRING Names,
|
||||
PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
|
||||
PLSA_TRANSLATED_SID2 *Sids)
|
||||
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)
|
||||
{
|
||||
FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle, Flags,
|
||||
Count, Names, ReferencedDomains, Sids);
|
||||
if (Names != NULL && Count > 0)
|
||||
LSAPR_TRANSLATED_SIDS_EX2 TranslatedSids = {0, NULL};
|
||||
ULONG MappedCount = 0;
|
||||
NTSTATUS Status;
|
||||
|
||||
TRACE("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle, Flags,
|
||||
Count, Names, ReferencedDomains, Sids);
|
||||
|
||||
if (ReferencedDomains == NULL || Sids == NULL)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
RpcTryExcept
|
||||
{
|
||||
*ReferencedDomains = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST));
|
||||
*Sids = RtlAllocateHeap(RtlGetProcessHeap(), 0, Count * sizeof(LSA_TRANSLATED_SID2));
|
||||
return STATUS_SOME_NOT_MAPPED;
|
||||
*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;
|
||||
}
|
||||
return STATUS_NONE_MAPPED;
|
||||
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
if (TranslatedSids.Sids != NULL)
|
||||
MIDL_user_free(TranslatedSids.Sids);
|
||||
|
||||
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||
}
|
||||
RpcEndExcept;
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
@ -762,6 +791,7 @@ LsaQueryDomainInformationPolicy(
|
|||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
|
|
|
@ -554,7 +554,7 @@ NTSTATUS WINAPI LsarLookupNames(
|
|||
for (i = 0; i < Count; i++)
|
||||
{
|
||||
OutputSids[i].Use = SidTypeWellKnownGroup;
|
||||
OutputSids[i].RelativeId = DOMAIN_ALIAS_RID_ADMINS;
|
||||
OutputSids[i].RelativeId = DOMAIN_USER_RID_ADMIN; //DOMAIN_ALIAS_RID_ADMINS;
|
||||
OutputSids[i].DomainIndex = i;
|
||||
}
|
||||
|
||||
|
@ -1293,8 +1293,126 @@ NTSTATUS WINAPI LsarLookupNames3(
|
|||
DWORD LookupOptions,
|
||||
DWORD ClientRevision)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
SID_IDENTIFIER_AUTHORITY IdentifierAuthority = {SECURITY_NT_AUTHORITY};
|
||||
static const UNICODE_STRING DomainName = RTL_CONSTANT_STRING(L"DOMAIN");
|
||||
PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer = NULL;
|
||||
PLSAPR_TRANSLATED_SID_EX2 SidsBuffer = NULL;
|
||||
ULONG SidsBufferLength;
|
||||
ULONG DomainSidLength;
|
||||
ULONG AccountSidLength;
|
||||
PSID DomainSid;
|
||||
PSID AccountSid;
|
||||
ULONG i;
|
||||
NTSTATUS Status;
|
||||
|
||||
TRACE("LsarLookupNames3(%p, %lu, %p, %p, %p, %d, %p, %lu, %lu)\n",
|
||||
PolicyHandle, Count, Names, ReferencedDomains, TranslatedSids,
|
||||
LookupLevel, MappedCount, LookupOptions, ClientRevision);
|
||||
|
||||
if (Count == 0)
|
||||
return STATUS_NONE_MAPPED;
|
||||
|
||||
TranslatedSids->Entries = Count;
|
||||
TranslatedSids->Sids = NULL;
|
||||
*ReferencedDomains = NULL;
|
||||
|
||||
SidsBufferLength = Count * sizeof(LSAPR_TRANSLATED_SID_EX2);
|
||||
SidsBuffer = MIDL_user_allocate(SidsBufferLength);
|
||||
if (SidsBuffer == NULL)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
for (i = 0; i < Count; i++)
|
||||
{
|
||||
SidsBuffer[i].Use = SidTypeUser;
|
||||
SidsBuffer[i].Sid = NULL;
|
||||
SidsBuffer[i].DomainIndex = -1;
|
||||
SidsBuffer[i].Flags = 0;
|
||||
}
|
||||
|
||||
DomainsBuffer = MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST));
|
||||
if (DomainsBuffer == NULL)
|
||||
{
|
||||
MIDL_user_free(SidsBuffer);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
DomainsBuffer->Entries = Count;
|
||||
DomainsBuffer->Domains = MIDL_user_allocate(Count * sizeof(LSA_TRUST_INFORMATION));
|
||||
if (DomainsBuffer->Domains == NULL)
|
||||
{
|
||||
MIDL_user_free(DomainsBuffer);
|
||||
MIDL_user_free(SidsBuffer);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
Status = RtlAllocateAndInitializeSid(&IdentifierAuthority,
|
||||
2,
|
||||
SECURITY_BUILTIN_DOMAIN_RID,
|
||||
DOMAIN_ALIAS_RID_ADMINS,
|
||||
0, 0, 0, 0, 0, 0,
|
||||
&DomainSid);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
MIDL_user_free(DomainsBuffer->Domains);
|
||||
MIDL_user_free(DomainsBuffer);
|
||||
MIDL_user_free(SidsBuffer);
|
||||
return Status;
|
||||
}
|
||||
|
||||
DomainSidLength = RtlLengthSid(DomainSid);
|
||||
|
||||
for (i = 0; i < Count; i++)
|
||||
{
|
||||
DomainsBuffer->Domains[i].Sid = MIDL_user_allocate(DomainSidLength);
|
||||
RtlCopyMemory(DomainsBuffer->Domains[i].Sid,
|
||||
DomainSid,
|
||||
DomainSidLength);
|
||||
|
||||
DomainsBuffer->Domains[i].Name.Buffer = MIDL_user_allocate(DomainName.MaximumLength);
|
||||
DomainsBuffer->Domains[i].Name.Length = DomainName.Length;
|
||||
DomainsBuffer->Domains[i].Name.MaximumLength = DomainName.MaximumLength;
|
||||
RtlCopyMemory(DomainsBuffer->Domains[i].Name.Buffer,
|
||||
DomainName.Buffer,
|
||||
DomainName.MaximumLength);
|
||||
}
|
||||
|
||||
Status = RtlAllocateAndInitializeSid(&IdentifierAuthority,
|
||||
3,
|
||||
SECURITY_BUILTIN_DOMAIN_RID,
|
||||
DOMAIN_ALIAS_RID_ADMINS,
|
||||
DOMAIN_USER_RID_ADMIN,
|
||||
0, 0, 0, 0, 0,
|
||||
&AccountSid);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
MIDL_user_free(DomainsBuffer->Domains);
|
||||
MIDL_user_free(DomainsBuffer);
|
||||
MIDL_user_free(SidsBuffer);
|
||||
return Status;
|
||||
}
|
||||
|
||||
AccountSidLength = RtlLengthSid(AccountSid);
|
||||
|
||||
for (i = 0; i < Count; i++)
|
||||
{
|
||||
SidsBuffer[i].Use = SidTypeWellKnownGroup;
|
||||
SidsBuffer[i].Sid = MIDL_user_allocate(AccountSidLength);
|
||||
|
||||
RtlCopyMemory(SidsBuffer[i].Sid,
|
||||
AccountSid,
|
||||
AccountSidLength);
|
||||
|
||||
SidsBuffer[i].DomainIndex = i;
|
||||
SidsBuffer[i].Flags = 0;
|
||||
}
|
||||
|
||||
*ReferencedDomains = DomainsBuffer;
|
||||
*MappedCount = Count;
|
||||
|
||||
TranslatedSids->Entries = Count;
|
||||
TranslatedSids->Sids = SidsBuffer;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue