From 0b2bbd1125a935fb50e979812d3a34cfde500882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 13 Nov 2017 00:27:41 +0100 Subject: [PATCH] [NTOS] Addendum to da81345: Fix checks when a hive is opened in shared mode. --- ntoskrnl/config/cminit.c | 14 ++++++++------ ntoskrnl/config/cmsysini.c | 7 +++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/ntoskrnl/config/cminit.c b/ntoskrnl/config/cminit.c index 46ab61e4b30..bf055fd914d 100644 --- a/ntoskrnl/config/cminit.c +++ b/ntoskrnl/config/cminit.c @@ -38,15 +38,17 @@ CmpInitializeHive(OUT PCMHIVE *CmHive, /* * The following are invalid: - * An external hive that is also internal. - * A log hive that's not a primary hive too. - * A volatile hive that's linked to permanent storage. - * An in-memory initialization without hive data. - * A log hive that's not linked to a correct file type. + * - An external hive that is also internal. + * - A log hive that is not a primary hive too. + * - A volatile hive that is linked to permanent storage, + * unless this hive is a shared system hive. + * - An in-memory initialization without hive data. + * - A log hive that is not linked to a correct file type. */ if (((External) && ((Primary) || (Log))) || ((Log) && !(Primary)) || - ((HiveFlags & HIVE_VOLATILE) && ((Primary) || (External) || (Log))) || + (!(CmpShareSystemHives) && (HiveFlags & HIVE_VOLATILE) && + ((Primary) || (External) || (Log))) || ((OperationType == HINIT_MEMORY) && (!HiveData)) || ((Log) && (FileType != HFILE_TYPE_LOG))) { diff --git a/ntoskrnl/config/cmsysini.c b/ntoskrnl/config/cmsysini.c index 112543fac7c..a433485eb25 100644 --- a/ntoskrnl/config/cmsysini.c +++ b/ntoskrnl/config/cmsysini.c @@ -1297,9 +1297,12 @@ CmpLoadHiveThread(IN PVOID StartContext) &CmpMachineHiveList[i].Allocate, 0); if (!(NT_SUCCESS(Status)) || - (!(CmHive->FileHandles[HFILE_TYPE_LOG]) && !(CmpMiniNTBoot))) // HACK + (!(CmpShareSystemHives) && !(CmHive->FileHandles[HFILE_TYPE_LOG]))) { - /* We failed or couldn't get a log file, raise a hard error */ + /* + * We failed, or could not get a log file (unless + * the hive is shared), raise a hard error. + */ ErrorParameters = &FileName; NtRaiseHardError(STATUS_CANNOT_LOAD_REGISTRY_FILE, 1,