mirror of
https://github.com/reactos/reactos.git
synced 2025-01-04 21:38:43 +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_REFERENCED_DOMAIN_LIST *ReferencedDomains,
|
||||||
OUT PLSA_TRANSLATED_SID *Sids)
|
OUT PLSA_TRANSLATED_SID *Sids)
|
||||||
{
|
{
|
||||||
LSAPR_TRANSLATED_SIDS TranslatedSids;
|
LSAPR_TRANSLATED_SIDS TranslatedSids = {0, NULL};
|
||||||
ULONG MappedCount = 0;
|
ULONG MappedCount = 0;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle, Count, Names,
|
TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle, Count, Names,
|
||||||
ReferencedDomains, Sids);
|
ReferencedDomains, Sids);
|
||||||
|
|
||||||
|
if (ReferencedDomains == NULL || Sids == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
*ReferencedDomains = NULL;
|
*ReferencedDomains = NULL;
|
||||||
*Sids = NULL;
|
*Sids = NULL;
|
||||||
|
|
||||||
TranslatedSids.Entries = Count;
|
TranslatedSids.Entries = Count;
|
||||||
TranslatedSids.Sids = *Sids;
|
|
||||||
|
|
||||||
Status = LsarLookupNames((LSAPR_HANDLE)PolicyHandle,
|
Status = LsarLookupNames((LSAPR_HANDLE)PolicyHandle,
|
||||||
Count,
|
Count,
|
||||||
|
@ -458,9 +460,7 @@ LsaLookupNames(IN LSA_HANDLE PolicyHandle,
|
||||||
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
if (TranslatedSids.Sids != NULL)
|
if (TranslatedSids.Sids != NULL)
|
||||||
{
|
|
||||||
MIDL_user_free(TranslatedSids.Sids);
|
MIDL_user_free(TranslatedSids.Sids);
|
||||||
}
|
|
||||||
|
|
||||||
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
}
|
}
|
||||||
|
@ -471,27 +471,56 @@ LsaLookupNames(IN LSA_HANDLE PolicyHandle,
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
WINAPI
|
WINAPI
|
||||||
LsaLookupNames2(
|
LsaLookupNames2(IN LSA_HANDLE PolicyHandle,
|
||||||
LSA_HANDLE PolicyHandle,
|
IN ULONG Flags,
|
||||||
ULONG Flags,
|
IN ULONG Count,
|
||||||
ULONG Count,
|
IN PLSA_UNICODE_STRING Names,
|
||||||
PLSA_UNICODE_STRING Names,
|
OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
|
||||||
PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
|
OUT PLSA_TRANSLATED_SID2 *Sids)
|
||||||
PLSA_TRANSLATED_SID2 *Sids)
|
|
||||||
{
|
{
|
||||||
FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle, Flags,
|
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);
|
Count, Names, ReferencedDomains, Sids);
|
||||||
if (Names != NULL && Count > 0)
|
|
||||||
|
if (ReferencedDomains == NULL || Sids == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
*ReferencedDomains = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST));
|
*ReferencedDomains = NULL;
|
||||||
*Sids = RtlAllocateHeap(RtlGetProcessHeap(), 0, Count * sizeof(LSA_TRANSLATED_SID2));
|
*Sids = NULL;
|
||||||
return STATUS_SOME_NOT_MAPPED;
|
|
||||||
|
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;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @unimplemented
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -554,7 +554,7 @@ NTSTATUS WINAPI LsarLookupNames(
|
||||||
for (i = 0; i < Count; i++)
|
for (i = 0; i < Count; i++)
|
||||||
{
|
{
|
||||||
OutputSids[i].Use = SidTypeWellKnownGroup;
|
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;
|
OutputSids[i].DomainIndex = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1293,8 +1293,126 @@ NTSTATUS WINAPI LsarLookupNames3(
|
||||||
DWORD LookupOptions,
|
DWORD LookupOptions,
|
||||||
DWORD ClientRevision)
|
DWORD ClientRevision)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
SID_IDENTIFIER_AUTHORITY IdentifierAuthority = {SECURITY_NT_AUTHORITY};
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
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