[ros-diffs] [hpoussin] 28240: Implement LsaLookupSids Add a fake implementation to LsaLookupNames to return some information

hpoussin at svn.reactos.org hpoussin at svn.reactos.org
Wed Aug 8 10:24:33 CEST 2007


Author: hpoussin
Date: Wed Aug  8 12:24:32 2007
New Revision: 28240

URL: http://svn.reactos.org/svn/reactos?rev=28240&view=rev
Log:
Implement LsaLookupSids
Add a fake implementation to LsaLookupNames to return some information

Modified:
    trunk/reactos/dll/win32/advapi32/sec/lsa.c

Modified: trunk/reactos/dll/win32/advapi32/sec/lsa.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/sec/lsa.c?rev=28240&r1=28239&r2=28240&view=diff
==============================================================================
--- trunk/reactos/dll/win32/advapi32/sec/lsa.c (original)
+++ trunk/reactos/dll/win32/advapi32/sec/lsa.c Wed Aug  8 12:24:32 2007
@@ -217,10 +217,10 @@
 }
 
 /*
- * @unimplemented
- */
-NTSTATUS
-STDCALL
+ * @implemented
+ */
+NTSTATUS
+WINAPI
 LsaLookupNames(
     LSA_HANDLE PolicyHandle,
     ULONG Count,
@@ -228,7 +228,39 @@
     PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
     PLSA_TRANSLATED_SID *Sids)
 {
-  return STATUS_NOT_IMPLEMENTED;
+    PLSA_TRANSLATED_SID2 Sids2;
+    LSA_TRANSLATED_SID *TranslatedSids;
+    ULONG i;
+    NTSTATUS Status;
+
+    /* Call LsaLookupNames2, which supersedes this function */
+    Status = LsaLookupNames2(PolicyHandle, Count, 0, Names, ReferencedDomains, &Sids2);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    /* Translate the returned structure */
+    TranslatedSids = RtlAllocateHeap(RtlGetProcessHeap(), 0, Count * sizeof(LSA_TRANSLATED_SID));
+    if (!TranslatedSids)
+    {
+        LsaFreeMemory(Sids2);
+        return SCESTATUS_NOT_ENOUGH_RESOURCE;
+    }
+    RtlZeroMemory(Sids, Count * sizeof(PLSA_TRANSLATED_SID));
+    for (i = 0; i < Count; i++)
+    {
+        TranslatedSids[i].Use = Sids2[i].Use;
+        if (Sids2[i].Use != SidTypeInvalid && Sids2[i].Use != SidTypeUnknown)
+        {
+            TranslatedSids[i].DomainIndex = Sids2[i].DomainIndex;
+            if (Sids2[i].Use != SidTypeDomain)
+                TranslatedSids[i].RelativeId = *GetSidSubAuthority(Sids2[i].Sid, 0);
+        }
+    }
+    LsaFreeMemory(Sids2);
+
+    *Sids = TranslatedSids;
+
+    return Status;
 }
 
 /*
@@ -251,7 +283,7 @@
  * @unimplemented
  */
 NTSTATUS
-STDCALL
+WINAPI
 LsaLookupSids(
     LSA_HANDLE PolicyHandle,
     ULONG Count,
@@ -259,7 +291,33 @@
     PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
     PLSA_TRANSLATED_NAME *Names)
 {
-  return STATUS_NONE_MAPPED;
+    static const UNICODE_STRING UserName = RTL_CONSTANT_STRING(L"Administrator");
+    PLSA_REFERENCED_DOMAIN_LIST LocalDomains;
+    PLSA_TRANSLATED_NAME LocalNames;
+
+    DPRINT1("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)
+    {
+        LsaFreeMemory(LocalDomains);
+        return SCESTATUS_NOT_ENOUGH_RESOURCE;
+    }
+    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;
 }
 
 /******************************************************************************




More information about the Ros-diffs mailing list