Author: ion
Date: Sat May 12 07:28:04 2007
New Revision: 26712
URL:
http://svn.reactos.org/svn/reactos?rev=26712&view=rev
Log:
- Get rid of CmiCopyKey since it was dead code. Make CmiScanKeyForValue and
CmiScanForSubKey simple wrappers around the newer CmpFindSubKeyByName and
CmpFindValueByName routines.
- Allow cmlib to support HINIT_FILE flag for HvInitializeHive. This means the kernel
doesn't need to create a section for the hive, then call HvInitializeHive with
HINIT_MEMORY anymore, and can simply send the file handle. I wrote a sneaky little hack in
cmlib which actually ends up doing the same idea, albeit not by using a section, making it
portable.
- Fix a serious bug in CmpFindSubKeyInLeaf affected by our lack of alphabetically-sorted
cells; the linear search I hacked was slightly broken.
- Remove the need to hold a LogFileName in the hive structure, since we generate it
dynamically now.
Modified:
trunk/reactos/lib/cmlib/hiveinit.c
trunk/reactos/ntoskrnl/cm/cm.h
trunk/reactos/ntoskrnl/cm/regfile.c
trunk/reactos/ntoskrnl/config/cmindex.c
trunk/reactos/ntoskrnl/config/cmsysini.c
Modified: trunk/reactos/lib/cmlib/hiveinit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/hiveinit.c?rev=2…
==============================================================================
--- trunk/reactos/lib/cmlib/hiveinit.c (original)
+++ trunk/reactos/lib/cmlib/hiveinit.c Sat May 12 07:28:04 2007
@@ -269,6 +269,130 @@
Hive->Flat = TRUE;
return STATUS_SUCCESS;
+}
+
+typedef enum _RESULT
+{
+ NotHive,
+ Fail,
+ NoMemory,
+ HiveSuccess,
+ RecoverHeader,
+ RecoverData,
+ SelfHeal
+} RESULT;
+
+RESULT CMAPI
+HvpGetHiveHeader(IN PHHIVE Hive,
+ IN PHBASE_BLOCK *BaseBlock,
+ IN PLARGE_INTEGER TimeStamp)
+{
+ PHBASE_BLOCK HiveHeader;
+ ULONG Alignment;
+ ULONG Result;
+ ULONGLONG Offset = 0;
+ ASSERT(sizeof(HBASE_BLOCK) >= (HV_BLOCK_SIZE * Hive->Cluster));
+
+ /* Assume failure and allocate the buffer */
+ *BaseBlock = 0;
+ HiveHeader = Hive->Allocate(sizeof(HBASE_BLOCK), TRUE);
+ if (!HiveHeader) return NoMemory;
+
+ /* Check for, and enforce, alignment */
+ Alignment = Hive->Cluster * HV_BLOCK_SIZE -1;
+ if ((ULONG_PTR)HiveHeader & Alignment)
+ {
+ /* Free the old header */
+ Hive->Free(HiveHeader);
+ HiveHeader = Hive->Allocate(PAGE_SIZE, TRUE);
+ if (!HiveHeader) return NoMemory;
+
+ //HiveHeader->Length = PAGE_SIZE; ??
+ }
+
+ /* Clear it */
+ RtlZeroMemory(HiveHeader, sizeof(HBASE_BLOCK));
+
+ /* Now read it from disk */
+ Result = Hive->FileRead(Hive,
+ HV_TYPE_PRIMARY,
+ Offset,
+ HiveHeader,
+ Hive->Cluster * HV_BLOCK_SIZE);
+
+ /* Couldn't read: assume it's not a hive */
+ if (!Result) return NotHive;
+
+ /* Do validation */
+ if (!HvpVerifyHiveHeader(HiveHeader)) return NotHive;
+
+ /* Return information */
+ *BaseBlock = HiveHeader;
+ *TimeStamp = HiveHeader->TimeStamp;
+ return HiveSuccess;
+}
+
+NTSTATUS CMAPI
+HvLoadHive(IN PHHIVE Hive,
+ IN ULONG FileSize)
+{
+ PHBASE_BLOCK BaseBlock = NULL;
+ ULONG Result;
+ LARGE_INTEGER TimeStamp;
+ ULONGLONG Offset = 0;
+ PVOID HiveData;
+
+ /* Get the hive header */
+ Result = HvpGetHiveHeader(Hive, &BaseBlock, &TimeStamp);
+ switch (Result)
+ {
+ /* Out of memory */
+ case NoMemory:
+
+ /* Fail */
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* Not a hive */
+ case NotHive:
+
+ /* Fail */
+ return STATUS_NOT_REGISTRY_FILE;
+
+ /* Has recovery data */
+ case RecoverData:
+ case RecoverHeader:
+
+ /* Fail */
+ return STATUS_REGISTRY_CORRUPT;
+ }
+
+ /* Set default boot type */
+ BaseBlock->BootType = 0;
+
+ /* Setup hive data */
+ Hive->HiveHeader = BaseBlock;
+ Hive->Version = Hive->HiveHeader->Minor;
+
+ /* Allocate a buffer large enough to hold the hive */
+ HiveData = Hive->Allocate(FileSize, TRUE);
+ if (!HiveData) return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* Now read the whole hive */
+ Result = Hive->FileRead(Hive,
+ HV_TYPE_PRIMARY,
+ Offset,
+ HiveData,
+ FileSize);
+ if (!Result) return STATUS_NOT_REGISTRY_FILE;
+
+ /* Apply "US National Debt" hack */
+ ((PHBASE_BLOCK)HiveData)->Length = FileSize;
+
+ /* Free our base block... it's usless in this implementation */
+ Hive->Free(BaseBlock);
+
+ /* Initialize the hive directly from memory */
+ return HvpInitializeMemoryHive(Hive, (ULONG_PTR)HiveData);
}
/**
@@ -334,6 +458,7 @@
Hive->FileSetSize = FileSetSize;
Hive->FileFlush = FileFlush;
Hive->StorageTypeCount = 2;
+ Hive->Cluster = 1;
switch (Operation)
{
@@ -347,6 +472,21 @@
case HV_OPERATION_MEMORY_INPLACE:
Status = HvpInitializeMemoryInplaceHive(Hive, HiveData);
+ break;
+
+ case 2:
+
+ /* Hack of doom: Cluster is actually the file size. */
+ Status = HvLoadHive(Hive, Cluster);
+ if ((Status != STATUS_SUCCESS) &&
+ (Status != STATUS_REGISTRY_RECOVERED))
+ {
+ /* Unrecoverable failure */
+ return Status;
+ }
+
+ /* Check for previous damage */
+ if (Status == STATUS_REGISTRY_RECOVERED) ASSERT(FALSE);
break;
default:
Modified: trunk/reactos/ntoskrnl/cm/cm.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/cm.h?rev=26712…
==============================================================================
--- trunk/reactos/ntoskrnl/cm/cm.h (original)
+++ trunk/reactos/ntoskrnl/cm/cm.h Sat May 12 07:28:04 2007
@@ -332,6 +332,22 @@
IN USHORT NameBufferSize,
IN BOOLEAN NamePacked);
+HCELL_INDEX
+NTAPI
+CmpFindValueByName(
+ IN PHHIVE Hive,
+ IN PCM_KEY_NODE KeyNode,
+ IN PUNICODE_STRING Name
+);
+
+HCELL_INDEX
+NTAPI
+CmpFindSubKeyByName(
+ IN PHHIVE Hive,
+ IN PCM_KEY_NODE Parent,
+ IN PUNICODE_STRING SearchName
+);
+
VOID
CmiCopyPackedName(PWCHAR NameBuffer,
PUCHAR PackedNameBuffer,
@@ -360,12 +376,6 @@
NTSTATUS
CmiCreateTempHive(PEREGISTRY_HIVE *RegistryHive);
-
-NTSTATUS
-CmiCopyKey (PEREGISTRY_HIVE DstHive,
- PCM_KEY_NODE DstKeyCell,
- PEREGISTRY_HIVE SrcHive,
- PCM_KEY_NODE SrcKeyCell);
NTSTATUS
CmiSaveTempHive (PEREGISTRY_HIVE Hive,
Modified: trunk/reactos/ntoskrnl/cm/regfile.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/regfile.c?rev=…
==============================================================================
--- trunk/reactos/ntoskrnl/cm/regfile.c (original)
+++ trunk/reactos/ntoskrnl/cm/regfile.c Sat May 12 07:28:04 2007
@@ -64,10 +64,8 @@
ULONG CreateDisposition;
IO_STATUS_BLOCK IoSB;
HANDLE FileHandle;
- PVOID SectionObject;
- PUCHAR ViewBase;
- ULONG ViewSize;
NTSTATUS Status;
+ FILE_STANDARD_INFORMATION FileInformation;
DPRINT("CmiInitNonVolatileRegistryHive(%p, %S) called\n",
RegistryHive, Filename);
@@ -80,23 +78,6 @@
DPRINT("RtlCreateUnicodeString() failed (Status %lx)\n", Status);
return(Status);
}
-
- /* Create log file name */
- RegistryHive->LogFileName.Length = (wcslen(Filename) + 4) * sizeof(WCHAR);
- RegistryHive->LogFileName.MaximumLength = RegistryHive->LogFileName.Length +
sizeof(WCHAR);
- RegistryHive->LogFileName.Buffer = ExAllocatePoolWithTag(PagedPool,
- RegistryHive->LogFileName.MaximumLength,
- TAG('U', 'S',
'T', 'R'));
- if (RegistryHive->LogFileName.Buffer == NULL)
- {
- RtlFreeUnicodeString(&RegistryHive->HiveFileName);
- DPRINT("ExAllocatePool() failed\n");
- return(STATUS_INSUFFICIENT_RESOURCES);
- }
- wcscpy(RegistryHive->LogFileName.Buffer,
- Filename);
- wcscat(RegistryHive->LogFileName.Buffer,
- L".log");
InitializeObjectAttributes(&ObjectAttributes,
&RegistryHive->HiveFileName,
@@ -119,7 +100,6 @@
if (!NT_SUCCESS(Status))
{
RtlFreeUnicodeString(&RegistryHive->HiveFileName);
- RtlFreeUnicodeString(&RegistryHive->LogFileName);
DPRINT("ZwCreateFile() failed (Status %lx)\n", Status);
return(Status);
}
@@ -132,76 +112,32 @@
DPRINT("CmiCreateNewRegFile() failed (Status %lx)\n", Status);
ZwClose(FileHandle);
RtlFreeUnicodeString(&RegistryHive->HiveFileName);
- RtlFreeUnicodeString(&RegistryHive->LogFileName);
return(Status);
}
}
- /* Create the hive section */
- Status = MmCreateSection(&SectionObject,
- SECTION_ALL_ACCESS,
- NULL,
- NULL,
- PAGE_READWRITE,
- SEC_COMMIT,
- FileHandle,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("MmCreateSection() failed (Status %lx)\n", Status);
- RtlFreeUnicodeString(&RegistryHive->HiveFileName);
- RtlFreeUnicodeString(&RegistryHive->LogFileName);
- return(Status);
- }
-
- /* Map the hive file */
- ViewBase = NULL;
- ViewSize = 0;
- Status = MmMapViewOfSection(SectionObject,
- PsGetCurrentProcess(),
- (PVOID*)&ViewBase,
- 0,
- ViewSize,
- NULL,
- &ViewSize,
- 0,
- MEM_COMMIT,
- PAGE_READWRITE);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("MmMapViewOfSection() failed (Status %lx)\n", Status);
- ObDereferenceObject(SectionObject);
- RtlFreeUnicodeString(&RegistryHive->HiveFileName);
- RtlFreeUnicodeString(&RegistryHive->LogFileName);
- ZwClose(FileHandle);
- return(Status);
- }
- DPRINT("ViewBase %p ViewSize %lx\n", ViewBase, ViewSize);
-
- ((PHBASE_BLOCK)ViewBase)->Length = ViewSize;
- Status = HvInitialize(&RegistryHive->Hive, HV_OPERATION_MEMORY, 0, 0,
- (ULONG_PTR)ViewBase, 0,
+ RegistryHive->HiveHandle = FileHandle;
+
+ /* Check how large the file is */
+ ZwQueryInformationFile(FileHandle,
+ &IoSB,
+ &FileInformation,
+ sizeof(FileInformation),
+ FileStandardInformation);
+ Status = HvInitialize(&RegistryHive->Hive, HINIT_FILE, 0, 0,
+ 0, FileInformation.EndOfFile.LowPart,
CmpAllocate, CmpFree,
CmpFileRead, CmpFileWrite, CmpFileSetSize,
CmpFileFlush, NULL);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to open hive\n");
- MmUnmapViewOfSection(PsGetCurrentProcess(),
- ViewBase);
- ObDereferenceObject(SectionObject);
RtlFreeUnicodeString(&RegistryHive->HiveFileName);
- RtlFreeUnicodeString(&RegistryHive->LogFileName);
ZwClose(FileHandle);
return Status;
}
CmPrepareHive(&RegistryHive->Hive);
-
- /* Unmap and dereference the hive section */
- MmUnmapViewOfSection(PsGetCurrentProcess(),
- ViewBase);
- ObDereferenceObject(SectionObject);
/* Close the hive file */
ZwClose(FileHandle);
@@ -275,7 +211,6 @@
/* Release file names */
RtlFreeUnicodeString (&RegistryHive->HiveFileName);
- RtlFreeUnicodeString (&RegistryHive->LogFileName);
/* Release hive */
HvFree (&RegistryHive->Hive);
@@ -511,81 +446,52 @@
return MaxValueData;
}
+NTSTATUS
+CmiScanKeyForValue(IN PEREGISTRY_HIVE RegistryHive,
+ IN PCM_KEY_NODE KeyCell,
+ IN PUNICODE_STRING ValueName,
+ OUT PCM_KEY_VALUE *ValueCell,
+ OUT HCELL_INDEX *ValueCellOffset)
+{
+ HCELL_INDEX CellIndex;
+
+ /* Assume failure */
+ *ValueCell = NULL;
+ if (ValueCellOffset) *ValueCellOffset = HCELL_NIL;
+
+ /* Call newer Cm API */
+ CellIndex = CmpFindValueByName(&RegistryHive->Hive, KeyCell, ValueName);
+ if (CellIndex == HCELL_NIL) return STATUS_OBJECT_NAME_NOT_FOUND;
+
+ /* Otherwise, get the cell data back too */
+ if (ValueCellOffset) *ValueCellOffset = CellIndex;
+ *ValueCell = HvGetCell(&RegistryHive->Hive, CellIndex);
+ return STATUS_SUCCESS;
+}
NTSTATUS
CmiScanForSubKey(IN PEREGISTRY_HIVE RegistryHive,
- IN PCM_KEY_NODE KeyCell,
- OUT PCM_KEY_NODE *SubKeyCell,
- OUT HCELL_INDEX *BlockOffset,
- IN PUNICODE_STRING KeyName,
- IN ACCESS_MASK DesiredAccess,
- IN ULONG Attributes)
-{
- PHASH_TABLE_CELL HashBlock;
- PCM_KEY_NODE CurSubKeyCell;
- ULONG Storage;
- ULONG i;
-
- VERIFY_KEY_CELL(KeyCell);
-
- DPRINT("Scanning for sub key %wZ\n", KeyName);
-
- ASSERT(RegistryHive);
-
- *SubKeyCell = NULL;
-
- for (Storage = HvStable; Storage < HvMaxStorageType; Storage++)
- {
- /* The key does not have any subkeys */
- if (KeyCell->SubKeyLists[Storage] == HCELL_NULL)
- {
- continue;
- }
-
- /* Get hash table */
- HashBlock = HvGetCell (&RegistryHive->Hive,
KeyCell->SubKeyLists[Storage]);
- ASSERT(HashBlock->Id == REG_HASH_TABLE_CELL_ID);
-
- for (i = 0; i < KeyCell->SubKeyCounts[Storage]; i++)
- {
- if (Attributes & OBJ_CASE_INSENSITIVE)
- {
- if ((HashBlock->Table[i].HashValue == 0 ||
- CmiCompareHashI(KeyName,
(PCHAR)&HashBlock->Table[i].HashValue)))
- {
- CurSubKeyCell = HvGetCell (&RegistryHive->Hive,
- HashBlock->Table[i].KeyOffset);
-
- if (CmiCompareKeyNamesI(KeyName, CurSubKeyCell))
- {
- *SubKeyCell = CurSubKeyCell;
- *BlockOffset = HashBlock->Table[i].KeyOffset;
- return STATUS_SUCCESS;
- }
- }
- }
- else
- {
- if ((HashBlock->Table[i].HashValue == 0 ||
- CmiCompareHash(KeyName,
(PCHAR)&HashBlock->Table[i].HashValue)))
- {
- CurSubKeyCell = HvGetCell (&RegistryHive->Hive,
- HashBlock->Table[i].KeyOffset);
-
- if (CmiCompareKeyNames(KeyName, CurSubKeyCell))
- {
- *SubKeyCell = CurSubKeyCell;
- *BlockOffset = HashBlock->Table[i].KeyOffset;
- return STATUS_SUCCESS;
- }
- }
- }
- }
- }
-
- return STATUS_OBJECT_NAME_NOT_FOUND;
-}
-
+ IN PCM_KEY_NODE KeyCell,
+ OUT PCM_KEY_NODE *SubKeyCell,
+ OUT HCELL_INDEX *BlockOffset,
+ IN PUNICODE_STRING KeyName,
+ IN ACCESS_MASK DesiredAccess,
+ IN ULONG Attributes)
+{
+ HCELL_INDEX CellIndex;
+
+ /* Assume failure */
+ *SubKeyCell = NULL;
+
+ /* Call newer Cm API */
+ CellIndex = CmpFindSubKeyByName(&RegistryHive->Hive, KeyCell, KeyName);
+ if (CellIndex == HCELL_NIL) return STATUS_OBJECT_NAME_NOT_FOUND;
+
+ /* Otherwise, get the cell data back too */
+ *BlockOffset = CellIndex;
+ *SubKeyCell = HvGetCell(&RegistryHive->Hive, CellIndex);
+ return STATUS_SUCCESS;
+}
NTSTATUS
CmiAddSubKey(PEREGISTRY_HIVE RegistryHive,
@@ -884,54 +790,6 @@
return STATUS_SUCCESS;
}
-
-NTSTATUS
-CmiScanKeyForValue(IN PEREGISTRY_HIVE RegistryHive,
- IN PCM_KEY_NODE KeyCell,
- IN PUNICODE_STRING ValueName,
- OUT PCM_KEY_VALUE *ValueCell,
- OUT HCELL_INDEX *ValueCellOffset)
-{
- PVALUE_LIST_CELL ValueListCell;
- PCM_KEY_VALUE CurValueCell;
- ULONG i;
-
- *ValueCell = NULL;
- if (ValueCellOffset != NULL)
- *ValueCellOffset = (HCELL_INDEX)-1;
-
- /* The key does not have any values */
- if (KeyCell->ValueList.List == (HCELL_INDEX)-1)
- {
- return STATUS_OBJECT_NAME_NOT_FOUND;
- }
-
- ValueListCell = HvGetCell (&RegistryHive->Hive, KeyCell->ValueList.List);
-
- VERIFY_VALUE_LIST_CELL(ValueListCell);
-
- for (i = 0; i < KeyCell->ValueList.Count; i++)
- {
- CurValueCell = HvGetCell (&RegistryHive->Hive,
- ValueListCell->ValueOffset[i]);
-
- if (CmiComparePackedNames(ValueName,
- CurValueCell->Name,
- CurValueCell->NameSize,
- (BOOLEAN)((CurValueCell->Flags & REG_VALUE_NAME_PACKED) ? TRUE : FALSE)))
- {
- *ValueCell = CurValueCell;
- if (ValueCellOffset != NULL)
- *ValueCellOffset = ValueListCell->ValueOffset[i];
- //DPRINT("Found value %s\n", ValueName);
- return STATUS_SUCCESS;
- }
- }
-
- return STATUS_OBJECT_NAME_NOT_FOUND;
-}
-
-
NTSTATUS
CmiGetValueFromKeyByIndex(IN PEREGISTRY_HIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
@@ -1481,241 +1339,6 @@
NTSTATUS
-CmiCopyKey (PEREGISTRY_HIVE DstHive,
- PCM_KEY_NODE DstKeyCell,
- PEREGISTRY_HIVE SrcHive,
- PCM_KEY_NODE SrcKeyCell)
-{
- PCM_KEY_NODE NewKeyCell;
- ULONG NewKeyCellSize;
- HCELL_INDEX NewKeyCellOffset;
- PHASH_TABLE_CELL NewHashTableCell;
- ULONG NewHashTableSize;
- HCELL_INDEX NewHashTableOffset;
- ULONG i;
- NTSTATUS Status = STATUS_SUCCESS;
-
- DPRINT ("CmiCopyKey() called\n");
-
- if (DstKeyCell == NULL)
- {
- /* Allocate and copy key cell */
- NewKeyCellSize = sizeof(CM_KEY_NODE) + SrcKeyCell->NameSize;
- NewKeyCellOffset = HvAllocateCell (&DstHive->Hive, NewKeyCellSize,
HvStable);
- if (NewKeyCellOffset == HCELL_NULL)
- {
- DPRINT1 ("Failed to allocate a key cell\n");
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- NewKeyCell = HvGetCell (&DstHive->Hive, NewKeyCellOffset);
- RtlCopyMemory (NewKeyCell,
- SrcKeyCell,
- NewKeyCellSize);
-
- DstHive->Hive.HiveHeader->RootCell = NewKeyCellOffset;
-
- /* Copy class name */
- if (SrcKeyCell->ClassNameOffset != (HCELL_INDEX) -1)
- {
- PVOID SrcClassNameCell;
- PVOID NewClassNameCell;
- HCELL_INDEX NewClassNameOffset;
-
- SrcClassNameCell = HvGetCell (&SrcHive->Hive, SrcKeyCell->ClassNameOffset);
-
- NewKeyCell->ClassSize = SrcKeyCell->ClassSize;
- NewClassNameOffset = HvAllocateCell (&DstHive->Hive, NewKeyCell->ClassSize,
HvStable);
- if (NewClassNameOffset == HCELL_NULL)
- {
- DPRINT1 ("CmiAllocateBlock() failed\n");
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- NewClassNameCell = HvGetCell (&DstHive->Hive, NewClassNameOffset);
- RtlCopyMemory (NewClassNameCell,
- SrcClassNameCell,
- NewKeyCell->ClassSize);
- NewKeyCell->ClassNameOffset = NewClassNameOffset;
- }
- }
- else
- {
- NewKeyCell = DstKeyCell;
- }
-
- /* Allocate hash table */
- if (SrcKeyCell->SubKeyCounts[HvStable] > 0)
- {
- NewHashTableSize = ROUND_UP(SrcKeyCell->SubKeyCounts[HvStable] + 1, 4) - 1;
- Status = CmiAllocateHashTableCell (DstHive,
- &NewHashTableCell,
- &NewHashTableOffset,
- NewHashTableSize,
- HvStable);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1 ("CmiAllocateHashTableBlock() failed (Status %lx)\n", Status);
- return Status;
- }
- NewKeyCell->SubKeyLists[HvStable] = NewHashTableOffset;
- }
- else
- {
- NewHashTableCell = NULL;
- }
-
- /* Allocate and copy value list and values */
- if (SrcKeyCell->ValueList.Count != 0)
- {
- PVALUE_LIST_CELL NewValueListCell;
- PVALUE_LIST_CELL SrcValueListCell;
- PCM_KEY_VALUE NewValueCell;
- PCM_KEY_VALUE SrcValueCell;
- PVOID SrcValueDataCell;
- PVOID NewValueDataCell;
- HCELL_INDEX ValueCellOffset;
- HCELL_INDEX ValueDataCellOffset;
- ULONG NewValueListCellSize;
- ULONG NewValueCellSize;
-
-
- NewValueListCellSize =
- ROUND_UP(SrcKeyCell->ValueList.Count, 4) * sizeof(HCELL_INDEX);
- NewKeyCell->ValueList.List = HvAllocateCell (&DstHive->Hive,
- NewValueListCellSize,
- HvStable);
- if (NewKeyCell->ValueList.List == HCELL_NULL)
- {
- DPRINT1 ("HvAllocateCell() failed\n");
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- DPRINT1("KeyCell->ValueList.List: %x\n",
NewKeyCell->ValueList.List);
-
- NewValueListCell = HvGetCell (&DstHive->Hive,
NewKeyCell->ValueList.List);
- RtlZeroMemory (NewValueListCell,
- NewValueListCellSize);
-
- /* Copy values */
- SrcValueListCell = HvGetCell (&SrcHive->Hive,
SrcKeyCell->ValueList.List);
- for (i = 0; i < SrcKeyCell->ValueList.Count; i++)
- {
- /* Copy value cell */
- SrcValueCell = HvGetCell (&SrcHive->Hive,
SrcValueListCell->ValueOffset[i]);
-
- NewValueCellSize = sizeof(CM_KEY_VALUE) + SrcValueCell->NameSize;
- ValueCellOffset = HvAllocateCell (&DstHive->Hive, NewValueCellSize, HvStable);
- if (ValueCellOffset == HCELL_NULL)
- {
- DPRINT1 ("HvAllocateCell() failed (Status %lx)\n", Status);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- NewValueCell = HvGetCell (&DstHive->Hive, ValueCellOffset);
- NewValueListCell->ValueOffset[i] = ValueCellOffset;
- RtlCopyMemory (NewValueCell,
- SrcValueCell,
- NewValueCellSize);
-
- /* Copy value data cell */
- if (SrcValueCell->DataSize > (LONG) sizeof(PVOID))
- {
- SrcValueDataCell = HvGetCell (&SrcHive->Hive,
SrcValueCell->DataOffset);
-
- ValueDataCellOffset = HvAllocateCell (&DstHive->Hive,
SrcValueCell->DataSize, HvStable);
- if (ValueDataCellOffset == HCELL_NULL)
- {
- DPRINT1 ("HvAllocateCell() failed\n");
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- NewValueDataCell = HvGetCell (&DstHive->Hive, ValueDataCellOffset);
- RtlCopyMemory (NewValueDataCell,
- SrcValueDataCell,
- SrcValueCell->DataSize);
- NewValueCell->DataOffset = ValueDataCellOffset;
- }
- }
- }
-
- /* Copy subkeys */
- if (SrcKeyCell->SubKeyCounts[HvStable] > 0)
- {
- PHASH_TABLE_CELL SrcHashTableCell;
- PCM_KEY_NODE SrcSubKeyCell;
- PCM_KEY_NODE NewSubKeyCell;
- ULONG NewSubKeyCellSize;
- HCELL_INDEX NewSubKeyCellOffset;
- PHASH_RECORD SrcHashRecord;
-
- SrcHashTableCell = HvGetCell (&SrcHive->Hive,
SrcKeyCell->SubKeyLists[HvStable]);
-
- for (i = 0; i < SrcKeyCell->SubKeyCounts[HvStable]; i++)
- {
- SrcHashRecord = &SrcHashTableCell->Table[i];
- SrcSubKeyCell = HvGetCell (&SrcHive->Hive, SrcHashRecord->KeyOffset);
-
- /* Allocate and copy key cell */
- NewSubKeyCellSize = sizeof(CM_KEY_NODE) + SrcSubKeyCell->NameSize;
- NewSubKeyCellOffset = HvAllocateCell (&DstHive->Hive, NewSubKeyCellSize,
HvStable);
- if (NewSubKeyCellOffset == HCELL_NULL)
- {
- DPRINT1 ("Failed to allocate a sub key cell\n");
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- NewSubKeyCell = HvGetCell (&DstHive->Hive, NewSubKeyCellOffset);
- NewHashTableCell->Table[i].KeyOffset = NewSubKeyCellOffset;
- NewHashTableCell->Table[i].HashValue = SrcHashRecord->HashValue;
-
- RtlCopyMemory (NewSubKeyCell,
- SrcSubKeyCell,
- NewSubKeyCellSize);
-
- /* Copy class name */
- if (SrcSubKeyCell->ClassNameOffset != (HCELL_INDEX) -1)
- {
- PVOID SrcClassNameCell;
- PVOID NewClassNameCell;
- HCELL_INDEX NewClassNameOffset;
-
- SrcClassNameCell = HvGetCell (&SrcHive->Hive,
- SrcSubKeyCell->ClassNameOffset);
-
- NewSubKeyCell->ClassSize = SrcSubKeyCell->ClassSize;
- NewClassNameOffset = HvAllocateCell (&DstHive->Hive,
- NewSubKeyCell->ClassSize,
- HvStable);
- if (NewClassNameOffset == HCELL_NULL)
- {
- DPRINT1 ("HvAllocateCell() failed (Status %lx)\n", Status);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- NewClassNameCell = HvGetCell (&DstHive->Hive, NewClassNameOffset);
- NewSubKeyCell->ClassNameOffset = NewClassNameOffset;
- RtlCopyMemory (NewClassNameCell,
- SrcClassNameCell,
- NewSubKeyCell->ClassSize);
- }
-
- /* Copy subkey data and subkeys */
- Status = CmiCopyKey (DstHive,
- NewSubKeyCell,
- SrcHive,
- SrcSubKeyCell);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1 ("CmiAllocateBlock() failed (Status %lx)\n", Status);
- return Status;
- }
- }
- }
-
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
CmiSaveTempHive (PEREGISTRY_HIVE Hive,
HANDLE FileHandle)
{
Modified: trunk/reactos/ntoskrnl/config/cmindex.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmindex.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmindex.c (original)
+++ trunk/reactos/ntoskrnl/config/cmindex.c Sat May 12 07:28:04 2007
@@ -391,6 +391,7 @@
/* Check if we got lucky and found it */
if (!Result) return i;
+#ifdef SOMEONE_WAS_NICE_ENOUGH_TO_MAKE_OUR_CELLS_LEXICALLY_SORTED
/* Check if the result is below us */
if (Result < 0)
{
@@ -405,7 +406,6 @@
Low = i;
}
-#ifdef SOMEONE_WAS_NICE_ENOUGH_TO_MAKE_OUR_CELLS_LEXICALLY_SORTED
/* Check if this is the last entry, if so, break out and handle it */
if ((High - Low) <= 1) break;
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 Sat May 12 07:28:04 2007
@@ -364,9 +364,6 @@
/* Set the hive filename */
RtlCreateUnicodeString(&SystemHive->HiveFileName, SYSTEM_REG_FILE);
- /* Set the log filename */
- RtlCreateUnicodeString(&SystemHive->LogFileName, SYSTEM_LOG_FILE);
-
/* We imported, no need to create a new hive */
Allocate = FALSE;