PRPC_UNICODE_STRING NameBuffer = NULL;
NTSTATUS Status;
- TRACE("(%p,%p,%p) stub\n", PolicyHandle, Value, Name);
+ TRACE("(%p,%p,%p)\n", PolicyHandle, Value, Name);
RpcTryExcept
{
LUID Luid;
NTSTATUS Status;
- TRACE("(%p,%p,%p) stub\n", PolicyHandle, Name, Value);
+ TRACE("(%p,%p,%p)\n", PolicyHandle, Name, Value);
RpcTryExcept
{
}
/*
- * @unimplemented
+ * @implemented
*/
NTSTATUS
WINAPI
PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
PLSA_TRANSLATED_NAME *Names)
{
- static const UNICODE_STRING UserName = RTL_CONSTANT_STRING(L"Administrator");
- PLSA_REFERENCED_DOMAIN_LIST LocalDomains;
- PLSA_TRANSLATED_NAME LocalNames;
+ LSAPR_SID_ENUM_BUFFER SidEnumBuffer;
+ LSAPR_TRANSLATED_NAMES TranslatedNames;
+ ULONG MappedCount = 0;
+ NTSTATUS Status;
- TRACE("(%p,%u,%p,%p,%p) stub\n", PolicyHandle, Count, Sids,
+ TRACE("(%p,%u,%p,%p,%p)\n", PolicyHandle, Count, Sids,
ReferencedDomains, Names);
- WARN("LsaLookupSids(): stub. Always returning 'Administrator'\n");
- if (Count != 1)
- return STATUS_NONE_MAPPED;
- LocalDomains = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_TRANSLATED_SID));
- if (!LocalDomains)
- return SCESTATUS_NOT_ENOUGH_RESOURCE;
- LocalNames = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_TRANSLATED_NAME) + UserName.MaximumLength);
- if (!LocalNames)
+ if (Count == 0)
+ return STATUS_INVALID_PARAMETER;
+
+ SidEnumBuffer.Entries = Count;
+ SidEnumBuffer.SidInfo = (PLSAPR_SID_INFORMATION)Sids;
+
+ RpcTryExcept
{
- LsaFreeMemory(LocalDomains);
- return SCESTATUS_NOT_ENOUGH_RESOURCE;
+ *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;
}
- LocalDomains[0].Entries = 0;
- LocalDomains[0].Domains = NULL;
- LocalNames[0].Use = SidTypeWellKnownGroup;
- LocalNames[0].Name.Buffer = (LPWSTR)((ULONG_PTR)(LocalNames) + sizeof(LSA_TRANSLATED_NAME));
- LocalNames[0].Name.Length = UserName.Length;
- LocalNames[0].Name.MaximumLength = UserName.MaximumLength;
- RtlCopyMemory(LocalNames[0].Name.Buffer, UserName.Buffer, UserName.MaximumLength);
-
- *ReferencedDomains = LocalDomains;
- *Names = LocalNames;
- return STATUS_SUCCESS;
+ RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+ {
+ if (TranslatedNames.Names != NULL)
+ {
+ MIDL_user_free(TranslatedNames.Names);
+ }
+
+ Status = I_RpcMapWin32Status(RpcExceptionCode());
+ }
+ RpcEndExcept;
+
+ return Status;
}
/******************************************************************************
LSAP_LOOKUP_LEVEL LookupLevel,
DWORD *MappedCount)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ static const UNICODE_STRING UserName = RTL_CONSTANT_STRING(L"Administrator");
+ PLSAPR_TRANSLATED_NAME OutputNames = NULL;
+ ULONG OutputNamesLength;
+ ULONG i;
+
+ TRACE("LsarLookupSids(%p, %p, %p, %p, %d, %p)\n",
+ PolicyHandle, SidEnumBuffer, ReferencedDomains, TranslatedNames,
+ LookupLevel, MappedCount);
+
+ TranslatedNames->Entries = SidEnumBuffer->Entries;
+ TranslatedNames->Names = NULL;
+ *ReferencedDomains = NULL;
+
+ OutputNamesLength = SidEnumBuffer->Entries * sizeof(LSA_TRANSLATED_NAME);
+ OutputNames = MIDL_user_allocate(OutputNamesLength);
+ if (OutputNames == NULL)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ RtlZeroMemory(OutputNames, OutputNamesLength);
+
+ for (i = 0; i < SidEnumBuffer->Entries; i++)
+ {
+ OutputNames[i].Use = SidTypeWellKnownGroup;
+ OutputNames[i].DomainIndex = 0;
+ 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);
+ }
+
+ *MappedCount = SidEnumBuffer->Entries;
+
+ TranslatedNames->Entries = SidEnumBuffer->Entries;
+ TranslatedNames->Names = OutputNames;
+
+ return STATUS_SUCCESS;
}