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
typedef ULONG BLOCK_OFFSET;
typedef ULONG BLOCK_OFFSET, *PBLOCK_OFFSET;
/* header for registry hive file : */
typedef struct _HIVE_HEADER

View file

@ -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;

View file

@ -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))

View file

@ -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;