CmpDumpKeyBodyList
VOID __fastcall CmpDumpKeyBodyList(_CM_KEY_CONTROL_BLOCK *kcb, UINT64 *Count, VOID *Context){
unsigned int v3;
char v7;
_CM_KEY_BODY **KeyBodyArray;
unsigned int v9;
_CM_KEY_BODY **v10;
$B9512D9805578D643BEBB89DC99AC162 *v11;
_EPROCESS *v12;
$B9512D9805578D643BEBB89DC99AC162 *i;
__int64 v14;
_UNICODE_STRING *KeyPath;
v3 = 0;
v7 = 1;
if( kcb->RefCount )
{
KeyBodyArray = kcb->KeyBodyArray;
v9 = 0;
v10 = kcb->KeyBodyArray;
while( !*v10 )
{
++v9;
++v10;
if( v9 >= 4 )
goto LABEL_7;
}
v7 = 0;
LABEL_7:
v11 = &kcb->120;
if( ($B9512D9805578D643BEBB89DC99AC162 *)v11->KeyBodyListHead.Flink != v11 || v7 != 1 )
{
KeyPath = 0i64;
CmpConstructNameWithStatus(kcb, &KeyPath);
if( KeyPath )
{
for( i = ($B9512D9805578D643BEBB89DC99AC162 *)v11->KeyBodyListHead.Flink;
i != v11;
i = ($B9512D9805578D643BEBB89DC99AC162 *)i->KeyBodyListHead.Flink )
{
CmpDumpOneKeyBody(v12, (__int64)&i[-2], (const void **)KeyPath, (__int64)Context);
++*(_DWORD *)Count;
}
do
{
v14 = (__int64)*KeyBodyArray;
if( (unsigned __int64)*KeyBodyArray >= 3
&& v14 == _InterlockedCompareExchange64((volatile signed __int64 *)&kcb->KeyBodyArray[v3], 1i64, v14) )
{
CmpDumpOneKeyBody(v12, v14, (const void **)KeyPath, (__int64)Context);
++*(_DWORD *)Count;
_InterlockedCompareExchange64((volatile signed __int64 *)&kcb->KeyBodyArray[v3], v14, 1i64);
}
++v3;
++KeyBodyArray;
}
while( v3 < 4 );
CmpFreeTransientPoolWithTag(KeyPath, 0x624E4D43ui64);
}
else if( Context )
{
*((_DWORD *)Context + 5) = -1073741670;
}
}
}
}Referenced by:
CmpFreeAllMemory
CmpSearchAndCountWorker
CmpSearchForOpenSubKeys