https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d2b8b9ec9689443ed311cf...
commit d2b8b9ec9689443ed311cf6821f2723054aca1b1 Author: George Bișoc george.bisoc@reactos.org AuthorDate: Wed Oct 26 19:59:21 2022 +0200 Commit: George Bișoc george.bisoc@reactos.org 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 */