Author: ekohl Date: Sat Jul 17 18:15:34 2010 New Revision: 48101
URL: http://svn.reactos.org/svn/reactos?rev=48101&view=rev Log: [LSASRV] LsarLookupSids: Return ReferencedDomains information.
Modified: trunk/reactos/dll/win32/lsasrv/lsarpc.c
Modified: trunk/reactos/dll/win32/lsasrv/lsarpc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/lsasrv/lsarpc.c?r... ============================================================================== --- trunk/reactos/dll/win32/lsasrv/lsarpc.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/lsasrv/lsarpc.c [iso-8859-1] Sat Jul 17 18:15:34 2010 @@ -347,10 +347,16 @@ LSAP_LOOKUP_LEVEL LookupLevel, DWORD *MappedCount) { + SID_IDENTIFIER_AUTHORITY IdentifierAuthority = {SECURITY_NT_AUTHORITY}; + static const UNICODE_STRING DomainName = RTL_CONSTANT_STRING(L"DOMAIN"); static const UNICODE_STRING UserName = RTL_CONSTANT_STRING(L"Administrator"); + PLSAPR_REFERENCED_DOMAIN_LIST OutputDomains = NULL; PLSAPR_TRANSLATED_NAME OutputNames = NULL; ULONG OutputNamesLength; ULONG i; + PSID Sid; + ULONG SidLength; + NTSTATUS Status;
TRACE("LsarLookupSids(%p, %p, %p, %p, %d, %p)\n", PolicyHandle, SidEnumBuffer, ReferencedDomains, TranslatedNames, @@ -369,19 +375,65 @@
RtlZeroMemory(OutputNames, OutputNamesLength);
+ OutputDomains = MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST)); + if (OutputDomains == NULL) + { + MIDL_user_free(OutputNames); + return STATUS_INSUFFICIENT_RESOURCES; + } + + OutputDomains->Entries = SidEnumBuffer->Entries; + OutputDomains->Domains = MIDL_user_allocate(SidEnumBuffer->Entries * sizeof(LSA_TRUST_INFORMATION)); + if (OutputDomains->Domains == NULL) + { + MIDL_user_free(OutputDomains); + MIDL_user_free(OutputNames); + return STATUS_INSUFFICIENT_RESOURCES; + } + + Status = RtlAllocateAndInitializeSid(&IdentifierAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &Sid); + if (!NT_SUCCESS(Status)) + { + MIDL_user_free(OutputDomains->Domains); + MIDL_user_free(OutputDomains); + MIDL_user_free(OutputNames); + return Status; + } + + SidLength = RtlLengthSid(Sid); + for (i = 0; i < SidEnumBuffer->Entries; i++) { + OutputDomains->Domains[i].Sid = MIDL_user_allocate(SidLength); + RtlCopyMemory(OutputDomains->Domains[i].Sid, Sid, SidLength); + + OutputDomains->Domains[i].Name.Buffer = MIDL_user_allocate(DomainName.MaximumLength); + OutputDomains->Domains[i].Name.Length = DomainName.Length; + OutputDomains->Domains[i].Name.MaximumLength = DomainName.MaximumLength; + RtlCopyMemory(OutputDomains->Domains[i].Name.Buffer, DomainName.Buffer, DomainName.MaximumLength); + } + + + for (i = 0; i < SidEnumBuffer->Entries; i++) + { OutputNames[i].Use = SidTypeWellKnownGroup; - OutputNames[i].DomainIndex = 0; + OutputNames[i].DomainIndex = i; OutputNames[i].Name.Buffer = MIDL_user_allocate(UserName.MaximumLength); OutputNames[i].Name.Length = UserName.Length; OutputNames[i].Name.MaximumLength = UserName.MaximumLength; RtlCopyMemory(OutputNames[i].Name.Buffer, UserName.Buffer, UserName.MaximumLength); }
+ *ReferencedDomains = OutputDomains; + *MappedCount = SidEnumBuffer->Entries;
- TranslatedNames->Entries = SidEnumBuffer->Entries; + TranslatedNames->Entries = SidEnumBuffer->Entries; TranslatedNames->Names = OutputNames;
return STATUS_SUCCESS;