Fixed cell buggy cell size calculation.

svn path=/trunk/; revision=6276
This commit is contained in:
Eric Kohl 2003-10-11 16:55:49 +00:00
parent 573b369b03
commit a7d3c209b1
4 changed files with 27 additions and 28 deletions

View file

@ -50,7 +50,7 @@
// BLOCK_OFFSET = offset in file after header block // BLOCK_OFFSET = offset in file after header block
typedef ULONG BLOCK_OFFSET; typedef ULONG BLOCK_OFFSET, *PBLOCK_OFFSET;
/* header for registry hive file : */ /* header for registry hive file : */
typedef struct _HIVE_HEADER typedef struct _HIVE_HEADER

View file

@ -684,7 +684,7 @@ NtEnumerateValueKey(IN HANDLE KeyHandle,
(ULONG)ValueFullInformation->Name - (ULONG)ValueFullInformation + (ULONG)ValueFullInformation->Name - (ULONG)ValueFullInformation +
ValueFullInformation->NameLength; ValueFullInformation->NameLength;
ValueFullInformation->DataOffset = ValueFullInformation->DataOffset =
(ValueFullInformation->DataOffset + 3) & 0xfffffffc; ROUND_UP(ValueFullInformation->DataOffset, sizeof(PVOID));
ValueFullInformation->DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK; ValueFullInformation->DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK;
if (!(ValueCell->DataSize & REG_DATA_IN_OFFSET)) if (!(ValueCell->DataSize & REG_DATA_IN_OFFSET))
{ {
@ -1161,7 +1161,7 @@ NtQueryValueKey(IN HANDLE KeyHandle,
(ULONG)ValueFullInformation->Name - (ULONG)ValueFullInformation + (ULONG)ValueFullInformation->Name - (ULONG)ValueFullInformation +
ValueFullInformation->NameLength; ValueFullInformation->NameLength;
ValueFullInformation->DataOffset = ValueFullInformation->DataOffset =
(ValueFullInformation->DataOffset + 3) & 0xfffffffc; ROUND_UP(ValueFullInformation->DataOffset, sizeof(PVOID));
ValueFullInformation->DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK; ValueFullInformation->DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK;
if (!(ValueCell->DataSize & REG_DATA_IN_OFFSET)) if (!(ValueCell->DataSize & REG_DATA_IN_OFFSET))
{ {
@ -1632,11 +1632,11 @@ NtQueryMultipleValueKey (IN HANDLE KeyHandle,
break; break;
} }
BufferLength = (BufferLength + 3) & 0xfffffffc; BufferLength = ROUND_UP(BufferLength, sizeof(PVOID));
if (BufferLength + (ValueCell->DataSize & REG_DATA_SIZE_MASK) <= *Length) 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].Type = ValueCell->DataType;
ValueList[i].DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK; ValueList[i].DataLength = ValueCell->DataSize & REG_DATA_SIZE_MASK;

View file

@ -25,7 +25,6 @@
/* LOCAL MACROS *************************************************************/ /* LOCAL MACROS *************************************************************/
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
#define ROUND_DOWN(N, S) ((N) - ((N) % (S))) #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
#define ABS_VALUE(V) (((V) < 0) ? -(V) : (V)) #define ABS_VALUE(V) (((V) < 0) ? -(V) : (V))
@ -2938,7 +2937,7 @@ NTSTATUS
CmiAllocateHashTableCell (IN PREGISTRY_HIVE RegistryHive, CmiAllocateHashTableCell (IN PREGISTRY_HIVE RegistryHive,
OUT PHASH_TABLE_CELL *HashBlock, OUT PHASH_TABLE_CELL *HashBlock,
OUT BLOCK_OFFSET *HBOffset, OUT BLOCK_OFFSET *HBOffset,
IN ULONG HashTableSize) IN ULONG SubKeyCount)
{ {
PHASH_TABLE_CELL NewHashBlock; PHASH_TABLE_CELL NewHashBlock;
ULONG NewHashSize; ULONG NewHashSize;
@ -2947,7 +2946,7 @@ CmiAllocateHashTableCell (IN PREGISTRY_HIVE RegistryHive,
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
*HashBlock = NULL; *HashBlock = NULL;
NewHashSize = sizeof(HASH_TABLE_CELL) + NewHashSize = sizeof(HASH_TABLE_CELL) +
(HashTableSize - 1) * sizeof(HASH_RECORD); (SubKeyCount * sizeof(HASH_RECORD));
Status = CmiAllocateCell (RegistryHive, Status = CmiAllocateCell (RegistryHive,
NewHashSize, NewHashSize,
(PVOID*) &NewHashBlock, (PVOID*) &NewHashBlock,
@ -2960,7 +2959,7 @@ CmiAllocateHashTableCell (IN PREGISTRY_HIVE RegistryHive,
else else
{ {
NewHashBlock->Id = REG_HASH_TABLE_CELL_ID; NewHashBlock->Id = REG_HASH_TABLE_CELL_ID;
NewHashBlock->HashTableSize = HashTableSize; NewHashBlock->HashTableSize = SubKeyCount;
*HashBlock = NewHashBlock; *HashBlock = NewHashBlock;
} }
@ -3090,7 +3089,7 @@ CmiAllocateValueCell(PREGISTRY_HIVE RegistryHive,
} }
NewValueCell->DataType = 0; NewValueCell->DataType = 0;
NewValueCell->DataSize = 0; NewValueCell->DataSize = 0;
NewValueCell->DataOffset = 0xffffffff; NewValueCell->DataOffset = (BLOCK_OFFSET)-1;
*ValueCell = NewValueCell; *ValueCell = NewValueCell;
} }
@ -3247,7 +3246,7 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive,
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
/* Round to 16 bytes multiple */ /* Round to 16 bytes multiple */
CellSize = (CellSize + sizeof(DWORD) + 15) & 0xfffffff0; CellSize = ROUND_UP(CellSize, 16);
/* Handle volatile hives first */ /* Handle volatile hives first */
if (IsPointerHive(RegistryHive)) if (IsPointerHive(RegistryHive))
@ -3936,7 +3935,7 @@ CmiCopyKey (PREGISTRY_HIVE DstHive,
NewKeyCell->ClassSize = SrcKeyCell->ClassSize; NewKeyCell->ClassSize = SrcKeyCell->ClassSize;
Status = CmiAllocateCell (DstHive, Status = CmiAllocateCell (DstHive,
NewKeyCell->ClassSize, sizeof(CELL_HEADER) + NewKeyCell->ClassSize,
(PVOID)&NewClassNameCell, (PVOID)&NewClassNameCell,
&NewClassNameOffset); &NewClassNameOffset);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -4031,7 +4030,7 @@ CmiCopyKey (PREGISTRY_HIVE DstHive,
SrcValueDataCell = CmiGetCell (SrcHive, SrcValueCell->DataOffset, NULL); SrcValueDataCell = CmiGetCell (SrcHive, SrcValueCell->DataOffset, NULL);
Status = CmiAllocateCell (DstHive, Status = CmiAllocateCell (DstHive,
SrcValueCell->DataSize, sizeof(CELL_HEADER) + SrcValueCell->DataSize,
(PVOID*) &NewValueDataCell, (PVOID*) &NewValueDataCell,
&ValueDataCellOffset); &ValueDataCellOffset);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -4103,7 +4102,7 @@ CmiCopyKey (PREGISTRY_HIVE DstHive,
NewSubKeyCell->ClassSize = SrcSubKeyCell->ClassSize; NewSubKeyCell->ClassSize = SrcSubKeyCell->ClassSize;
Status = CmiAllocateCell (DstHive, Status = CmiAllocateCell (DstHive,
NewSubKeyCell->ClassSize, sizeof(CELL_HEADER) + NewSubKeyCell->ClassSize,
(PVOID)&NewClassNameCell, (PVOID)&NewClassNameCell,
&NewClassNameOffset); &NewClassNameOffset);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * 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 * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS hive maker * PROJECT: ReactOS hive maker
* FILE: tools/mkhive/binhive.c * FILE: tools/mkhive/binhive.c
@ -48,7 +48,7 @@
#define REG_EXTEND_HASH_TABLE_SIZE 4 #define REG_EXTEND_HASH_TABLE_SIZE 4
#define REG_VALUE_LIST_CELL_MULTIPLE 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 ROUND_DOWN(N, S) ((N) - ((N) % (S)))
#define ABS_VALUE(V) (((V) < 0) ? -(V) : (V)) #define ABS_VALUE(V) (((V) < 0) ? -(V) : (V))
@ -733,8 +733,8 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive,
static BOOL static BOOL
CmiAllocateCell (PREGISTRY_HIVE RegistryHive, CmiAllocateCell (PREGISTRY_HIVE RegistryHive,
PVOID *Block,
LONG BlockSize, LONG BlockSize,
PVOID *Block,
PBLOCK_OFFSET pBlockOffset) PBLOCK_OFFSET pBlockOffset)
{ {
PCELL_HEADER NewBlock; PCELL_HEADER NewBlock;
@ -744,7 +744,7 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive,
*Block = NULL; *Block = NULL;
/* Round to 16 bytes multiple */ /* Round to 16 bytes multiple */
BlockSize = (BlockSize + sizeof(ULONG) + 15) & 0xfffffff0; BlockSize = ROUND_UP(BlockSize, 16);
/* first search in free blocks */ /* first search in free blocks */
NewBlock = NULL; NewBlock = NULL;
@ -813,12 +813,11 @@ CmiAllocateHashTableCell (PREGISTRY_HIVE Hive,
ULONG NewHashSize; ULONG NewHashSize;
BOOL Status; BOOL Status;
NewHashSize = ROUND_UP(sizeof(HASH_TABLE_CELL) + NewHashSize = sizeof(HASH_TABLE_CELL) +
(SubKeyCount - 1) * sizeof(HASH_RECORD), (SubKeyCount * sizeof(HASH_RECORD));
0x10);
Status = CmiAllocateCell (Hive, Status = CmiAllocateCell (Hive,
(PVOID*) &HashCell,
NewHashSize, NewHashSize,
(PVOID*) &HashCell,
HBOffset); HBOffset);
if ((HashCell == NULL) || (Status == FALSE)) if ((HashCell == NULL) || (Status == FALSE))
{ {
@ -886,11 +885,11 @@ CmiAllocateValueListCell (PREGISTRY_HIVE Hive,
ULONG ValueListSize; ULONG ValueListSize;
BOOL Status; BOOL Status;
ValueListSize = ROUND_UP (ValueCount * sizeof(BLOCK_OFFSET), ValueListSize = sizeof(VALUE_LIST_CELL) +
0x10); (ValueCount * sizeof(BLOCK_OFFSET));
Status = CmiAllocateCell (Hive, Status = CmiAllocateCell (Hive,
(PVOID)&ValueListCell,
ValueListSize, ValueListSize,
(PVOID)&ValueListCell,
ValueListOffset); ValueListOffset);
if ((ValueListCell == NULL) || (Status == FALSE)) if ((ValueListCell == NULL) || (Status == FALSE))
{ {
@ -914,8 +913,8 @@ CmiAllocateValueCell(PREGISTRY_HIVE Hive,
NameSize = (ValueName == NULL) ? 0 : strlen (ValueName); NameSize = (ValueName == NULL) ? 0 : strlen (ValueName);
Status = CmiAllocateCell (Hive, Status = CmiAllocateCell (Hive,
(PVOID*)&NewValueCell,
sizeof(VALUE_CELL) + NameSize, sizeof(VALUE_CELL) + NameSize,
(PVOID*)&NewValueCell,
ValueCellOffset); ValueCellOffset);
if ((NewValueCell == NULL) || (Status == FALSE)) if ((NewValueCell == NULL) || (Status == FALSE))
{ {
@ -1054,9 +1053,10 @@ CmiExportValue (PREGISTRY_HIVE Hive,
} }
else else
{ {
/* Allocate data cell */
if (!CmiAllocateCell (Hive, if (!CmiAllocateCell (Hive,
sizeof(CELL_HEADER) + DstDataSize,
(PVOID *)&DataCell, (PVOID *)&DataCell,
DstDataSize,
&DataCellOffset)) &DataCellOffset))
{ {
return FALSE; return FALSE;
@ -1116,7 +1116,7 @@ CmiExportSubKey (PREGISTRY_HIVE Hive,
/* Allocate key cell */ /* Allocate key cell */
KeyCellSize = sizeof(KEY_CELL) + Key->NameSize - 1; 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"); DPRINT1 ("CmiAllocateBlock() failed\n");
return FALSE; return FALSE;