Author: ekohl
Date: Sat Dec 21 11:35:14 2013
New Revision: 61312

URL: http://svn.reactos.org/svn/reactos?rev=61312&view=rev
Log:
[ADVAPI32]
LsapCopyLocalGroups: Determine the size of each client SID and copy it into the 
local adress space.

Modified:
    trunk/reactos/dll/win32/lsasrv/authpackage.c

Modified: trunk/reactos/dll/win32/lsasrv/authpackage.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/lsasrv/authpackage.c?rev=61312&r1=61311&r2=61312&view=diff
==============================================================================
--- trunk/reactos/dll/win32/lsasrv/authpackage.c        [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/lsasrv/authpackage.c        [iso-8859-1] Sat Dec 21 
11:35:14 2013
@@ -549,6 +549,12 @@
 {
     ULONG LocalGroupsLength = 0;
     PTOKEN_GROUPS LocalGroups = NULL;
+    ULONG SidHeaderLength = 0;
+    PSID SidHeader = NULL;
+    PSID Sid;
+    ULONG SidLength;
+    ULONG CopiedSids = 0;
+    ULONG i;
     NTSTATUS Status;
 
     LocalGroupsLength = sizeof(TOKEN_GROUPS) +
@@ -570,16 +576,68 @@
     if (!NT_SUCCESS(Status))
         goto done;
 
+
+    SidHeaderLength  = RtlLengthRequiredSid(0);
+    SidHeader = RtlAllocateHeap(RtlGetProcessHeap(),
+                                HEAP_ZERO_MEMORY,
+                                SidHeaderLength);
+    if (SidHeader == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    for (i = 0; i < ClientGroupsCount; i++)
+    {
+        Status = NtReadVirtualMemory(LogonContext->ClientProcessHandle,
+                                     LocalGroups->Groups[i].Sid,
+                                     SidHeader,
+                                     SidHeaderLength,
+                                     NULL);
+        if (!NT_SUCCESS(Status))
+            goto done;
+
+        SidLength = RtlLengthSid(SidHeader);
+        TRACE("Sid %lu: Length %lu\n", i, SidLength);
+
+        Sid = RtlAllocateHeap(RtlGetProcessHeap(),
+                              HEAP_ZERO_MEMORY,
+                              SidLength);
+        if (SidHeader == NULL)
+        {
+            Status = STATUS_INSUFFICIENT_RESOURCES;
+            goto done;
+        }
+
+        Status = NtReadVirtualMemory(LogonContext->ClientProcessHandle,
+                                     LocalGroups->Groups[i].Sid,
+                                     Sid,
+                                     SidLength,
+                                     NULL);
+        if (!NT_SUCCESS(Status))
+        {
+            RtlFreeHeap(RtlGetProcessHeap(), 0, Sid);
+            goto done;
+        }
+
+        LocalGroups->Groups[i].Sid = Sid;
+        CopiedSids++;
+    }
+
     *TokenGroups = LocalGroups;
 
 done:
+    if (SidHeader != NULL)
+        RtlFreeHeap(RtlGetProcessHeap(), 0, SidHeader);
+
     if (!NT_SUCCESS(Status))
     {
         if (LocalGroups != NULL)
         {
-            RtlFreeHeap(RtlGetProcessHeap(),
-                        0,
-                        LocalGroups);
+            for (i = 0; i < CopiedSids; i++)
+                RtlFreeHeap(RtlGetProcessHeap(), 0, 
LocalGroups->Groups[i].Sid);
+
+            RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups);
         }
     }
 
@@ -775,6 +833,13 @@
 
     TokenHandle = NULL;
 
+    Status = LsapSetLogonSessionData(&RequestMsg->LogonUser.Reply.LogonId);
+    if (!NT_SUCCESS(Status))
+    {
+        TRACE("LsapSetLogonSessionData failed (Status 0x%08lx)\n", Status);
+        goto done;
+    }
+
 done:
     if (!NT_SUCCESS(Status))
     {
@@ -785,6 +850,9 @@
     /* Free the local groups */
     if (LocalGroups != NULL)
     {
+        for (i = 0; i < LocalGroups->GroupCount; i++)
+            RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups->Groups[i].Sid);
+
         RtlFreeHeap(RtlGetProcessHeap(), 0, LocalGroups);
     }
 


Reply via email to