https://git.reactos.org/?p=reactos.git;a=commitdiff;h=da8134527b69a2a1bc019…
commit da8134527b69a2a1bc0193352dcb73b70762f613
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sun Nov 12 22:02:45 2017 +0100
[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.
---
ntoskrnl/config/cmsysini.c | 8 ++++++--
ntoskrnl/config/cmwraprs.c | 24 ++++++++++++++++++++++++
2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/ntoskrnl/config/cmsysini.c b/ntoskrnl/config/cmsysini.c
index 6b079ce0d4..112543fac7 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 031dc77c00..0f5e47da92 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;
}