[ros-diffs] [fireball] 30703: - Remove CmiInitHives. - Enable parallel hive loading, this speeds up boot by loading the registry in 6 threads instead of just one (once we start having large registries and MP support this will be more evident). - Added some little hacks to make this work for now. - Fix a memory leak in CmInit1. - Add hardware hive to machine hive list so it can be properly loaded after.

fireball at svn.reactos.org fireball at svn.reactos.org
Fri Nov 23 19:52:47 CET 2007


Author: fireball
Date: Fri Nov 23 21:52:46 2007
New Revision: 30703

URL: http://svn.reactos.org/svn/reactos?rev=30703&view=rev
Log:
- Remove CmiInitHives.
- Enable parallel hive loading, this speeds up boot by loading the registry in 6 threads instead of just one (once we start having large registries and MP support this will be more evident).
- Added some little hacks to make this work for now.
- Fix a memory leak in CmInit1.
- Add hardware hive to machine hive list so it can be properly loaded after.

Modified:
    trunk/reactos/ntoskrnl/cm/ntfunc.c
    trunk/reactos/ntoskrnl/cm/registry.c
    trunk/reactos/ntoskrnl/config/cmsysini.c

Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/ntfunc.c?rev=30703&r1=30702&r2=30703&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cm/ntfunc.c (original)
+++ trunk/reactos/ntoskrnl/cm/ntfunc.c Fri Nov 23 21:52:46 2007
@@ -582,8 +582,6 @@
 NTAPI
 NtInitializeRegistry (IN USHORT Flag)
 {
-    NTSTATUS Status;
-    
     PAGED_CODE();
     
     if (CmiRegistryInitialized == TRUE)
@@ -591,13 +589,11 @@
     
     /* Save boot log file */
     IopSaveBootLogToFile();
-    
-    Status = CmiInitHives (Flag);
-    
+        
     CmpCmdInit(Flag);
     CmiRegistryInitialized = TRUE;
     
-    return Status;
+    return STATUS_SUCCESS;
 }
 
 /* EOF */

Modified: trunk/reactos/ntoskrnl/cm/registry.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/registry.c?rev=30703&r1=30702&r2=30703&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cm/registry.c (original)
+++ trunk/reactos/ntoskrnl/cm/registry.c Fri Nov 23 21:52:46 2007
@@ -223,165 +223,6 @@
     return STATUS_SUCCESS;    
 }
 
