https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d2b8b9ec9689443ed311cf6821f2723054aca1b1

commit d2b8b9ec9689443ed311cf6821f2723054aca1b1
Author:     George Bișoc <[email protected]>
AuthorDate: Wed Oct 26 19:59:21 2022 +0200
Commit:     George Bișoc <[email protected]>
CommitDate: Sun Nov 19 20:44:27 2023 +0100

    [NTOS:CM] Use the appropriate flags on functions that will call 
CmCheckRegistry & add missing CmCheckRegistry calls
    
    In addition to that, in some functions like CmFlushKey, CmSaveKey and 
CmSaveMergedKeys we must validate the underlying hives as a matter of 
precaution that everything is alright and we don't fuck all the shit up.
---
 ntoskrnl/config/cmapi.c    | 69 ++++++++++++++++++++++++++++++++++++++++++++--
 ntoskrnl/config/cminit.c   |  4 +--
 ntoskrnl/config/cmsysini.c | 10 +++----
 3 files changed, 73 insertions(+), 10 deletions(-)

diff --git a/ntoskrnl/config/cmapi.c b/ntoskrnl/config/cmapi.c
index e21eea3b793..287caecf245 100644
--- a/ntoskrnl/config/cmapi.c
+++ b/ntoskrnl/config/cmapi.c
@@ -1939,6 +1939,9 @@ CmFlushKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
            IN BOOLEAN ExclusiveLock)
 {
     PCMHIVE CmHive;
+#if DBG
+    CM_CHECK_REGISTRY_STATUS CheckStatus;
+#endif
     NTSTATUS Status = STATUS_SUCCESS;
     PHHIVE Hive;
 
@@ -1957,6 +1960,12 @@ CmFlushKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
     }
     else
     {
+#if DBG
+        /* Make sure the registry hive we're going to flush is OK */
+        CheckStatus = CmCheckRegistry(CmHive, 
CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES | CM_CHECK_REGISTRY_VALIDATE_HIVE);
+        ASSERT(CM_CHECK_REGISTRY_SUCCESS(CheckStatus));
+#endif
+
         /* Don't touch the hive */
         CmpLockHiveFlusherExclusive(CmHive);
 
@@ -2054,7 +2063,7 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey,
                             &ClientSecurityContext,
                             &Allocate,
                             &CmHive,
-                            0);
+                            CM_CHECK_REGISTRY_PURGE_VOLATILES);
 
     /* Get rid of the security context */
     SeDeleteClientSecurity(&ClientSecurityContext);
@@ -2645,6 +2654,10 @@ CmSaveKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
           IN HANDLE FileHandle,
           IN ULONG Flags)
 {
+#if DBG
+    CM_CHECK_REGISTRY_STATUS CheckStatus;
+    PCMHIVE HiveToValidate = NULL;
+#endif
     NTSTATUS Status = STATUS_SUCCESS;
     PCMHIVE KeyHive = NULL;
     PAGED_CODE();
@@ -2655,6 +2668,11 @@ CmSaveKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
     CmpLockRegistry();
     CmpAcquireKcbLockShared(Kcb);
 
+#if DBG
+    /* Get the hive for validation */
+    HiveToValidate = (PCMHIVE)Kcb->KeyHive;
+#endif
+
     if (Kcb->Delete)
     {
         /* The source key has been deleted, do nothing */
@@ -2669,6 +2687,12 @@ CmSaveKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
         goto Cleanup;
     }
 
+#if DBG
+    /* Make sure this control block has a sane hive */
+    CheckStatus = CmCheckRegistry(HiveToValidate, 
CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES | CM_CHECK_REGISTRY_VALIDATE_HIVE);
+    ASSERT(CM_CHECK_REGISTRY_SUCCESS(CheckStatus));
+#endif
+
     /* Create a new hive that will hold the key */
     Status = CmpInitializeHive(&KeyHive,
                                HINIT_CREATE,
@@ -2679,7 +2703,7 @@ CmSaveKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
                                NULL,
                                NULL,
                                NULL,
-                               0);
+                               CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES);
     if (!NT_SUCCESS(Status)) goto Cleanup;
 
     /* Copy the key recursively into the new hive */
@@ -2701,6 +2725,15 @@ Cleanup:
     /* Free the hive */
     if (KeyHive) CmpDestroyHive(KeyHive);
 
+#if DBG
+    if (NT_SUCCESS(Status))
+    {
+        /* Before we say goodbye, make sure the hive is still OK */
+        CheckStatus = CmCheckRegistry(HiveToValidate, 
CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES | CM_CHECK_REGISTRY_VALIDATE_HIVE);
+        ASSERT(CM_CHECK_REGISTRY_SUCCESS(CheckStatus));
+    }
+#endif
+
     /* Release the locks */
     CmpReleaseKcbLock(Kcb);
     CmpUnlockRegistry();
