[NTOS] Do not perform hive write operations when we are not supposed to.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 12 Nov 2017 21:02:45 +0000 (22:02 +0100)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 12 Nov 2017 21:02:45 +0000 (22:02 +0100)
- 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
ntoskrnl/config/cmwraprs.c

index 6b079ce..112543f 100644 (file)
@@ -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,
index 031dc77..0f5e47d 100644 (file)
@@ -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;
 }