Author: hbelusca
Date: Wed Feb 10 22:18:20 2016
New Revision: 70706

URL: http://svn.reactos.org/svn/reactos?rev=70706&view=rev
Log:
[CMLIB]
- Fix some comments.
- Simplify code.
- Add a missing check for hive exit nodes when deleting cells.

Modified:
    trunk/reactos/lib/cmlib/cmkeydel.c

Modified: trunk/reactos/lib/cmlib/cmkeydel.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/cmkeydel.c?rev=70706&r1=70705&r2=70706&view=diff
==============================================================================
--- trunk/reactos/lib/cmlib/cmkeydel.c  [iso-8859-1] (original)
+++ trunk/reactos/lib/cmlib/cmkeydel.c  [iso-8859-1] Wed Feb 10 22:18:20 2016
@@ -20,7 +20,9 @@
                 IN HCELL_INDEX Cell,
                 IN BOOLEAN CheckNoSubkeys)
 {
-    PCELL_DATA CellData, ListData, SecurityData, ValueData;
+    PCM_KEY_NODE CellData;
+    PCM_KEY_SECURITY SecurityData;
+    PCELL_DATA ListData, ValueData;
     ULONG i;
 
     /* Get the cell data for our target */
@@ -31,12 +33,12 @@
     if (CheckNoSubkeys)
     {
         /* Do them */
-        ASSERT(CellData->u.KeyNode.SubKeyCounts[Stable] == 0);
-        ASSERT(CellData->u.KeyNode.SubKeyCounts[Volatile] == 0);
-    }
-
-    /* If this is an exit hive, there's nothing to do */
-    if (CellData->u.KeyNode.Flags & KEY_HIVE_EXIT)
+        ASSERT(CellData->SubKeyCounts[Stable] == 0);
+        ASSERT(CellData->SubKeyCounts[Volatile] == 0);
+    }
+
+    /* If this is an exit node, there's nothing to do */
+    if (CellData->Flags & KEY_HIVE_EXIT)
     {
         /* Release the cell and get out */
         HvReleaseCell(Hive, Cell);
@@ -48,41 +50,42 @@
     HvReleaseCell(Hive, Cell);
 
     /* Check if we have a class */
-    if (CellData->u.KeyNode.Class != HCELL_NIL)
+    if (CellData->Class != HCELL_NIL)
     {
         /* Mark it dirty */
-        HvMarkCellDirty(Hive, CellData->u.KeyNode.Class, FALSE);
+        HvMarkCellDirty(Hive, CellData->Class, FALSE);
     }
 
     /* Check if we have security */
-    if (CellData->u.KeyNode.Security != HCELL_NIL)
+    if (CellData->Security != HCELL_NIL)
     {
         /* Mark it dirty */
-        HvMarkCellDirty(Hive, CellData->u.KeyNode.Security, FALSE);
+        HvMarkCellDirty(Hive, CellData->Security, FALSE);
 
         /* Get the security data and release it */
-        SecurityData = HvGetCell(Hive, CellData->u.KeyNode.Security);
+        SecurityData = HvGetCell(Hive, CellData->Security);
         if (!SecurityData) ASSERT(FALSE);
-        HvReleaseCell(Hive, CellData->u.KeyNode.Security);
+        HvReleaseCell(Hive, CellData->Security);
 
         /* Mark the security links dirty too */
-        HvMarkCellDirty(Hive, SecurityData->u.KeySecurity.Flink, FALSE);
-        HvMarkCellDirty(Hive, SecurityData->u.KeySecurity.Blink, FALSE);
-    }
-
+        HvMarkCellDirty(Hive, SecurityData->Flink, FALSE);
+        HvMarkCellDirty(Hive, SecurityData->Blink, FALSE);
+    }
+
+    // TODO: Handle predefined keys (Flags: KEY_PREDEF_HANDLE)
     /* Check if we have any values */
