mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 03:23:51 +00:00
Fixed value list cell resizing bug.
svn path=/trunk/; revision=4385
This commit is contained in:
parent
71c0c0f710
commit
a4e1a6d03d
1 changed files with 30 additions and 27 deletions
|
@ -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++;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue