Remobed duplicate functionality and cleaned-up the registry code.

svn path=/trunk/; revision=4813
This commit is contained in:
Eric Kohl 2003-06-01 17:39:14 +00:00
parent d197898a75
commit 8eb47000b7
3 changed files with 74 additions and 158 deletions

View file

@ -423,9 +423,7 @@ CmiScanKeyList(IN PKEY_OBJECT Parent,
IN ULONG Attributes);
NTSTATUS
CmiCreateRegistryHive(PWSTR Filename,
PREGISTRY_HIVE *RegistryHive,
BOOLEAN CreateNew);
CmiCreateVolatileHive(PREGISTRY_HIVE *RegistryHive);
NTSTATUS
CmiLoadHive(POBJECT_ATTRIBUTES KeyObjectAttributes,

View file

@ -847,9 +847,8 @@ CmiCreateHiveBitmap(PREGISTRY_HIVE Hive)
static NTSTATUS
CmiInitNonVolatileRegistryHive(PREGISTRY_HIVE RegistryHive,
PWSTR Filename,
BOOLEAN CreateNew)
CmiInitNonVolatileRegistryHive (PREGISTRY_HIVE RegistryHive,
PWSTR Filename)
{
OBJECT_ATTRIBUTES ObjectAttributes;
ULONG CreateDisposition;
@ -906,21 +905,7 @@ CmiInitNonVolatileRegistryHive(PREGISTRY_HIVE RegistryHive,
NULL,
NULL);
/*
* Note:
* This is a workaround to prevent a BSOD because of missing registry hives.
* The workaround is only useful for developers. An implementation for the
* ordinary user must bail out on missing registry hives because they are
* essential to booting and configuring the OS.
*/
#if 0
if (CreateNew == TRUE)
CreateDisposition = FILE_OPEN_IF;
else
CreateDisposition = FILE_OPEN;
#endif
CreateDisposition = FILE_OPEN_IF;
Status = NtCreateFile(&FileHandle,
FILE_ALL_ACCESS,
&ObjectAttributes,
@ -940,10 +925,6 @@ CmiInitNonVolatileRegistryHive(PREGISTRY_HIVE RegistryHive,
return(Status);
}
/* Note: Another workaround! See the note above! */
#if 0
if ((CreateNew) && (IoSB.Information == FILE_CREATED))
#endif
if (IoSB.Information != FILE_OPENED)
{
Status = CmiCreateNewRegFile(FileHandle);
@ -1068,91 +1049,66 @@ CmiInitNonVolatileRegistryHive(PREGISTRY_HIVE RegistryHive,
}
static NTSTATUS
CmiInitVolatileRegistryHive(PREGISTRY_HIVE RegistryHive)
NTSTATUS
CmiCreateVolatileHive(PREGISTRY_HIVE *RegistryHive)
{
PKEY_CELL RootKeyCell;
RegistryHive->Flags |= (HIVE_NO_FILE | HIVE_POINTER);
CmiCreateDefaultHiveHeader(RegistryHive->HiveHeader);
RootKeyCell = (PKEY_CELL) ExAllocatePool(NonPagedPool, sizeof(KEY_CELL));
if (RootKeyCell == NULL)
return STATUS_INSUFFICIENT_RESOURCES;
CmiCreateDefaultRootKeyCell(RootKeyCell);
RegistryHive->HiveHeader->RootKeyCell = (BLOCK_OFFSET) RootKeyCell;
return STATUS_SUCCESS;
}
NTSTATUS
CmiCreateRegistryHive(PWSTR Filename,
PREGISTRY_HIVE *RegistryHive,
BOOLEAN CreateNew)
{
PREGISTRY_HIVE Hive;
NTSTATUS Status;
DPRINT("CmiCreateRegistryHive(Filename %S)\n", Filename);
*RegistryHive = NULL;
Hive = ExAllocatePool(NonPagedPool, sizeof(REGISTRY_HIVE));
Hive = ExAllocatePool (NonPagedPool,
sizeof(REGISTRY_HIVE));
if (Hive == NULL)
return(STATUS_INSUFFICIENT_RESOURCES);
return STATUS_INSUFFICIENT_RESOURCES;
RtlZeroMemory (Hive,
sizeof(REGISTRY_HIVE));
DPRINT("Hive %x\n", Hive);
RtlZeroMemory(Hive, sizeof(REGISTRY_HIVE));
Hive->HiveHeader = (PHIVE_HEADER)
ExAllocatePool(NonPagedPool, sizeof(HIVE_HEADER));
Hive->HiveHeader = (PHIVE_HEADER)ExAllocatePool (NonPagedPool,
sizeof(HIVE_HEADER));
if (Hive->HiveHeader == NULL)
{
ExFreePool(Hive);
return(STATUS_INSUFFICIENT_RESOURCES);
ExFreePool (Hive);
return STATUS_INSUFFICIENT_RESOURCES;
}
if (Filename != NULL)
{
Status = CmiInitNonVolatileRegistryHive(Hive, Filename, CreateNew);
}
else
{
Status = CmiInitVolatileRegistryHive(Hive);
}
Hive->Flags = (HIVE_NO_FILE | HIVE_POINTER);
if (!NT_SUCCESS(Status))
CmiCreateDefaultHiveHeader (Hive->HiveHeader);
RootKeyCell = (PKEY_CELL)ExAllocatePool (NonPagedPool,
sizeof(KEY_CELL));
if (RootKeyCell == NULL)
{
ExFreePool(Hive->HiveHeader);
ExFreePool(Hive);
return(Status);
return STATUS_INSUFFICIENT_RESOURCES;
}
ExInitializeResourceLite(&Hive->HiveResource);
CmiCreateDefaultRootKeyCell (RootKeyCell);
Hive->HiveHeader->RootKeyCell = (BLOCK_OFFSET)RootKeyCell;
ExInitializeResourceLite (&Hive->HiveResource);
/* Acquire hive list lock exclusively */
ExAcquireResourceExclusiveLite(&CmiHiveListLock, TRUE);
ExAcquireResourceExclusiveLite (&CmiHiveListLock,
TRUE);
/* Add the new hive to the hive list */
InsertTailList(&CmiHiveListHead, &Hive->HiveList);
InsertTailList (&CmiHiveListHead,
&Hive->HiveList);
/* Release hive list lock */
ExReleaseResourceLite(&CmiHiveListLock);
ExReleaseResourceLite (&CmiHiveListLock);
VERIFY_REGISTRY_HIVE(Hive);
VERIFY_REGISTRY_HIVE (Hive);
*RegistryHive = Hive;
DPRINT("CmiCreateRegistryHive(Filename %S) - Finished.\n", Filename);
return(STATUS_SUCCESS);
return STATUS_SUCCESS;
}
@ -1180,6 +1136,7 @@ CmiLoadHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
sizeof(REGISTRY_HIVE));
DPRINT ("Hive %x\n", Hive);
Hive->Flags = (Flags & REG_NO_LAZY_FLUSH) ? HIVE_NO_SYNCH : 0;
Hive->HiveHeader = (PHIVE_HEADER)ExAllocatePool(NonPagedPool,
sizeof(HIVE_HEADER));
@ -1191,8 +1148,7 @@ CmiLoadHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
}
Status = CmiInitNonVolatileRegistryHive (Hive,
FileName->Buffer,
TRUE);
FileName->Buffer);
if (!NT_SUCCESS (Status))
{
DPRINT1 ("CmiInitNonVolatileRegistryHive() failed (Status %lx)\n", Status);

View file

@ -1,4 +1,4 @@
/* $Id: registry.c,v 1.100 2003/06/01 15:10:52 ekohl Exp $
/* $Id: registry.c,v 1.101 2003/06/01 17:39:14 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -283,7 +283,7 @@ CmInitializeRegistry(VOID)
ExInitializeResourceLite(&CmiHiveListLock);
/* Build volatile registry store */
Status = CmiCreateRegistryHive(NULL, &CmiVolatileHive, FALSE);
Status = CmiCreateVolatileHive (&CmiVolatileHive);
assert(NT_SUCCESS(Status));
/* Create '\Registry' key. */
@ -670,8 +670,7 @@ CmiDisconnectHive (IN POBJECT_ATTRIBUTES KeyObjectAttributes,
static NTSTATUS
CmiInitializeSystemHive (POBJECT_ATTRIBUTES KeyObjectAttributes,
PWSTR FileName)
CmiInitControlSetLink (VOID)
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING ControlSetKeyName;
@ -679,25 +678,6 @@ CmiInitializeSystemHive (POBJECT_ATTRIBUTES KeyObjectAttributes,
UNICODE_STRING ControlSetValueName;
HANDLE KeyHandle;
NTSTATUS Status;
PREGISTRY_HIVE RegistryHive;
Status = CmiCreateRegistryHive (FileName,
&RegistryHive,
TRUE);
if (!NT_SUCCESS(Status))
{
DPRINT1 ("CmiCreateRegistryHive() failed (Status %lx)\n", Status);
return Status;
}
Status = CmiConnectHive (KeyObjectAttributes,
RegistryHive);
if (!NT_SUCCESS(Status))
{
DPRINT1 ("CmiConnectHive() failed (Status %lx)\n", Status);
CmiRemoveRegistryHive (RegistryHive);
return Status;
}
/* Create 'ControlSet001' key */
RtlInitUnicodeStringFromLiteral (&ControlSetKeyName,
@ -760,50 +740,12 @@ CmiInitializeSystemHive (POBJECT_ATTRIBUTES KeyObjectAttributes,
}
NTSTATUS
CmiInitializeHive(POBJECT_ATTRIBUTES KeyObjectAttributes,
PWSTR FileName,
BOOLEAN CreateNew)
{
PREGISTRY_HIVE RegistryHive;
NTSTATUS Status;
DPRINT("CmiInitializeHive(%s) called\n", KeyName);
Status = CmiCreateRegistryHive(FileName,
&RegistryHive,
CreateNew);
if (!NT_SUCCESS(Status))
{
DPRINT1("CmiCreateRegistryHive() failed (Status %lx)\n", Status);
/* FIXME: Try to load the backup hive */
KeBugCheck(0);
return(Status);
}
/* Connect the hive */
Status = CmiConnectHive(KeyObjectAttributes, //KeyName,
RegistryHive);
if (!NT_SUCCESS(Status))
{
DPRINT1("CmiConnectHive() failed (Status %lx)\n", Status);
CmiRemoveRegistryHive(RegistryHive);
return(Status);
}
DPRINT("CmiInitializeHive() done\n");
return(STATUS_SUCCESS);
}
NTSTATUS
CmiInitHives(BOOLEAN SetupBoot)
{
PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING FileName;
UNICODE_STRING KeyName;
UNICODE_STRING ValueName;
HANDLE KeyHandle;
@ -895,17 +837,30 @@ CmiInitHives(BOOLEAN SetupBoot)
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
Status = CmiInitializeSystemHive (&ObjectAttributes,
ConfigPath);
RtlInitUnicodeString (&FileName,
ConfigPath);
Status = CmiLoadHive (&ObjectAttributes,
&FileName,
0);
if (!NT_SUCCESS(Status))
{
DPRINT1("CmiInitializeSystemHive() failed (Status %lx)\n", Status);
DPRINT1 ("CmiLoadHive() failed (Status %lx)\n", Status);
return Status;
}
Status = CmiInitControlSetLink ();
if (!NT_SUCCESS(Status))
{
DPRINT1("CmiInitControlSetLink() failed (Status %lx)\n", Status);
return(Status);
}
}
/* Connect the SOFTWARE hive */
wcscpy(EndPtr, REG_SOFTWARE_FILE_NAME);
RtlInitUnicodeString (&FileName,
ConfigPath);
DPRINT ("ConfigPath: %S\n", ConfigPath);
RtlInitUnicodeString (&KeyName,
@ -915,9 +870,10 @@ CmiInitHives(BOOLEAN SetupBoot)
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
Status = CmiInitializeHive(&ObjectAttributes,
ConfigPath,
SetupBoot);
Status = CmiLoadHive (&ObjectAttributes,
&FileName,
0);
if (!NT_SUCCESS(Status))
{
DPRINT1("CmiInitializeHive() failed (Status %lx)\n", Status);
@ -926,6 +882,8 @@ CmiInitHives(BOOLEAN SetupBoot)
/* Connect the SAM hive */
wcscpy(EndPtr, REG_SAM_FILE_NAME);
RtlInitUnicodeString (&FileName,
ConfigPath);
DPRINT ("ConfigPath: %S\n", ConfigPath);
RtlInitUnicodeString (&KeyName,
@ -935,9 +893,9 @@ CmiInitHives(BOOLEAN SetupBoot)
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
Status = CmiInitializeHive(&ObjectAttributes,
ConfigPath,
SetupBoot);
Status = CmiLoadHive (&ObjectAttributes,
&FileName,
0);
if (!NT_SUCCESS(Status))
{
DPRINT1("CmiInitializeHive() failed (Status %lx)\n", Status);
@ -946,6 +904,8 @@ CmiInitHives(BOOLEAN SetupBoot)
/* Connect the SECURITY hive */
wcscpy(EndPtr, REG_SEC_FILE_NAME);
RtlInitUnicodeString (&FileName,
ConfigPath);
DPRINT ("ConfigPath: %S\n", ConfigPath);
RtlInitUnicodeString (&KeyName,
@ -955,9 +915,9 @@ CmiInitHives(BOOLEAN SetupBoot)
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
Status = CmiInitializeHive(&ObjectAttributes,
ConfigPath,
SetupBoot);
Status = CmiLoadHive (&ObjectAttributes,
&FileName,
0);
if (!NT_SUCCESS(Status))
{
DPRINT1("CmiInitializeHive() failed (Status %lx)\n", Status);
@ -966,6 +926,8 @@ CmiInitHives(BOOLEAN SetupBoot)
/* Connect the DEFAULT hive */
wcscpy(EndPtr, REG_DEFAULT_USER_FILE_NAME);
RtlInitUnicodeString (&FileName,
ConfigPath);
DPRINT ("ConfigPath: %S\n", ConfigPath);
RtlInitUnicodeString (&KeyName,
@ -975,9 +937,9 @@ CmiInitHives(BOOLEAN SetupBoot)
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
Status = CmiInitializeHive(&ObjectAttributes,
ConfigPath,
SetupBoot);
Status = CmiLoadHive (&ObjectAttributes,
&FileName,
0);
if (!NT_SUCCESS(Status))
{
DPRINT1("CmiInitializeHive() failed (Status %lx)\n", Status);