From: Hermès Bélusca-Maïto Date: Sun, 12 Nov 2017 21:02:45 +0000 (+0100) Subject: [NTOS] Do not perform hive write operations when we are not supposed to. X-Git-Tag: v0.4.7~84 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=da8134527b69a2a1bc0193352dcb73b70762f613 [NTOS] Do not perform hive write operations when we are not supposed to. - When we are in LiveCD mode (more generally, when hives are shared), load the system hives as volatile. - Ignore hive write operations when everything operates in read-only mode and just return success instead. - Just return success on hive file I/O if no file is associated with a given hive. This happens when e.g. a CM hive has a primary but no log. --- diff --git a/ntoskrnl/config/cmsysini.c b/ntoskrnl/config/cmsysini.c index 6b079ce0d40..112543fac7c 100644 --- a/ntoskrnl/config/cmsysini.c +++ b/ntoskrnl/config/cmsysini.c @@ -900,7 +900,7 @@ CmpInitializeSystemHive(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* We imported, no need to create a new hive */ Allocate = FALSE; - /* Manually set the hive as volatile, if in Live CD mode */ + /* Manually set the hive as volatile, if in LiveCD mode */ if (CmpShareSystemHives) SystemHive->Hive.HiveFlags = HIVE_VOLATILE; } else @@ -1433,9 +1433,13 @@ CmpInitializeHiveList(IN USHORT Flag) /* Loop every hive we care about */ for (i = 0; i < CM_NUMBER_OF_MACHINE_HIVES; i++) { - /* Make sure the list is setup */ + /* Make sure the list is set up */ ASSERT(CmpMachineHiveList[i].Name != NULL); + /* Load the hive as volatile, if in LiveCD mode */ + if (CmpShareSystemHives) + CmpMachineHiveList[i].HHiveFlags |= HIVE_VOLATILE; + /* Create a thread to handle this hive */ Status = PsCreateSystemThread(&Thread, THREAD_ALL_ACCESS, diff --git a/ntoskrnl/config/cmwraprs.c b/ntoskrnl/config/cmwraprs.c index 031dc77c00d..0f5e47da922 100644 --- a/ntoskrnl/config/cmwraprs.c +++ b/ntoskrnl/config/cmwraprs.c @@ -82,6 +82,10 @@ CmpFileRead(IN PHHIVE RegistryHive, IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; + /* Just return success if no file is associated with this hive */ + if (HiveHandle == NULL) + return TRUE; + _FileOffset.QuadPart = *FileOffset; Status = ZwReadFile(HiveHandle, NULL, NULL, NULL, &IoStatusBlock, Buffer, (ULONG)BufferLength, &_FileOffset, NULL); @@ -102,6 +106,14 @@ CmpFileWrite(IN PHHIVE RegistryHive, IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; + /* Just return success if no file is associated with this hive */ + if (HiveHandle == NULL) + return TRUE; + + /* Don't do anything if we're not supposed to */ + if (CmpNoWrite) + return TRUE; + _FileOffset.QuadPart = *FileOffset; Status = ZwWriteFile(HiveHandle, NULL, NULL, NULL, &IoStatusBlock, Buffer, (ULONG)BufferLength, &_FileOffset, NULL); @@ -122,6 +134,10 @@ CmpFileSetSize(IN PHHIVE RegistryHive, IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; + /* Just return success if no file is associated with this hive */ + if (HiveHandle == NULL) + return TRUE; + EndOfFileInfo.EndOfFile.QuadPart = FileSize; Status = ZwSetInformationFile(HiveHandle, &IoStatusBlock, @@ -153,6 +169,14 @@ CmpFileFlush(IN PHHIVE RegistryHive, IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; + /* Just return success if no file is associated with this hive */ + if (HiveHandle == NULL) + return TRUE; + + /* Don't do anything if we're not supposed to */ + if (CmpNoWrite) + return TRUE; + Status = ZwFlushBuffersFile(HiveHandle, &IoStatusBlock); return NT_SUCCESS(Status) ? TRUE : FALSE; }