-    if (CellData->u.KeyNode.ValueList.Count > 0)
+    if (CellData->ValueList.Count > 0)
     {
         /* Dirty the value list */
-        HvMarkCellDirty(Hive, CellData->u.KeyNode.ValueList.List, FALSE);
+        HvMarkCellDirty(Hive, CellData->ValueList.List, FALSE);
 
         /* Get the list data itself, and release it */
-        ListData = HvGetCell(Hive, CellData->u.KeyNode.ValueList.List);
+        ListData = HvGetCell(Hive, CellData->ValueList.List);
         if (!ListData) ASSERT(FALSE);
-        HvReleaseCell(Hive, CellData->u.KeyNode.ValueList.List);
+        HvReleaseCell(Hive, CellData->ValueList.List);
 
         /* Loop all values */
-        for (i = 0; i < CellData->u.KeyNode.ValueList.Count; i++)
+        for (i = 0; i < CellData->ValueList.Count; i++)
         {
             /* Dirty each value */
             HvMarkCellDirty(Hive, ListData->u.KeyList[i], FALSE);
@@ -101,18 +104,18 @@
         }
     }
 
-    /* If this is an entry hive, we're done */
-    if (CellData->u.KeyNode.Flags & KEY_HIVE_ENTRY) return TRUE;
+    /* If this is an entry node, we're done */
+    if (CellData->Flags & KEY_HIVE_ENTRY) return TRUE;
 
     /* Otherwise mark the index dirty too */
-    if (!CmpMarkIndexDirty(Hive, CellData->u.KeyNode.Parent, Cell))
+    if (!CmpMarkIndexDirty(Hive, CellData->Parent, Cell))
     {
         /* Failure */
         return FALSE;
     }
 
     /* Finally, mark the parent dirty */
-    HvMarkCellDirty(Hive, CellData->u.KeyNode.Parent, FALSE);
+    HvMarkCellDirty(Hive, CellData->Parent, FALSE);
     return TRUE;
 }
 
@@ -121,27 +124,27 @@
 CmpFreeKeyBody(IN PHHIVE Hive,
                IN HCELL_INDEX Cell)
 {
-    PCELL_DATA CellData;
+    PCM_KEY_NODE CellData;
 
     /* Get the key node */
     CellData = HvGetCell(Hive, Cell);
     if (!CellData) ASSERT(FALSE);
 
     /* Check if we can delete the child cells */
-    if (!(CellData->u.KeyNode.Flags & KEY_HIVE_EXIT))
+    if (!(CellData->Flags & KEY_HIVE_EXIT))
     {
         /* Check if we have a security cell */
-        if (CellData->u.KeyNode.Security != HCELL_NIL)
+        if (CellData->Security != HCELL_NIL)
         {
             /* Free the security cell */
-            HvFreeCell(Hive, CellData->u.KeyNode.Security);
+            HvFreeCell(Hive, CellData->Security);
         }
 
         /* Check if we have a class */
-        if (CellData->u.KeyNode.ClassLength > 0)
+        if (CellData->ClassLength > 0)
         {
             /* Free it */
-            HvFreeCell(Hive, CellData->u.KeyNode.Class);
+            HvFreeCell(Hive, CellData->Class);
         }
     }
 
@@ -157,12 +160,13 @@
                  IN HCELL_INDEX Cell,
                  IN BOOLEAN Unlink)
 {
-    PCELL_DATA CellData, ParentData, ListData;
+    PCM_KEY_NODE CellData, ParentData;
+    PCELL_DATA ListData;
     ULONG i;
     BOOLEAN Result;
 
     /* Mark the entire key dirty */
-    CmpMarkKeyDirty(Hive, Cell ,TRUE);
+    CmpMarkKeyDirty(Hive, Cell, TRUE);
 
     /* Get the target node and release it */
     CellData = HvGetCell(Hive, Cell);
@@ -170,52 +174,55 @@
     HvReleaseCell(Hive, Cell);
 
     /* Make sure we don't have subkeys */
-    ASSERT((CellData->u.KeyNode.SubKeyCounts[Stable] +
-            CellData->u.KeyNode.SubKeyCounts[Volatile]) == 0);
+    ASSERT(CellData->SubKeyCounts[Stable] + CellData->SubKeyCounts[Volatile] 
== 0);
 
     /* Check if we have to unlink */
     if (Unlink)
     {
         /* Remove the subkey */
-        Result = CmpRemoveSubKey(Hive, CellData->u.KeyNode.Parent, Cell);
+        Result = CmpRemoveSubKey(Hive, CellData->Parent, Cell);
         if (!Result) return STATUS_INSUFFICIENT_RESOURCES;
 
         /* Get the parent node and release it */
-        ParentData = HvGetCell(Hive, CellData->u.KeyNode.Parent);
+        ParentData = HvGetCell(Hive, CellData->Parent);
         if (!ParentData) ASSERT(FALSE);
-        HvReleaseCell(Hive, CellData->u.KeyNode.Parent);
+        HvReleaseCell(Hive, CellData->Parent);
 
         /* Check if the parent node has no more subkeys */
-        if (!(ParentData->u.KeyNode.SubKeyCounts[Stable] +
-              ParentData->u.KeyNode.SubKeyCounts[Volatile]))
+        if (ParentData->SubKeyCounts[Stable] + 
ParentData->SubKeyCounts[Volatile] == 0)
         {
             /* Then free the cached name/class lengths */
-            ParentData->u.KeyNode.MaxNameLen = 0;
-            ParentData->u.KeyNode.MaxClassLen = 0;
-        }
-    }
-
-    /* Check if we have any values */
-    if (CellData->u.KeyNode.ValueList.Count > 0)
-    {
-        /* Get the value list and release it */
-        ListData = HvGetCell(Hive, CellData->u.KeyNode.ValueList.List);
-        if (!ListData) ASSERT(FALSE);
-        HvReleaseCell(Hive, CellData->u.KeyNode.ValueList.List);
-
-        /* Loop every value */
-        for (i = 0; i < CellData->u.KeyNode.ValueList.Count; i++)
-        {
-            /* Free it */
-            if (!CmpFreeValue(Hive, ListData->u.KeyList[i])) ASSERT(FALSE);
-        }
-
-        /* Free the value list */
-        HvFreeCell(Hive, CellData->u.KeyNode.ValueList.List);
-    }
-
-    /* FIXME: This leaks the security desriptor! */
-    DPRINT("Potentially leaking key security descriptor. Please call 
CmpFreeSecurityDescriptor\n");
+            ParentData->MaxNameLen  = 0;
+            ParentData->MaxClassLen = 0;
+        }
+    }
+
+    // TODO: Handle predefined keys (Flags: KEY_PREDEF_HANDLE)
+    /* If this is an exit node, we don't have values */
+    if (!(CellData->Flags & KEY_HIVE_EXIT))
+    {
+        /* Check if we have any values */
+        if (CellData->ValueList.Count > 0)
+        {
+            /* Get the value list and release it */
+            ListData = HvGetCell(Hive, CellData->ValueList.List);
+            if (!ListData) ASSERT(FALSE);
+            HvReleaseCell(Hive, CellData->ValueList.List);
+
+            /* Loop every value */
+            for (i = 0; i < CellData->ValueList.Count; i++)
+            {
+                /* Free it */
+                if (!CmpFreeValue(Hive, ListData->u.KeyList[i])) ASSERT(FALSE);
+            }
+
+            /* Free the value list */
+            HvFreeCell(Hive, CellData->ValueList.List);
+        }
+
+        /* FIXME: This leaks the security desriptor! */
+        DPRINT("Potentially leaking key security descriptor. Please call 
CmpFreeSecurityDescriptor\n");
+    }
 
     /* Free the key body itself, and then return our status */
     if (!CmpFreeKeyBody(Hive, Cell)) return STATUS_INSUFFICIENT_RESOURCES;


Reply via email to