Fixed the growing of the dirty bitmap. This will fix the registry update bugs, if the binary hive is larger than 128kB. Modified: trunk/reactos/ntoskrnl/cm/regfile.c _____
Modified: trunk/reactos/ntoskrnl/cm/regfile.c --- trunk/reactos/ntoskrnl/cm/regfile.c 2005-11-12 21:11:09 UTC (rev 19186) +++ trunk/reactos/ntoskrnl/cm/regfile.c 2005-11-12 23:45:32 UTC (rev 19187) @@ -862,7 +862,7 @@
Filename); if (!NT_SUCCESS(Status)) { - DPRINT("RtlpCreateUnicodeString() failed (Status %lx)\n", Status); + DPRINT("RtlCreateUnicodeString() failed (Status %lx)\n", Status); return(Status); }
@@ -3235,6 +3235,7 @@ PHBIN tmpBin; ULONG BinSize; ULONG i; + ULONG BitmapSize;
DPRINT ("CmiAddBin (BlockCount %lu)\n", BlockCount);
@@ -3287,17 +3288,17 @@ tmpBlock = (PCELL_HEADER)((ULONG_PTR) tmpBin + REG_HBIN_DATA_OFFSET); tmpBlock->CellSize = (BinSize - REG_HBIN_DATA_OFFSET);
+ /* Calculate bitmap size in bytes (always a multiple of 32 bits) */ + BitmapSize = ROUND_UP(RegistryHive->BlockListSize, sizeof(ULONG) * 8) / 8; + /* Grow bitmap if necessary */ - if (IsNoFileHive(RegistryHive) && - (RegistryHive->BlockListSize % (sizeof(ULONG) * 8) == 0)) + if (!IsNoFileHive(RegistryHive) && + BitmapSize > RegistryHive->DirtyBitMap.SizeOfBitMap) { PULONG BitmapBuffer; - ULONG BitmapSize;
DPRINT("Grow hive bitmap\n");
- /* Calculate bitmap size in bytes (always a multiple of 32 bits) */ - BitmapSize = ROUND_UP(RegistryHive->BlockListSize, sizeof(ULONG) * 8) / 8; DPRINT("RegistryHive->BlockListSize: %lu\n", RegistryHive->BlockListSize); DPRINT("BitmapSize: %lu Bytes %lu Bits\n", BitmapSize, BitmapSize * 8); BitmapBuffer = (PULONG)ExAllocatePool(PagedPool,