mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 18:05:46 +00:00
- Update cached KCB values when necessary.
- Update Node Maximum values when necessary. - Return data from the node instead of calling 3rd-party functions to loop around the entire key until they find something appropriate. - Get rid of CmiScanForSubKey, CmiGetMaxValueDataLength, CmiGetMaxValueNameLength, CmiGetMaxClassLength, CmiGetMaxNameLength. svn path=/trunk/; revision=30028
This commit is contained in:
parent
f366d38ae8
commit
c5f01afb3d
2 changed files with 24 additions and 188 deletions
|
@ -101,157 +101,6 @@ CmiFlushRegistryHive(PCMHIVE RegistryHive)
|
||||||
return Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
|
return Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG
|
|
||||||
CmiGetMaxNameLength(PHHIVE Hive,
|
|
||||||
PCM_KEY_NODE KeyCell)
|
|
||||||
{
|
|
||||||
PCM_KEY_FAST_INDEX HashBlock;
|
|
||||||
PCM_KEY_NODE CurSubKeyCell;
|
|
||||||
ULONG MaxName;
|
|
||||||
ULONG NameLength;
|
|
||||||
ULONG i;
|
|
||||||
ULONG Storage;
|
|
||||||
|
|
||||||
MaxName = 0;
|
|
||||||
for (Storage = Stable; Storage < HTYPE_COUNT; Storage++)
|
|
||||||
{
|
|
||||||
if (KeyCell->SubKeyLists[Storage] != HCELL_NIL)
|
|
||||||
{
|
|
||||||
HashBlock = (PCM_KEY_FAST_INDEX)HvGetCell (Hive, KeyCell->SubKeyLists[Storage]);
|
|
||||||
ASSERT(HashBlock->Signature == CM_KEY_FAST_LEAF);
|
|
||||||
|
|
||||||
for (i = 0; i < KeyCell->SubKeyCounts[Storage]; i++)
|
|
||||||
{
|
|
||||||
CurSubKeyCell = (PCM_KEY_NODE)HvGetCell (Hive,
|
|
||||||
HashBlock->List[i].Cell);
|
|
||||||
NameLength = CurSubKeyCell->NameLength;
|
|
||||||
if (CurSubKeyCell->Flags & KEY_COMP_NAME)
|
|
||||||
NameLength *= sizeof(WCHAR);
|
|
||||||
if (NameLength > MaxName)
|
|
||||||
MaxName = NameLength;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT ("MaxName %lu\n", MaxName);
|
|
||||||
|
|
||||||
return MaxName;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
CmiGetMaxClassLength(PHHIVE Hive,
|
|
||||||
PCM_KEY_NODE KeyCell)
|
|
||||||
{
|
|
||||||
PCM_KEY_FAST_INDEX HashBlock;
|
|
||||||
PCM_KEY_NODE CurSubKeyCell;
|
|
||||||
ULONG MaxClass;
|
|
||||||
ULONG i;
|
|
||||||
ULONG Storage;
|
|
||||||
|
|
||||||
MaxClass = 0;
|
|
||||||
for (Storage = Stable; Storage < HTYPE_COUNT; Storage++)
|
|
||||||
{
|
|
||||||
if (KeyCell->SubKeyLists[Storage] != HCELL_NIL)
|
|
||||||
{
|
|
||||||
HashBlock = (PCM_KEY_FAST_INDEX)HvGetCell (Hive,
|
|
||||||
KeyCell->SubKeyLists[Storage]);
|
|
||||||
ASSERT(HashBlock->Signature == CM_KEY_FAST_LEAF);
|
|
||||||
|
|
||||||
for (i = 0; i < KeyCell->SubKeyCounts[Storage]; i++)
|
|
||||||
{
|
|
||||||
CurSubKeyCell = (PCM_KEY_NODE)HvGetCell (Hive,
|
|
||||||
HashBlock->List[i].Cell);
|
|
||||||
|
|
||||||
if (MaxClass < CurSubKeyCell->ClassLength)
|
|
||||||
{
|
|
||||||
MaxClass = CurSubKeyCell->ClassLength;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MaxClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
CmiGetMaxValueNameLength(PHHIVE Hive,
|
|
||||||
PCM_KEY_NODE KeyCell)
|
|
||||||
{
|
|
||||||
PVALUE_LIST_CELL ValueListCell;
|
|
||||||
PCM_KEY_VALUE CurValueCell;
|
|
||||||
ULONG MaxValueName;
|
|
||||||
ULONG Size;
|
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
VERIFY_KEY_CELL(KeyCell);
|
|
||||||
|
|
||||||
if (KeyCell->ValueList.List == HCELL_NIL)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
MaxValueName = 0;
|
|
||||||
ValueListCell = (PVALUE_LIST_CELL)HvGetCell (Hive,
|
|
||||||
KeyCell->ValueList.List);
|
|
||||||
|
|
||||||
for (i = 0; i < KeyCell->ValueList.Count; i++)
|
|
||||||
{
|
|
||||||
CurValueCell = (PCM_KEY_VALUE)HvGetCell (Hive,
|
|
||||||
ValueListCell->ValueOffset[i]);
|
|
||||||
if (CurValueCell == NULL)
|
|
||||||
{
|
|
||||||
DPRINT("CmiGetBlock() failed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CurValueCell != NULL)
|
|
||||||
{
|
|
||||||
Size = CurValueCell->NameLength;
|
|
||||||
if (CurValueCell->Flags & VALUE_COMP_NAME)
|
|
||||||
{
|
|
||||||
Size *= sizeof(WCHAR);
|
|
||||||
}
|
|
||||||
if (MaxValueName < Size)
|
|
||||||
{
|
|
||||||
MaxValueName = Size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MaxValueName;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
CmiGetMaxValueDataLength(PHHIVE Hive,
|
|
||||||
PCM_KEY_NODE KeyCell)
|
|
||||||
{
|
|
||||||
PVALUE_LIST_CELL ValueListCell;
|
|
||||||
PCM_KEY_VALUE CurValueCell;
|
|
||||||
LONG MaxValueData;
|
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
VERIFY_KEY_CELL(KeyCell);
|
|
||||||
|
|
||||||
if (KeyCell->ValueList.List == HCELL_NIL)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
MaxValueData = 0;
|
|
||||||
ValueListCell = (PVALUE_LIST_CELL)HvGetCell (Hive, KeyCell->ValueList.List);
|
|
||||||
|
|
||||||
for (i = 0; i < KeyCell->ValueList.Count; i++)
|
|
||||||
{
|
|
||||||
CurValueCell = (PCM_KEY_VALUE)HvGetCell (Hive,
|
|
||||||
ValueListCell->ValueOffset[i]);
|
|
||||||
if ((MaxValueData < (LONG)(CurValueCell->DataLength & REG_DATA_SIZE_MASK)))
|
|
||||||
{
|
|
||||||
MaxValueData = CurValueCell->DataLength & REG_DATA_SIZE_MASK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MaxValueData;
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiScanKeyForValue(IN PCMHIVE RegistryHive,
|
CmiScanKeyForValue(IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
|
@ -275,28 +124,4 @@ CmiScanKeyForValue(IN PCMHIVE RegistryHive,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
CmiScanForSubKey(IN PCMHIVE RegistryHive,
|
|
||||||
IN PCM_KEY_NODE KeyCell,
|
|
||||||
OUT PCM_KEY_NODE *SubKeyCell,
|
|
||||||
OUT HCELL_INDEX *BlockOffset,
|
|
||||||
IN PCUNICODE_STRING KeyName,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN ULONG Attributes)
|
|
||||||
{
|
|
||||||
HCELL_INDEX CellIndex;
|
|
||||||
|
|
||||||
/* Assume failure */
|
|
||||||
*SubKeyCell = NULL;
|
|
||||||
|
|
||||||
/* Call newer Cm API */
|
|
||||||
CellIndex = CmpFindSubKeyByName(&RegistryHive->Hive, KeyCell, KeyName);
|
|
||||||
if (CellIndex == HCELL_NIL) return STATUS_OBJECT_NAME_NOT_FOUND;
|
|
||||||
|
|
||||||
/* Otherwise, get the cell data back too */
|
|
||||||
*BlockOffset = CellIndex;
|
|
||||||
*SubKeyCell = (PCM_KEY_NODE)HvGetCell(&RegistryHive->Hive, CellIndex);
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -331,8 +331,23 @@ CmSetValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
Quickie:
|
Quickie:
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
ASSERT(Parent->MaxValueNameLen == Kcb->KcbMaxValueNameLen);
|
||||||
|
if (Parent->MaxValueNameLen < ValueName->Length)
|
||||||
|
{
|
||||||
|
Parent->MaxValueNameLen = ValueName->Length;
|
||||||
|
Kcb->KcbMaxValueNameLen = ValueName->Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(Parent->MaxValueDataLen == Kcb->KcbMaxValueDataLen);
|
||||||
|
if (Parent->MaxValueDataLen < DataLength)
|
||||||
|
{
|
||||||
|
Parent->MaxValueDataLen = DataLength;
|
||||||
|
Kcb->KcbMaxValueDataLen = Parent->MaxValueDataLen;
|
||||||
|
}
|
||||||
|
|
||||||
/* Save the write time */
|
/* Save the write time */
|
||||||
KeQuerySystemTime(&Parent->LastWriteTime);
|
KeQuerySystemTime(&Parent->LastWriteTime);
|
||||||
|
KeQuerySystemTime(&Kcb->KcbLastWriteTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release the lock */
|
/* Release the lock */
|
||||||
|
@ -422,8 +437,11 @@ CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
|
|
||||||
/* Set the last write time */
|
/* Set the last write time */
|
||||||
KeQuerySystemTime(&Parent->LastWriteTime);
|
KeQuerySystemTime(&Parent->LastWriteTime);
|
||||||
|
KeQuerySystemTime(&Kcb->KcbLastWriteTime);
|
||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
|
ASSERT(Parent->MaxValueNameLen == Kcb->KcbMaxValueNameLen);
|
||||||
|
ASSERT(Parent->MaxValueDataLen == Kcb->KcbMaxValueDataLen);
|
||||||
ASSERT(HvIsCellDirty(Hive, Cell));
|
ASSERT(HvIsCellDirty(Hive, Cell));
|
||||||
|
|
||||||
/* Check if the value list is empty now */
|
/* Check if the value list is empty now */
|
||||||
|
@ -432,6 +450,8 @@ CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
/* Then clear key node data */
|
/* Then clear key node data */
|
||||||
Parent->MaxValueNameLen = 0;
|
Parent->MaxValueNameLen = 0;
|
||||||
Parent->MaxValueDataLen = 0;
|
Parent->MaxValueDataLen = 0;
|
||||||
|
Kcb->KcbMaxValueNameLen = 0;
|
||||||
|
Kcb->KcbMaxValueDataLen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Change default Status to success */
|
/* Change default Status to success */
|
||||||
|
@ -811,19 +831,10 @@ CmpQueryKeyData(IN PHHIVE Hive,
|
||||||
Info->KeyFullInformation.SubKeys = Node->SubKeyCounts[Stable] +
|
Info->KeyFullInformation.SubKeys = Node->SubKeyCounts[Stable] +
|
||||||
Node->SubKeyCounts[Volatile];
|
Node->SubKeyCounts[Volatile];
|
||||||
Info->KeyFullInformation.Values = Node->ValueList.Count;
|
Info->KeyFullInformation.Values = Node->ValueList.Count;
|
||||||
Info->KeyFullInformation.MaxNameLen = CmiGetMaxNameLength(Hive, Node);
|
Info->KeyFullInformation.MaxNameLen = Node->MaxNameLen;
|
||||||
Info->KeyFullInformation.MaxClassLen = CmiGetMaxClassLength(Hive, Node);
|
Info->KeyFullInformation.MaxClassLen = Node->MaxClassLen;
|
||||||
Info->KeyFullInformation.MaxValueNameLen = CmiGetMaxValueNameLength(Hive, Node);
|
Info->KeyFullInformation.MaxValueNameLen = Node->MaxValueNameLen;
|
||||||
Info->KeyFullInformation.MaxValueDataLen = CmiGetMaxValueDataLength(Hive, Node);
|
Info->KeyFullInformation.MaxValueDataLen = Node->MaxValueDataLen;
|
||||||
DPRINT("%d %d %d %d\n",
|
|
||||||
CmiGetMaxNameLength(Hive, Node),
|
|
||||||
CmiGetMaxValueDataLength(Hive, Node),
|
|
||||||
CmiGetMaxValueNameLength(Hive, Node),
|
|
||||||
CmiGetMaxClassLength(Hive, Node));
|
|
||||||
//Info->KeyFullInformation.MaxNameLen = Node->MaxNameLen;
|
|
||||||
//Info->KeyFullInformation.MaxClassLen = Node->MaxClassLen;
|
|
||||||
//Info->KeyFullInformation.MaxValueNameLen = Node->MaxValueNameLen;
|
|
||||||
//Info->KeyFullInformation.MaxValueDataLen = Node->MaxValueDataLen;
|
|
||||||
|
|
||||||
/* Check if we have a class */
|
/* Check if we have a class */
|
||||||
if (Node->ClassLength > 0)
|
if (Node->ClassLength > 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue