mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 16:02:56 +00:00
Fixed cell buggy cell size calculation.
svn path=/trunk/; revision=6276
This commit is contained in:
parent
573b369b03
commit
a7d3c209b1
4 changed files with 27 additions and 28 deletions
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue