CmpFindKcbInHashEntryByName
_CM_KEY_CONTROL_BLOCK *__fastcall CmpFindKcbInHashEntryByName(
_CMHIVE *Hive,
_CM_PATH_HASH PathHash,
_CM_KEY_CONTROL_BLOCK *Parent,
const _UNICODE_STRING *ComponentName){
_CM_KEY_CONTROL_BLOCK *v6;
_CM_KEY_HASH *i;
__int64 v9;
unsigned __int16 v10;
int v11;
UNICODE_STRING DestName;
DestName = 0i64;
v6 = 0i64;
for( i = Hive->KcbCacheTable[(Hive->KcbCacheTableSize - 1) & ((101027 * (PathHash.Hash ^ (PathHash.Hash >> 9))) ^ ((unsigned __int64)(101027 * (PathHash.Hash ^ (PathHash.Hash >> 9))) >> 9))].Entry;
i;
i = i->NextHash )
{
if( i->ConvKey.Hash == PathHash.Hash && *(_CM_KEY_CONTROL_BLOCK **)&i[1].KeyCell == Parent )
{
v9 = *(_QWORD *)&i[2].ConvKey.Hash;
v10 = *(_WORD *)(v9 + 24);
if( (*(_DWORD *)v9 & 1) != 0 )
{
v11 = CmpCompareCompressedName(
(UNICODE_STRING *)ComponentName,
(WCHAR *)(v9 + 26),
*(unsigned __int16 *)(v9 + 24),
2ui64);
}
else
{
DestName.Buffer = (wchar_t *)(v9 + 26);
DestName.Length = v10;
DestName.MaximumLength = v10;
v11 = CmpCompareUnicodeString((_UNICODE_STRING *)ComponentName, &DestName, 2ui64);
}
if( !v11 )
return(_CM_KEY_CONTROL_BLOCK *)&i[-1].KeyHive;
}
}
return v6;
}Referenced by:
CmRenameKey
CmpCreateKeyControlBlock
CmpPartialPromoteSubkeys
CmpSubtreeEnumeratorAdvance
CmpWalkOneLevel