Fixed value list cell resizing bug.

svn path=/trunk/; revision=4385
This commit is contained in:
Eric Kohl 2003-03-21 17:40:57 +00:00
parent 71c0c0f710
commit a4e1a6d03d

View file

@ -33,6 +33,8 @@
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) #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))
BOOLEAN CmiDoVerify = FALSE; BOOLEAN CmiDoVerify = FALSE;
static ULONG static ULONG
@ -2425,10 +2427,10 @@ CmiGetValueFromKeyByIndex(IN PREGISTRY_HIVE RegistryHive,
NTSTATUS NTSTATUS
CmiAddValueToKey(IN PREGISTRY_HIVE RegistryHive, CmiAddValueToKey(IN PREGISTRY_HIVE RegistryHive,
IN PKEY_CELL KeyCell, IN PKEY_CELL KeyCell,
IN PUNICODE_STRING ValueName, IN PUNICODE_STRING ValueName,
OUT PVALUE_CELL *pValueCell, OUT PVALUE_CELL *pValueCell,
OUT BLOCK_OFFSET *pVBOffset) OUT BLOCK_OFFSET *pVBOffset)
{ {
PVALUE_LIST_CELL NewValueListCell; PVALUE_LIST_CELL NewValueListCell;
PVALUE_LIST_CELL ValueListCell; PVALUE_LIST_CELL ValueListCell;
@ -2438,9 +2440,9 @@ CmiAddValueToKey(IN PREGISTRY_HIVE RegistryHive,
NTSTATUS Status; NTSTATUS Status;
Status = CmiAllocateValueCell(RegistryHive, Status = CmiAllocateValueCell(RegistryHive,
&NewValueCell, &NewValueCell,
&VBOffset, &VBOffset,
ValueName); ValueName);
*pVBOffset = VBOffset; *pVBOffset = VBOffset;
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -2458,38 +2460,39 @@ CmiAddValueToKey(IN PREGISTRY_HIVE RegistryHive,
&VLBOffset); &VLBOffset);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
CmiDestroyValueCell(RegistryHive, NewValueCell, VBOffset); CmiDestroyValueCell(RegistryHive, NewValueCell, VBOffset);
return Status; return Status;
} }
KeyCell->ValuesOffset = VLBOffset; KeyCell->ValuesOffset = VLBOffset;
} }
else if ((KeyCell->NumberOfValues else if (KeyCell->NumberOfValues >=
>= (ULONG) ((LONG) (ValueListCell->CellSize - 4)) / (LONG) sizeof(BLOCK_OFFSET))) (((ULONG)ABS_VALUE(ValueListCell->CellSize) - 4) / sizeof(BLOCK_OFFSET)))
{ {
Status = CmiAllocateBlock(RegistryHive, Status = CmiAllocateBlock(RegistryHive,
(PVOID) &NewValueListCell, (PVOID) &NewValueListCell,
sizeof(BLOCK_OFFSET) * (KeyCell->NumberOfValues + REG_VALUE_LIST_CELL_MULTIPLE), (KeyCell->NumberOfValues + REG_VALUE_LIST_CELL_MULTIPLE) *
&VLBOffset); sizeof(BLOCK_OFFSET),
&VLBOffset);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
CmiDestroyValueCell(RegistryHive, NewValueCell, VBOffset); CmiDestroyValueCell(RegistryHive, NewValueCell, VBOffset);
return Status; return Status;
} }
RtlCopyMemory(&NewValueListCell->Values[0], RtlCopyMemory(&NewValueListCell->Values[0],
&ValueListCell->Values[0], &ValueListCell->Values[0],
sizeof(BLOCK_OFFSET) * KeyCell->NumberOfValues); sizeof(BLOCK_OFFSET) * KeyCell->NumberOfValues);
CmiDestroyBlock(RegistryHive, ValueListCell, KeyCell->ValuesOffset); CmiDestroyBlock(RegistryHive, ValueListCell, KeyCell->ValuesOffset);
KeyCell->ValuesOffset = VLBOffset; KeyCell->ValuesOffset = VLBOffset;
ValueListCell = NewValueListCell; ValueListCell = NewValueListCell;
} }
DPRINT("KeyCell->NumberOfValues %d, ValueListCell->CellSize %d (%d %x)\n", DPRINT("KeyCell->NumberOfValues %lu, ValueListCell->CellSize %lu (%lu %lx)\n",
KeyCell->NumberOfValues, ValueListCell->CellSize, KeyCell->NumberOfValues,
-(ValueListCell->CellSize - 4) / sizeof(BLOCK_OFFSET), (ULONG)ABS_VALUE(ValueListCell->CellSize),
-(ValueListCell->CellSize - 4) / sizeof(BLOCK_OFFSET)); ((ULONG)ABS_VALUE(ValueListCell->CellSize) - 4) / sizeof(BLOCK_OFFSET),
((ULONG)ABS_VALUS(ValueListCell->CellSize) - 4) / sizeof(BLOCK_OFFSET));
ValueListCell->Values[KeyCell->NumberOfValues] = VBOffset; ValueListCell->Values[KeyCell->NumberOfValues] = VBOffset;
KeyCell->NumberOfValues++; KeyCell->NumberOfValues++;