@@ -2714,6 +2747,11 @@ CmSaveMergedKeys(IN PCM_KEY_CONTROL_BLOCK HighKcb,
                  IN PCM_KEY_CONTROL_BLOCK LowKcb,
                  IN HANDLE FileHandle)
 {
+#if DBG
+    CM_CHECK_REGISTRY_STATUS CheckStatus;
+    PCMHIVE LowHiveToValidate = NULL;
+    PCMHIVE HighHiveToValidate = NULL;
+#endif
     PCMHIVE KeyHive = NULL;
     NTSTATUS Status = STATUS_SUCCESS;
 
@@ -2726,6 +2764,12 @@ CmSaveMergedKeys(IN PCM_KEY_CONTROL_BLOCK HighKcb,
     CmpAcquireKcbLockShared(HighKcb);
     CmpAcquireKcbLockShared(LowKcb);
 
+#if DBG
+    /* Get the high and low hives for validation */
+    HighHiveToValidate = (PCMHIVE)HighKcb->KeyHive;
+    LowHiveToValidate = (PCMHIVE)LowKcb->KeyHive;
+#endif
+
     if (LowKcb->Delete || HighKcb->Delete)
     {
         /* The source key has been deleted, do nothing */
@@ -2733,6 +2777,14 @@ CmSaveMergedKeys(IN PCM_KEY_CONTROL_BLOCK HighKcb,
         goto done;
     }
 
+#if DBG
+    /* Make sure that both the high and low precedence hives are OK */
+    CheckStatus = CmCheckRegistry(HighHiveToValidate, 
CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES | CM_CHECK_REGISTRY_VALIDATE_HIVE);
+    ASSERT(CM_CHECK_REGISTRY_SUCCESS(CheckStatus));
+    CheckStatus = CmCheckRegistry(LowHiveToValidate, 
CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES | CM_CHECK_REGISTRY_VALIDATE_HIVE);
+    ASSERT(CM_CHECK_REGISTRY_SUCCESS(CheckStatus));
+#endif
+
     /* Create a new hive that will hold the key */
     Status = CmpInitializeHive(&KeyHive,
                                HINIT_CREATE,
@@ -2743,7 +2795,7 @@ CmSaveMergedKeys(IN PCM_KEY_CONTROL_BLOCK HighKcb,
                                NULL,
                                NULL,
                                NULL,
-                               0);
+                               CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES);
     if (!NT_SUCCESS(Status))
         goto done;
 
@@ -2776,6 +2828,17 @@ done:
     if (KeyHive)
         CmpDestroyHive(KeyHive);
 
+#if DBG
+    if (NT_SUCCESS(Status))
+    {
+        /* Check those hives again before we say goodbye */
+        CheckStatus = CmCheckRegistry(HighHiveToValidate, 
CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES | CM_CHECK_REGISTRY_VALIDATE_HIVE);
+        ASSERT(CM_CHECK_REGISTRY_SUCCESS(CheckStatus));
+        CheckStatus = CmCheckRegistry(LowHiveToValidate, 
CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES | CM_CHECK_REGISTRY_VALIDATE_HIVE);
+        ASSERT(CM_CHECK_REGISTRY_SUCCESS(CheckStatus));
+    }
+#endif
+
     /* Release the locks */
     CmpReleaseKcbLock(LowKcb);
     CmpReleaseKcbLock(HighKcb);
diff --git a/ntoskrnl/config/cminit.c b/ntoskrnl/config/cminit.c
index dd3a051e959..3406bfea302 100644
--- a/ntoskrnl/config/cminit.c
+++ b/ntoskrnl/config/cminit.c
@@ -201,8 +201,8 @@ CmpInitializeHive(OUT PCMHIVE *CmHive,
         (OperationType == HINIT_MAPFILE))
     {
         /* Verify integrity */
-        ULONG CheckStatus = CmCheckRegistry(Hive, CheckFlags);
-        if (CheckStatus != 0)
+        CM_CHECK_REGISTRY_STATUS CheckStatus = CmCheckRegistry(Hive, 
CheckFlags);
+        if (!CM_CHECK_REGISTRY_SUCCESS(CheckStatus))
         {
             /* Cleanup allocations and fail */
             ExDeleteResourceLite(Hive->FlusherLock);
diff --git a/ntoskrnl/config/cmsysini.c b/ntoskrnl/config/cmsysini.c
index 0e3a647de66..f65449d1962 100644
--- a/ntoskrnl/config/cmsysini.c
+++ b/ntoskrnl/config/cmsysini.c
@@ -912,7 +912,7 @@ CmpInitializeSystemHive(IN PLOADER_PARAMETER_BLOCK 
LoaderBlock)
                                NULL,
                                NULL,
                                &HiveName,
-                               HiveBase ? 2 : 0);
+                               HiveBase ? CM_CHECK_REGISTRY_PURGE_VOLATILES : 
CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES);
     if (!NT_SUCCESS(Status))
     {
         return FALSE;
@@ -936,7 +936,7 @@ CmpInitializeSystemHive(IN PLOADER_PARAMETER_BLOCK 
LoaderBlock)
     {
         /* Disable self-healing internally and check if boot type wanted it */
         CmpSelfHeal = FALSE;
-        if (CmpBootType & 4)
+        if (CmpBootType & HBOOT_TYPE_SELF_HEAL)
         {
             /* We're disabled, so bugcheck */
             KeBugCheckEx(BAD_SYSTEM_CONFIG_INFO,
@@ -1245,7 +1245,7 @@ CmpLoadHiveThread(IN PVOID StartContext)
                                      CmpMachineHiveList[i].HHiveFlags,
                                      &CmHive,
                                      &CmpMachineHiveList[i].Allocate,
-                                     0);
+                                     CM_CHECK_REGISTRY_PURGE_VOLATILES);
         if (!(NT_SUCCESS(Status)) ||
             (!(CmpShareSystemHives) && !(CmHive->FileHandles[HFILE_TYPE_LOG])))
         {
@@ -1565,7 +1565,7 @@ CmInitSystem1(VOID)
                                NULL,
                                NULL,
                                NULL,
-                               0);
+                               CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES);
     if (!NT_SUCCESS(Status))
     {
         /* Bugcheck */
@@ -1656,7 +1656,7 @@ CmInitSystem1(VOID)
                                NULL,
                                NULL,
                                NULL,
-                               0);
+                               CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES);
     if (!NT_SUCCESS(Status))
     {
         /* Bugcheck */

Reply via email to