-NTSTATUS
-NTAPI
-CmpGetRegistryPath(IN PWCHAR ConfigPath);
-
-NTSTATUS
-CmiInitHives(BOOLEAN SetupBoot)
-{
-    NTSTATUS Status;
-    WCHAR ConfigPath[MAX_PATH];
-    PWSTR EndPtr;
-    PCMHIVE CmHive;
-    BOOLEAN Allocate = TRUE;
-    UNICODE_STRING FileName, KeyName;
-
-    DPRINT("CmiInitHives() called\n");
-
-    CmpGetRegistryPath(ConfigPath);
-    DPRINT("ConfigPath: %S\n", ConfigPath);
-    EndPtr = ConfigPath + wcslen(ConfigPath);
-
-    /* Setup the file name for the SECURITY hive */
-    wcscpy(EndPtr, REG_SEC_FILE_NAME);
-    RtlInitUnicodeString(&FileName, ConfigPath);
-    DPRINT ("ConfigPath: %S\n", ConfigPath);
-    
-    /* Load the hive */
-    Status = CmpInitHiveFromFile(&FileName,
-                                 0,
-                                 &CmHive,
-                                 &Allocate,
-                                 0);
-    
-    /* Setup the key name for the SECURITY hive */
-    RtlInitUnicodeString(&KeyName, REG_SEC_KEY_NAME);
-    
-    Status = CmpLinkHiveToMaster(&KeyName,
-                                 NULL,
-                                 CmHive,
-                                 FALSE,
-                                 NULL);
-    
-    /* Connect the SOFTWARE hive */
-    wcscpy(EndPtr, REG_SOFTWARE_FILE_NAME);
-    RtlInitUnicodeString(&FileName, ConfigPath);
-    DPRINT ("ConfigPath: %S\n", ConfigPath);
-
-    /* Load the hive */
-    Status = CmpInitHiveFromFile(&FileName,
-                                 0,
-                                 &CmHive,
-                                 &Allocate,
-                                 0);
-    
-    /* Setup the key name for the SECURITY hive */
-    RtlInitUnicodeString (&KeyName, REG_SOFTWARE_KEY_NAME);
-    
-    Status = CmpLinkHiveToMaster(&KeyName,
-                                 NULL,
-                                 CmHive,
-                                 FALSE,
-                                 NULL);
-    
-    /* Connect the SYSTEM hive only if it has been created */
-    if (SetupBoot == TRUE)
-    {
-        HANDLE PrimaryHandle, LogHandle;
-        ULONG PrimaryDisposition, SecondaryDisposition;
-        ULONG ClusterSize, Length;
-        
-        /* Build the file name */
-        wcscpy(EndPtr, REG_SYSTEM_FILE_NAME);
-        RtlInitUnicodeString(&FileName, ConfigPath);
-        DPRINT ("ConfigPath: %S\n", ConfigPath);
-        
-        /* Hive already exists */
-        CmHive = CmpMachineHiveList[3].CmHive;
-        
-        /* Open the hive file and log */
-        Status = CmpOpenHiveFiles(&FileName,
-                                  L".LOG",
-                                  &PrimaryHandle,
-                                  &LogHandle,
-                                  &PrimaryDisposition,
-                                  &SecondaryDisposition,
-                                  TRUE,
-                                  TRUE,
-                                  FALSE,
-                                  &ClusterSize);
-        if (!(NT_SUCCESS(Status)) || !(LogHandle))
-        {
-            /* Bugcheck */
-            KeBugCheck(BAD_SYSTEM_CONFIG_INFO);
-        }
-        
-        /* Save the file handles */
-        CmHive->FileHandles[HFILE_TYPE_LOG] = LogHandle;
-        CmHive->FileHandles[HFILE_TYPE_PRIMARY] = PrimaryHandle;
-        
-        /* Allow lazy flushing since the handles are there */
-        //ASSERT(CmHive->Hive.HiveFlags & HIVE_NOLAZYFLUSH);
-        CmHive->Hive.HiveFlags &= ~HIVE_NOLAZYFLUSH;
-        
-        /* Get the real size of the hive */
-        Length = CmHive->Hive.Storage[Stable].Length + HBLOCK_SIZE;
-        
-        /* Check if the cluster size doesn't match */
-        if (CmHive->Hive.Cluster != ClusterSize) ASSERT(FALSE);
-        
-        /* Set the file size */
-        if (!CmpFileSetSize((PHHIVE)CmHive, HFILE_TYPE_PRIMARY, Length, Length))
-        {
-            /* This shouldn't fail */
-            ASSERT(FALSE);
-        }
-    }
-
-    /* Connect the DEFAULT hive */
-    wcscpy(EndPtr, REG_DEFAULT_USER_FILE_NAME);
-    RtlInitUnicodeString(&FileName, ConfigPath);
-    DPRINT ("ConfigPath: %S\n", ConfigPath);
-
-    /* Load the hive */
-    Status = CmpInitHiveFromFile(&FileName,
-                                 0,
-                                 &CmHive,
-                                 &Allocate,
-                                 0);
-
-    /* Setup the key name for the SECURITY hive */
-    RtlInitUnicodeString (&KeyName, REG_DEFAULT_USER_KEY_NAME);
-    
-    Status = CmpLinkHiveToMaster(&KeyName,
-                                 NULL,
-                                 CmHive,
-                                 FALSE,
-                                 NULL);
-
-    /* Connect the SAM hive */
-    wcscpy(EndPtr, REG_SAM_FILE_NAME);
-    RtlInitUnicodeString(&FileName, ConfigPath);
-    DPRINT ("ConfigPath: %S\n", ConfigPath);
-    
-    /* Load the hive */
-    Status = CmpInitHiveFromFile(&FileName,
-                                 0,
-                                 &CmHive,
-                                 &Allocate,
-                                 0);
-    
-    /* Setup the key name for the SECURITY hive */
-    RtlInitUnicodeString(&KeyName, REG_SAM_KEY_NAME);
-    Status = CmpLinkHiveToMaster(&KeyName,
-                                 NULL,
-                                 CmHive,
-                                 FALSE,
-                                 NULL);
-    return Status;
-}
-
 VOID
 NTAPI
 CmShutdownRegistry(VOID)

Modified: trunk/reactos/ntoskrnl/config/cmsysini.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmsysini.c?rev=30703&r1=30702&r2=30703&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmsysini.c (original)
+++ trunk/reactos/ntoskrnl/config/cmsysini.c Fri Nov 23 21:52:46 2007
@@ -826,7 +826,7 @@
     }
 
     /* Add registry path */
-    wcscat(ConfigPath, L"\\System32\\Config");
+    wcscat(ConfigPath, L"\\System32\\Config\\");
 
     /* Done */
     return STATUS_SUCCESS;
