mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 16:52:59 +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
|
||||
typedef ULONG BLOCK_OFFSET;
|
||||
typedef ULONG BLOCK_OFFSET, *PBLOCK_OFFSET;
|
||||
|
||||
/* header for registry hive file : */
|
||||
typedef struct _HIVE_HEADER
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue