[NTOSKRNL] On session last reference removal, dereference LUID device map
authorPierre Schweitzer <pierre@reactos.org>
Mon, 10 Jun 2019 10:30:49 +0000 (12:30 +0200)
committerPierre Schweitzer <pierre@reactos.org>
Mon, 10 Jun 2019 10:30:49 +0000 (12:30 +0200)
ntoskrnl/se/srm.c

index f0cc734..9134eba 100644 (file)
@@ -392,7 +392,7 @@ SepRmReferenceLogonSession(
         if (RtlEqualLuid(&CurrentSession->LogonId, LogonLuid))
         {
             /* Reference the session */
-            CurrentSession->ReferenceCount += 1;
+            ++CurrentSession->ReferenceCount;
             DPRINT("ReferenceCount: %lu\n", CurrentSession->ReferenceCount);
 
             /* Release the database lock */
@@ -409,10 +409,21 @@ SepRmReferenceLogonSession(
 }
 
 
+NTSTATUS
+SepCleanupLUIDDeviceMapDirectory(
+    PLUID LogonLuid)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
 NTSTATUS
 SepRmDereferenceLogonSession(
     PLUID LogonLuid)
 {
+    ULONG RefCount;
+    PDEVICE_MAP DeviceMap;
     PSEP_LOGON_SESSION_REFERENCES CurrentSession;
 
     DPRINT("SepRmDereferenceLogonSession(%08lx:%08lx)\n",
@@ -430,12 +441,25 @@ SepRmDereferenceLogonSession(
         if (RtlEqualLuid(&CurrentSession->LogonId, LogonLuid))
         {
             /* Dereference the session */
-            CurrentSession->ReferenceCount -= 1;
+            RefCount = --CurrentSession->ReferenceCount;
             DPRINT("ReferenceCount: %lu\n", CurrentSession->ReferenceCount);
 
             /* Release the database lock */
             KeReleaseGuardedMutex(&SepRmDbLock);
 
+            /* We're done with the session */
+            if (RefCount == 0)
+            {
+                /* Get rid of the LUID device map */
+                DeviceMap = CurrentSession->pDeviceMap;
+                if (DeviceMap != NULL)
+                {
+                    CurrentSession->pDeviceMap = NULL;
+                    SepCleanupLUIDDeviceMapDirectory(LogonLuid);
+                    ObfDereferenceDeviceMap(DeviceMap);
+                }
+            }
+
             return STATUS_SUCCESS;
         }
     }