@@ -888,13 +888,11 @@
     RtlAppendStringToString((PSTRING)&FileName, (PSTRING)&TempName);
     if (!CmpMachineHiveList[i].CmHive)
     {
-        /* We need to allocate a ne whive structure */
+        /* We need to allocate a new hive structure */
         CmpMachineHiveList[i].Allocate = TRUE;
         
         /* Load the hive file */
         DPRINT1("[HiveLoad]: Load from file %wZ\n", &FileName);
-        CmpMachineHiveList[i].CmHive2 = (PVOID)0xBAADBEEF;
-        goto Later;
         Status = CmpInitHiveFromFile(&FileName,
                                      CmpMachineHiveList[i].HHiveFlags,
                                      &CmHive,
@@ -918,13 +916,12 @@
     }
     else
     {
+        if (ExpInTextModeSetup) {
         /* We already have a hive, is it volatile? */
         CmHive = CmpMachineHiveList[i].CmHive;
         if (!(CmHive->Hive.HiveFlags & HIVE_VOLATILE))
         {
             DPRINT1("[HiveLoad]: Open from file %wZ\n", &FileName);
-            CmpMachineHiveList[i].CmHive2 = CmHive;
-            goto Later;
             
             /* It's now, open the hive file and log */
             Status = CmpOpenHiveFiles(&FileName,
@@ -957,7 +954,7 @@
             CmHive->FileHandles[HFILE_TYPE_PRIMARY] = PrimaryHandle;
             
             /* Allow lazy flushing since the handles are there -- remove sync hacks */
-            ASSERT(CmHive->Hive.HiveFlags & HIVE_NOLAZYFLUSH);
+            //ASSERT(CmHive->Hive.HiveFlags & HIVE_NOLAZYFLUSH);
             CmHive->Hive.HiveFlags &= ~HIVE_NOLAZYFLUSH;
             
             /* Get the real size of the hive */
@@ -979,17 +976,15 @@
             /* Finally, set our allocated hive to the same hive we've had */
             CmpMachineHiveList[i].CmHive2 = CmHive;
             ASSERT(CmpMachineHiveList[i].CmHive == CmpMachineHiveList[i].CmHive2);
-        }
+        }}
     }
     
     /* We're done */
-Later:
     CmpMachineHiveList[i].ThreadFinished = TRUE;
     
     /* Check if we're the last worker */
     WorkerCount = InterlockedIncrement(&CmpLoadWorkerIncrement);
     if (WorkerCount == CM_NUMBER_OF_MACHINE_HIVES)
-    
     {
         /* Signal the event */
         KeSetEvent(&CmpLoadWorkerEvent, 0, FALSE);
@@ -1003,7 +998,7 @@
 NTAPI
 CmpInitializeHiveList(IN USHORT Flag)
 {
-    WCHAR FileBuffer[MAX_PATH], RegBuffer[MAX_PATH];
+    WCHAR FileBuffer[MAX_PATH], RegBuffer[MAX_PATH], ConfigPath[MAX_PATH];
     UNICODE_STRING TempName, FileName, RegName;
     HANDLE Thread;
     NTSTATUS Status;
@@ -1019,7 +1014,8 @@
     RtlInitEmptyUnicodeString(&RegName, RegBuffer, MAX_PATH);
     
     /* Now build the system root path */
-    RtlInitUnicodeString(&TempName, L"\\SystemRoot\\System32\\Config\\");
+    CmpGetRegistryPath(ConfigPath);
+    RtlInitUnicodeString(&TempName, ConfigPath);
     RtlAppendStringToString((PSTRING)&FileName, (PSTRING)&TempName);
     FileStart = FileName.Length;
     
@@ -1105,11 +1101,10 @@
             
             /* Now link the hive to its master */
             DPRINT1("[HiveLoad]: Link %wZ\n", &RegName);
-#if 0
             Status = CmpLinkHiveToMaster(&RegName,
                                          NULL,
                                          CmpMachineHiveList[i].CmHive2,
-                                         CmpMachineHiveList[i].Allocate,
+                                         FALSE, //CmpMachineHiveList[i].Allocate,
                                          SecurityDescriptor);
             if (Status != STATUS_SUCCESS)
             {
@@ -1121,9 +1116,8 @@
 			if (CmpMachineHiveList[i].Allocate)
             {
                 /* Sync the new hive */
-				HvSyncHive((PHHIVE)(CmpMachineHiveList[i].CmHive2));
-			}
-#endif      
+				//HvSyncHive((PHHIVE)(CmpMachineHiveList[i].CmHive2));
+			}   
         }
         
         /* Check if we created a new hive */
@@ -1310,19 +1304,27 @@
         /* Bugcheck */
         KEBUGCHECKEX(CONFIG_INITIALIZATION_FAILED, 1, 11, Status, 0);
     }
+    
+    /* Add the hive to the hive list */
+    CmpMachineHiveList[0].CmHive = (PCMHIVE)HardwareHive;
 
     /* Attach it to the machine key */
     RtlInitUnicodeString(&KeyName, REG_HARDWARE_KEY_NAME);
     Status = CmpLinkHiveToMaster(&KeyName,
                                  NULL,
                                  (PCMHIVE)HardwareHive,
-                                 FALSE,
+                                 FALSE, // TRUE
                                  SecurityDescriptor);
     if (!NT_SUCCESS(Status))
     {
         /* Bugcheck */
         KEBUGCHECKEX(CONFIG_INITIALIZATION_FAILED, 1, 12, Status, 0);
     }
+    
+    /* FIXME: Add to HiveList key */
+    
+    /* Free the security descriptor */
+    ExFreePool(SecurityDescriptor);
 
     /* Fill out the Hardware key with the ARC Data from the Loader */
     Status = CmpInitializeHardwareConfiguration(KeLoaderBlock);




More information about the Ros-diffs mailing list