mirror of
https://github.com/reactos/reactos.git
synced 2025-06-03 16:30:26 +00:00
[CMLIB]
Pay back the US National Debt. ... well not entirely, but at least remove the "hack similar in magnitude to the US's National Debt"! As a nice side effect we can now load Windows 2003 hive files. svn path=/trunk/; revision=61621
This commit is contained in:
parent
e9741e1328
commit
2a380017c9
4 changed files with 15 additions and 23 deletions
|
@ -98,6 +98,9 @@ HvpAddBin(
|
||||||
RtlSetBits(&RegistryHive->DirtyVector,
|
RtlSetBits(&RegistryHive->DirtyVector,
|
||||||
Bin->FileOffset / HV_BLOCK_SIZE,
|
Bin->FileOffset / HV_BLOCK_SIZE,
|
||||||
BlockCount);
|
BlockCount);
|
||||||
|
|
||||||
|
/* Update size in the base block */
|
||||||
|
RegistryHive->BaseBlock->Length += BinSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Bin;
|
return Bin;
|
||||||
|
|
|
@ -149,7 +149,7 @@ HvpComputeFreeListIndex(
|
||||||
ULONG Size)
|
ULONG Size)
|
||||||
{
|
{
|
||||||
ULONG Index;
|
ULONG Index;
|
||||||
static CCHAR FindFirstSet[256] = {
|
static CCHAR FindFirstSet[128] = {
|
||||||
0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
|
0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||||
|
@ -157,23 +157,16 @@ HvpComputeFreeListIndex(
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7};
|
|
||||||
|
|
||||||
|
ASSERT(Size >= (1 << 3));
|
||||||
Index = (Size >> 3) - 1;
|
Index = (Size >> 3) - 1;
|
||||||
if (Index >= 16)
|
if (Index >= 16)
|
||||||
{
|
{
|
||||||
if (Index > 255)
|
if (Index > 127)
|
||||||
Index = 23;
|
Index = 23;
|
||||||
else
|
else
|
||||||
Index = FindFirstSet[Index] + 7;
|
Index = FindFirstSet[Index] + 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Index;
|
return Index;
|
||||||
|
@ -301,7 +294,7 @@ HvpCreateHiveFreeCellList(
|
||||||
Hive->Storage[Stable].FreeDisplay[Index] = HCELL_NIL;
|
Hive->Storage[Stable].FreeDisplay[Index] = HCELL_NIL;
|
||||||
Hive->Storage[Volatile].FreeDisplay[Index] = HCELL_NIL;
|
Hive->Storage[Volatile].FreeDisplay[Index] = HCELL_NIL;
|
||||||
}
|
}
|
||||||
|
//__debugbreak();
|
||||||
BlockOffset = 0;
|
BlockOffset = 0;
|
||||||
BlockIndex = 0;
|
BlockIndex = 0;
|
||||||
while (BlockIndex < Hive->Storage[Stable].Length)
|
while (BlockIndex < Hive->Storage[Stable].Length)
|
||||||
|
|
|
@ -107,7 +107,7 @@ HvpCreateHive(
|
||||||
BaseBlock->Format = HBASE_FORMAT_MEMORY;
|
BaseBlock->Format = HBASE_FORMAT_MEMORY;
|
||||||
BaseBlock->Cluster = 1;
|
BaseBlock->Cluster = 1;
|
||||||
BaseBlock->RootCell = HCELL_NIL;
|
BaseBlock->RootCell = HCELL_NIL;
|
||||||
BaseBlock->Length = HV_BLOCK_SIZE;
|
BaseBlock->Length = 0;
|
||||||
BaseBlock->Sequence1 = 1;
|
BaseBlock->Sequence1 = 1;
|
||||||
BaseBlock->Sequence2 = 1;
|
BaseBlock->Sequence2 = 1;
|
||||||
/* FIXME: Fill in the file name */
|
/* FIXME: Fill in the file name */
|
||||||
|
@ -145,11 +145,7 @@ HvpInitializeMemoryHive(
|
||||||
PULONG BitmapBuffer;
|
PULONG BitmapBuffer;
|
||||||
SIZE_T ChunkSize;
|
SIZE_T ChunkSize;
|
||||||
|
|
||||||
//
|
|
||||||
// This hack is similar in magnitude to the US's National Debt
|
|
||||||
//
|
|
||||||
ChunkSize = ((PHBASE_BLOCK)ChunkBase)->Length;
|
ChunkSize = ((PHBASE_BLOCK)ChunkBase)->Length;
|
||||||
((PHBASE_BLOCK)ChunkBase)->Length = HV_BLOCK_SIZE;
|
|
||||||
DPRINT("ChunkSize: %lx\n", ChunkSize);
|
DPRINT("ChunkSize: %lx\n", ChunkSize);
|
||||||
|
|
||||||
if (ChunkSize < sizeof(HBASE_BLOCK) ||
|
if (ChunkSize < sizeof(HBASE_BLOCK) ||
|
||||||
|
@ -172,7 +168,7 @@ HvpInitializeMemoryHive(
|
||||||
* we go.
|
* we go.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Hive->Storage[Stable].Length = (ULONG)(ChunkSize / HV_BLOCK_SIZE) - 1;
|
Hive->Storage[Stable].Length = (ULONG)(ChunkSize / HV_BLOCK_SIZE);
|
||||||
Hive->Storage[Stable].BlockList =
|
Hive->Storage[Stable].BlockList =
|
||||||
Hive->Allocate(Hive->Storage[Stable].Length *
|
Hive->Allocate(Hive->Storage[Stable].Length *
|
||||||
sizeof(HMAP_ENTRY), FALSE, TAG_CM);
|
sizeof(HMAP_ENTRY), FALSE, TAG_CM);
|
||||||
|
@ -305,8 +301,6 @@ HvpGetHiveHeader(IN PHHIVE Hive,
|
||||||
Hive->Free(BaseBlock, 0);
|
Hive->Free(BaseBlock, 0);
|
||||||
BaseBlock = Hive->Allocate(PAGE_SIZE, TRUE, TAG_CM);
|
BaseBlock = Hive->Allocate(PAGE_SIZE, TRUE, TAG_CM);
|
||||||
if (!BaseBlock) return NoMemory;
|
if (!BaseBlock) return NoMemory;
|
||||||
|
|
||||||
//BaseBlock->Length = PAGE_SIZE; ??
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear it */
|
/* Clear it */
|
||||||
|
@ -384,8 +378,6 @@ HvLoadHive(IN PHHIVE Hive,
|
||||||
FileSize);
|
FileSize);
|
||||||
if (!Result) return STATUS_NOT_REGISTRY_FILE;
|
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 */
|
/* Free our base block... it's usless in this implementation */
|
||||||
Hive->Free(BaseBlock, 0);
|
Hive->Free(BaseBlock, 0);
|
||||||
|
|
|
@ -27,6 +27,8 @@ HvpWriteLog(
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
ASSERT(RegistryHive->ReadOnly == FALSE);
|
ASSERT(RegistryHive->ReadOnly == FALSE);
|
||||||
|
ASSERT(RegistryHive->BaseBlock->Length ==
|
||||||
|
RegistryHive->Storage[Stable].Length * HV_BLOCK_SIZE);
|
||||||
|
|
||||||
DPRINT("HvpWriteLog called\n");
|
DPRINT("HvpWriteLog called\n");
|
||||||
|
|
||||||
|
@ -150,6 +152,8 @@ HvpWriteHive(
|
||||||
BOOLEAN Success;
|
BOOLEAN Success;
|
||||||
|
|
||||||
ASSERT(RegistryHive->ReadOnly == FALSE);
|
ASSERT(RegistryHive->ReadOnly == FALSE);
|
||||||
|
ASSERT(RegistryHive->BaseBlock->Length ==
|
||||||
|
RegistryHive->Storage[Stable].Length * HV_BLOCK_SIZE);
|
||||||
|
|
||||||
DPRINT("HvpWriteHive called\n");
|
DPRINT("HvpWriteHive called\n");
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue