Author: fireball Date: Fri Nov 23 18:26:27 2007 New Revision: 30695
URL: http://svn.reactos.org/svn/reactos?rev=30695&view=rev Log: - Remove hack in CmpLinkHiveToMaster and make it support the "Allocate" boolean parameter. - Enable code in CmiInitHives to take advantage of the new link code when using the SYSTEM hive on the bootcd/setup. - Don't skip CmpCreateControlSet anymore, just add a simple hack to hard-code Current to 001. - Remove CmiInitControlSetLink since CmpCrateControlSet now does the work - Enable code in CmpInitializeSystemHive to use CmpInitializeHive(HINIT_CREATE) when creating a new SYSTEM hive, since we now have new link code that supports the "Allocate" flag. - This means we now have a working SYSTEM hive on the Boot CD as well since early bootup, and not only when NtInitializeRegistry is called - Do bootcd vs hard-disk boot registry path setup in CmpGetRegistryPath instead of in-line.
Modified: trunk/reactos/ntoskrnl/cm/registry.c trunk/reactos/ntoskrnl/config/cmsysini.c
Modified: trunk/reactos/ntoskrnl/cm/registry.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/registry.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/cm/registry.c (original) +++ trunk/reactos/ntoskrnl/cm/registry.c Fri Nov 23 18:26:27 2007 @@ -115,9 +115,6 @@ CM_PARSE_CONTEXT ParseContext = {0}; PAGED_CODE();
- /* TEMPHACK: Don't do anything if we don't actually have a hive */ - if (Allocate) return STATUS_SUCCESS; - /* Setup the object attributes */ InitializeObjectAttributes(&ObjectAttributes, LinkName, @@ -130,8 +127,17 @@ ParseContext.CreateOperation = TRUE; ParseContext.ChildHive.KeyHive = &RegistryHive->Hive;
- /* Because of CmCreateRootNode, ReactOS Hack */ - ParseContext.ChildHive.KeyCell = RegistryHive->Hive.BaseBlock->RootCell; + /* Check if we have a root keycell or if we need to create it */ + if (Allocate) + { + /* Create it */ + ParseContext.ChildHive.KeyCell = HCELL_NIL; + } + else + { + /* We have one */ + ParseContext.ChildHive.KeyCell = RegistryHive->Hive.BaseBlock->RootCell; + }
/* Capture all the info */ Status = ObpCaptureObjectAttributes(&ObjectAttributes, @@ -181,7 +187,7 @@ NULL, RemainingPath, KernelMode, - REG_OPTION_VOLATILE, + 0, &ParseContext, ParentKey->KeyControlBlock, (PVOID*)&NewKey); @@ -217,142 +223,23 @@ return STATUS_SUCCESS; }
-static NTSTATUS -CmiInitControlSetLink (VOID) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING ControlSetKeyName = RTL_CONSTANT_STRING( - L"\Registry\Machine\SYSTEM\ControlSet001"); - UNICODE_STRING ControlSetLinkName = RTL_CONSTANT_STRING( - L"\Registry\Machine\SYSTEM\CurrentControlSet"); - UNICODE_STRING ControlSetValueName = RTL_CONSTANT_STRING(L"SymbolicLinkValue"); - HANDLE KeyHandle; - NTSTATUS Status; - - /* Create 'ControlSet001' key */ - InitializeObjectAttributes (&ObjectAttributes, - &ControlSetKeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - Status = ZwCreateKey (&KeyHandle, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT1 ("ZwCreateKey() failed (Status %lx)\n", Status); - return Status; - } - ZwClose (KeyHandle); - - /* Link 'CurrentControlSet' to 'ControlSet001' key */ - InitializeObjectAttributes (&ObjectAttributes, - &ControlSetLinkName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_OPENLINK, - NULL, - NULL); - Status = ZwCreateKey (&KeyHandle, - KEY_ALL_ACCESS | KEY_CREATE_LINK, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK, - NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT1 ("ZwCreateKey() failed (Status %lx)\n", Status); - return Status; - } - - Status = ZwSetValueKey (KeyHandle, - &ControlSetValueName, - 0, - REG_LINK, - (PVOID)ControlSetKeyName.Buffer, - ControlSetKeyName.Length); - if (!NT_SUCCESS(Status)) - { - DPRINT1 ("ZwSetValueKey() failed (Status %lx)\n", Status); - } - ZwClose (KeyHandle); - - return STATUS_SUCCESS; -} +NTSTATUS +NTAPI +CmpGetRegistryPath(IN PWCHAR ConfigPath);
NTSTATUS CmiInitHives(BOOLEAN SetupBoot) { - PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING FileName; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\Registry\Machine\HARDWARE"); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"InstallPath"); - HANDLE KeyHandle; - NTSTATUS Status; - WCHAR ConfigPath[MAX_PATH]; - - ULONG BufferSize; - ULONG ResultSize; PWSTR EndPtr; PCMHIVE CmHive; BOOLEAN Allocate = TRUE; + UNICODE_STRING FileName, KeyName;
DPRINT("CmiInitHives() called\n");
- if (SetupBoot == TRUE) - { - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - Status = ZwOpenKey(&KeyHandle, - KEY_ALL_ACCESS, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT1("ZwOpenKey() failed (Status %lx)\n", Status); - return(Status); - } - - BufferSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 4096; - ValueInfo = ExAllocatePool(PagedPool, BufferSize); - if (ValueInfo == NULL) - { - ZwClose(KeyHandle); - return(STATUS_INSUFFICIENT_RESOURCES); - } - - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - ValueInfo, - BufferSize, - &ResultSize); - ZwClose(KeyHandle); - if (!NT_SUCCESS(Status)) - { - ExFreePool(ValueInfo); - return(Status); - } - - RtlCopyMemory(ConfigPath, - ValueInfo->Data, - ValueInfo->DataLength); - ConfigPath[ValueInfo->DataLength / sizeof(WCHAR)] = (WCHAR)0; - ExFreePool(ValueInfo); - } - else - { - wcscpy(ConfigPath, L"\SystemRoot"); - } - wcscat(ConfigPath, L"\system32\config"); + CmpGetRegistryPath(ConfigPath); DPRINT("ConfigPath: %S\n", ConfigPath); EndPtr = ConfigPath + wcslen(ConfigPath);
@@ -401,10 +288,6 @@ /* Connect the SYSTEM hive only if it has been created */ if (SetupBoot == TRUE) { - wcscpy(EndPtr, REG_SYSTEM_FILE_NAME); - RtlInitUnicodeString(&FileName, ConfigPath); - DPRINT ("ConfigPath: %S\n", ConfigPath); -#if 0 HANDLE PrimaryHandle, LogHandle; ULONG PrimaryDisposition, SecondaryDisposition; ULONG ClusterSize, Length; @@ -439,7 +322,7 @@ CmHive->FileHandles[HFILE_TYPE_PRIMARY] = PrimaryHandle;
/* Allow lazy flushing since the handles are there */ - ASSERT(CmHive->Hive.HiveFlags & HIVE_NOLAZYFLUSH); + //ASSERT(CmHive->Hive.HiveFlags & HIVE_NOLAZYFLUSH); CmHive->Hive.HiveFlags &= ~HIVE_NOLAZYFLUSH;
/* Get the real size of the hive */ @@ -454,28 +337,6 @@ /* This shouldn't fail */ ASSERT(FALSE); } - - /* Setup the key name for the SECURITY hive */ - RtlInitUnicodeString (&KeyName, REG_SYSTEM_KEY_NAME); -#else - /* Load the hive */ - Status = CmpInitHiveFromFile(&FileName, - 0, - &CmHive, - &Allocate, - 0); - - /* Setup the key name for the SECURITY hive */ - RtlInitUnicodeString (&KeyName, REG_SYSTEM_KEY_NAME); - - Status = CmpLinkHiveToMaster(&KeyName, - NULL, - CmHive, - FALSE, - NULL); - - Status = CmiInitControlSetLink (); -#endif }
/* Connect the DEFAULT hive */
Modified: trunk/reactos/ntoskrnl/config/cmsysini.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmsysini.c?... ============================================================================== --- trunk/reactos/ntoskrnl/config/cmsysini.c (original) +++ trunk/reactos/ntoskrnl/config/cmsysini.c Fri Nov 23 18:26:27 2007 @@ -152,11 +152,10 @@ CmpSetSystemValues(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName, ValueName; + UNICODE_STRING KeyName, ValueName = {0}; HANDLE KeyHandle; NTSTATUS Status; ASSERT(LoaderBlock != NULL); - if (ExpInTextModeSetup) return STATUS_SUCCESS;
/* Setup attributes for loader options */ RtlInitUnicodeString(&KeyName, @@ -198,7 +197,7 @@ NtClose(KeyHandle);
/* Return the status */ - return Status; + return (ExpInTextModeSetup ? STATUS_SUCCESS : Status); }
NTSTATUS @@ -222,7 +221,6 @@ ULONG ResultLength, Disposition; PLOADER_PARAMETER_EXTENSION LoaderExtension; PAGED_CODE(); - if (ExpInTextModeSetup) return STATUS_SUCCESS;
/* Open the select key */ InitializeObjectAttributes(&ObjectAttributes, @@ -231,7 +229,19 @@ NULL, NULL); Status = NtOpenKey(&SelectHandle, KEY_READ, &ObjectAttributes); - if (!NT_SUCCESS(Status)) return(Status); + if (!NT_SUCCESS(Status)) + { + /* ReactOS Hack: Hard-code current to 001 for SetupLdr */ + if (!LoaderBlock->RegistryBase) + { + /* Use hard-coded setting */ + ControlSet = 1; + goto UseSet; + } + + /* Fail for real boots */ + return Status; + }
/* Open the current value */ RtlInitUnicodeString(&KeyName, L"Current"); @@ -249,6 +259,7 @@ ControlSet = *(PULONG)((PUCHAR)ValueInfo + ValueInfo->DataOffset);
/* Create the current control set key */ +UseSet: RtlInitUnicodeString(&KeyName, L"\Registry\Machine\System\CurrentControlSet"); InitializeObjectAttributes(&ObjectAttributes, @@ -499,10 +510,9 @@ else { /* Create it */ -#if 0 Status = CmpInitializeHive(&SystemHive, HINIT_CREATE, - 0, //HIVE_NOLAZYFLUSH, + HIVE_NOLAZYFLUSH, HFILE_TYPE_LOG, NULL, NULL, @@ -514,7 +524,7 @@
/* Set the hive filename */ RtlCreateUnicodeString(&SystemHive->FileFullPath, SYSTEM_REG_FILE); -#endif + /* Tell CmpLinkHiveToMaster to allocate a hive */ Allocate = TRUE; } @@ -750,11 +760,83 @@ return TRUE; }
+NTSTATUS +NTAPI +CmpGetRegistryPath(IN PWCHAR ConfigPath) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + HANDLE KeyHandle; + PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; + UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\Registry\Machine\HARDWARE"); + UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"InstallPath"); + ULONG BufferSize,ResultSize; + + /* Check if we are booted in setup */ + if (ExpInTextModeSetup) + { + /* Setup the object attributes */ + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + /* Open the key */ + Status = ZwOpenKey(&KeyHandle, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) return Status; + + /* Allocate the buffer */ + BufferSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 4096; + ValueInfo = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_CM); + if (!ValueInfo) + { + /* Fail */ + ZwClose(KeyHandle); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Query the value */ + Status = ZwQueryValueKey(KeyHandle, + &ValueName, + KeyValuePartialInformation, + ValueInfo, + BufferSize, + &ResultSize); + ZwClose(KeyHandle); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + ExFreePool(ValueInfo); + return Status; + } + + /* Copy the config path and null-terminate it */ + RtlCopyMemory(ConfigPath, + ValueInfo->Data, + ValueInfo->DataLength); + ConfigPath[ValueInfo->DataLength / sizeof(WCHAR)] = UNICODE_NULL; + ExFreePool(ValueInfo); + } + else + { + /* Just use default path */ + wcscpy(ConfigPath, L"\SystemRoot"); + } + + /* Add registry path */ + wcscat(ConfigPath, L"\System32\Config"); + + /* Done */ + return STATUS_SUCCESS; +} + VOID NTAPI CmpLoadHiveThread(IN PVOID StartContext) { - WCHAR FileBuffer[MAX_PATH], RegBuffer[MAX_PATH]; + WCHAR FileBuffer[MAX_PATH], RegBuffer[MAX_PATH], ConfigPath[MAX_PATH]; UNICODE_STRING TempName, FileName, RegName; ULONG FileStart, RegStart, i, ErrorResponse, ClusterSize, WorkerCount; ULONG PrimaryDisposition, SecondaryDisposition, Length; @@ -777,7 +859,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;