From a7d3c209b11019df43c0542fd67aaaba2158e7f7 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 11 Oct 2003 16:55:49 +0000 Subject: [PATCH] Fixed cell buggy cell size calculation. svn path=/trunk/; revision=6276 --- reactos/ntoskrnl/cm/cm.h | 2 +- reactos/ntoskrnl/cm/ntfunc.c | 8 ++++---- reactos/ntoskrnl/cm/regfile.c | 17 ++++++++--------- reactos/tools/mkhive/binhive.c | 28 ++++++++++++++-------------- 4 files changed, 27 insertions(+), 28 deletions(-) diff --git a/reactos/ntoskrnl/cm/cm.h b/reactos/ntoskrnl/cm/cm.h index 9bad7dee886..149f00c83cf 100644 --- a/reactos/ntoskrnl/cm/cm.h +++ b/reactos/ntoskrnl/cm/cm.h @@ -50,7 +50,7 @@ // BLOCK_OFFSET = offset in file after header block -typedef ULONG BLOCK_OFFSET; +typedef ULONG BLOCK_OFFSET, *PBLOCK_OFFSET; /* header for registry hive file : */ typedef struct _HIVE_HEADER diff --git a/reactos/ntoskrnl/cm/ntfunc.c b/reactos/ntoskrnl/cm/ntfunc.c index 813174811e1..65ebce8cb10 100644 --- a/reactos/ntoskrnl/cm/ntfunc.c +++ b/reactos/ntoskrnl/cm/ntfunc.c @@ -684,7 +684,7 @@ NtEnumerateValueKey(IN HANDLE KeyHandle, (ULONG)ValueFullInformation->Name - (ULONG)ValueFullInformation + ValueFullInformation->NameLength; ValueFullInformation->DataOffset = - (ValueFullInformation->DataOffset + 3) & 0xfffffffc; + ROUND_UP(ValueFullInformation->DataOffset, sizeof(PVOID)); ValueFullInformation->DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK; if (!(ValueCell->DataSize & REG_DATA_IN_OFFSET)) { @@ -1161,7 +1161,7 @@ NtQueryValueKey(IN HANDLE KeyHandle, (ULONG)ValueFullInformation->Name - (ULONG)ValueFullInformation + ValueFullInformation->NameLength; ValueFullInformation->DataOffset = - (ValueFullInformation->DataOffset + 3) & 0xfffffffc; + ROUND_UP(ValueFullInformation->DataOffset, sizeof(PVOID)); ValueFullInformation->DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK; if (!(ValueCell->DataSize & REG_DATA_IN_OFFSET)) { @@ -1632,11 +1632,11 @@ NtQueryMultipleValueKey (IN HANDLE KeyHandle, break; } - BufferLength = (BufferLength + 3) & 0xfffffffc; + BufferLength = ROUND_UP(BufferLength, sizeof(PVOID)); if (BufferLength + (ValueCell->DataSize & REG_DATA_SIZE_MASK) <= *Length) { - DataPtr = (PUCHAR)(((ULONG)DataPtr + 3) & 0xfffffffc); + DataPtr = (PUCHAR)ROUND_UP((ULONG)DataPtr, sizeof(PVOID)); ValueList[i].Type = ValueCell->DataType; ValueList[i].DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK; diff --git a/reactos/ntoskrnl/cm/regfile.c b/reactos/ntoskrnl/cm/regfile.c index 356a82ebc42..3475bb90814 100644 --- a/reactos/ntoskrnl/cm/regfile.c +++ b/reactos/ntoskrnl/cm/regfile.c @@ -25,7 +25,6 @@ /* LOCAL MACROS *************************************************************/ -#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) #define ROUND_DOWN(N, S) ((N) - ((N) % (S))) #define ABS_VALUE(V) (((V) < 0) ? -(V) : (V)) @@ -2938,7 +2937,7 @@ NTSTATUS CmiAllocateHashTableCell (IN PREGISTRY_HIVE RegistryHive, OUT PHASH_TABLE_CELL *HashBlock, OUT BLOCK_OFFSET *HBOffset, - IN ULONG HashTableSize) + IN ULONG SubKeyCount) { PHASH_TABLE_CELL NewHashBlock; ULONG NewHashSize; @@ -2947,7 +2946,7 @@ CmiAllocateHashTableCell (IN PREGISTRY_HIVE RegistryHive, Status = STATUS_SUCCESS; *HashBlock = NULL; NewHashSize = sizeof(HASH_TABLE_CELL) + - (HashTableSize - 1) * sizeof(HASH_RECORD); + (SubKeyCount * sizeof(HASH_RECORD)); Status = CmiAllocateCell (RegistryHive, NewHashSize, (PVOID*) &NewHashBlock, @@ -2960,7 +2959,7 @@ CmiAllocateHashTableCell (IN PREGISTRY_HIVE RegistryHive, else { NewHashBlock->Id = REG_HASH_TABLE_CELL_ID; - NewHashBlock->HashTableSize = HashTableSize; + NewHashBlock->HashTableSize = SubKeyCount; *HashBlock = NewHashBlock; } @@ -3090,7 +3089,7 @@ CmiAllocateValueCell(PREGISTRY_HIVE RegistryHive, } NewValueCell->DataType = 0; NewValueCell->DataSize = 0; - NewValueCell->DataOffset = 0xffffffff; + NewValueCell->DataOffset = (BLOCK_OFFSET)-1; *ValueCell = NewValueCell; } @@ -3247,7 +3246,7 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, Status = STATUS_SUCCESS; /* Round to 16 bytes multiple */ - CellSize = (CellSize + sizeof(DWORD) + 15) & 0xfffffff0; + CellSize = ROUND_UP(CellSize, 16); /* Handle volatile hives first */ if (IsPointerHive(RegistryHive)) @@ -3936,7 +3935,7 @@ CmiCopyKey (PREGISTRY_HIVE DstHive, NewKeyCell->ClassSize = SrcKeyCell->ClassSize; Status = CmiAllocateCell (DstHive, - NewKeyCell->ClassSize, + sizeof(CELL_HEADER) + NewKeyCell->ClassSize, (PVOID)&NewClassNameCell, &NewClassNameOffset); if (!NT_SUCCESS(Status)) @@ -4031,7 +4030,7 @@ CmiCopyKey (PREGISTRY_HIVE DstHive, SrcValueDataCell = CmiGetCell (SrcHive, SrcValueCell->DataOffset, NULL); Status = CmiAllocateCell (DstHive, - SrcValueCell->DataSize, + sizeof(CELL_HEADER) + SrcValueCell->DataSize, (PVOID*) &NewValueDataCell, &ValueDataCellOffset); if (!NT_SUCCESS(Status)) @@ -4103,7 +4102,7 @@ CmiCopyKey (PREGISTRY_HIVE DstHive, NewSubKeyCell->ClassSize = SrcSubKeyCell->ClassSize; Status = CmiAllocateCell (DstHive, - NewSubKeyCell->ClassSize, + sizeof(CELL_HEADER) + NewSubKeyCell->ClassSize, (PVOID)&NewClassNameCell, &NewClassNameOffset); if (!NT_SUCCESS(Status)) diff --git a/reactos/tools/mkhive/binhive.c b/reactos/tools/mkhive/binhive.c index fa91cf86df0..2edad1516f7 100644 --- a/reactos/tools/mkhive/binhive.c +++ b/reactos/tools/mkhive/binhive.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: binhive.c,v 1.6 2003/10/10 21:53:47 ekohl Exp $ +/* $Id: binhive.c,v 1.7 2003/10/11 16:54:51 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS hive maker * FILE: tools/mkhive/binhive.c @@ -48,7 +48,7 @@ #define REG_EXTEND_HASH_TABLE_SIZE 4 #define REG_VALUE_LIST_CELL_MULTIPLE 4 -#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) +#define ROUND_UP(N, S) ((N) + (S) - ((N) % (S))) #define ROUND_DOWN(N, S) ((N) - ((N) % (S))) #define ABS_VALUE(V) (((V) < 0) ? -(V) : (V)) @@ -733,8 +733,8 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive, static BOOL CmiAllocateCell (PREGISTRY_HIVE RegistryHive, - PVOID *Block, LONG BlockSize, + PVOID *Block, PBLOCK_OFFSET pBlockOffset) { PCELL_HEADER NewBlock; @@ -744,7 +744,7 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, *Block = NULL; /* Round to 16 bytes multiple */ - BlockSize = (BlockSize + sizeof(ULONG) + 15) & 0xfffffff0; + BlockSize = ROUND_UP(BlockSize, 16); /* first search in free blocks */ NewBlock = NULL; @@ -813,12 +813,11 @@ CmiAllocateHashTableCell (PREGISTRY_HIVE Hive, ULONG NewHashSize; BOOL Status; - NewHashSize = ROUND_UP(sizeof(HASH_TABLE_CELL) + - (SubKeyCount - 1) * sizeof(HASH_RECORD), - 0x10); + NewHashSize = sizeof(HASH_TABLE_CELL) + + (SubKeyCount * sizeof(HASH_RECORD)); Status = CmiAllocateCell (Hive, - (PVOID*) &HashCell, NewHashSize, + (PVOID*) &HashCell, HBOffset); if ((HashCell == NULL) || (Status == FALSE)) { @@ -886,11 +885,11 @@ CmiAllocateValueListCell (PREGISTRY_HIVE Hive, ULONG ValueListSize; BOOL Status; - ValueListSize = ROUND_UP (ValueCount * sizeof(BLOCK_OFFSET), - 0x10); + ValueListSize = sizeof(VALUE_LIST_CELL) + + (ValueCount * sizeof(BLOCK_OFFSET)); Status = CmiAllocateCell (Hive, - (PVOID)&ValueListCell, ValueListSize, + (PVOID)&ValueListCell, ValueListOffset); if ((ValueListCell == NULL) || (Status == FALSE)) { @@ -914,8 +913,8 @@ CmiAllocateValueCell(PREGISTRY_HIVE Hive, NameSize = (ValueName == NULL) ? 0 : strlen (ValueName); Status = CmiAllocateCell (Hive, - (PVOID*)&NewValueCell, sizeof(VALUE_CELL) + NameSize, + (PVOID*)&NewValueCell, ValueCellOffset); if ((NewValueCell == NULL) || (Status == FALSE)) { @@ -1054,9 +1053,10 @@ CmiExportValue (PREGISTRY_HIVE Hive, } else { + /* Allocate data cell */ if (!CmiAllocateCell (Hive, + sizeof(CELL_HEADER) + DstDataSize, (PVOID *)&DataCell, - DstDataSize, &DataCellOffset)) { return FALSE; @@ -1116,7 +1116,7 @@ CmiExportSubKey (PREGISTRY_HIVE Hive, /* Allocate key cell */ KeyCellSize = sizeof(KEY_CELL) + Key->NameSize - 1; - if (!CmiAllocateCell (Hive, (PVOID)&NewKeyCell, KeyCellSize, &NKBOffset)) + if (!CmiAllocateCell (Hive, KeyCellSize, (PVOID)&NewKeyCell, &NKBOffset)) { DPRINT1 ("CmiAllocateBlock() failed\n"); return FALSE;