CmpCleanUpKCBCacheTable
VOID __fastcall CmpCleanUpKCBCacheTable(INT64 a1){
unsigned int v1;
__int64 v2;
__int64 v3;
_CM_KEY_HASH **v4;
_CM_KEY_HASH *i;
_CM_KEY_CONTROL_BLOCK *p_KeyHive;
_CM_KEY_HASH **p_NextHash;
INT64 RegLockHeldEx[2];
_KAPC_STATE ApcState;
v1 = *(_DWORD *)(a1 + 1648);
v2 = *(_QWORD *)(a1 + 1640);
memset(&ApcState, 0, sizeof(ApcState));
*(_OWORD *)RegLockHeldEx = 0i64;
CmpAttachToRegistryProcess(&ApcState);
CmpInitializeDelayDerefContext(RegLockHeldEx);
v3 = 0i64;
if( v1 )
{
v4 = (_CM_KEY_HASH **)(v2 + 16);
do
{
for( i = *v4; i; i = *p_NextHash )
{
p_KeyHive = (_CM_KEY_CONTROL_BLOCK *)&i[-1].KeyHive;
if( i[-1].KeyHive )
{
p_NextHash = &p_KeyHive->KeyHash.NextHash;
}
else
{
CmpRemoveFromDelayedClose((__int64)&i[-1].KeyHive);
CmpCleanUpKcbCacheWithLock(p_KeyHive, (INT64)RegLockHeldEx);
if( (p_KeyHive->_bf_8 & 0x80000) != 0 )
CmpFreeKeyControlBlock((UINT64)p_KeyHive);
CmpDrainDelayDerefContext((UINT64 **)RegLockHeldEx);
p_NextHash = (_CM_KEY_HASH **)(v2 + 16 + 24 * v3);
}
}
v3 = (unsigned int)(v3 + 1);
v4 += 3;
}
while( (unsigned int)v3 < v1 );
}
KiUnstackDetachProcess(&ApcState, 0i64);
}Referenced by:
CmpCleanUpHigherLayerKcbCachesPostCallback
CmpEnumerateAllOpenSubKeys
CmpRefreshHive