[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:
Eric Kohl 2011-04-04 22:08:45 +00:00
parent 862d46f96e
commit 35a75304b7
2 changed files with 170 additions and 22 deletions

View file

@ -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
*/ */

View file

@ -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;
} }