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;
_UNICODE_STRING *v11;
_CM_KEY_BODY *v12;
_UNICODE_STRING *i;
_UNICODE_STRING *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 = (_UNICODE_STRING *)kcb->gap78;
if( *(_UNICODE_STRING **)&v11->Length != v11 || v7 != 1 )
{
KeyPath = 0i64;
CmpConstructNameWithStatus(kcb, &KeyPath);
if( KeyPath )
{
for( i = *(_UNICODE_STRING **)&v11->Length; i != v11; i = *(_UNICODE_STRING **)&i->Length )
{
CmpDumpOneKeyBody(v12, i - 2, KeyPath);
++*(_DWORD *)Count;
}
do
{
v14 = (_UNICODE_STRING *)*KeyBodyArray;
if( (unsigned __int64)*KeyBodyArray >= 3
&& v14 == (_UNICODE_STRING *)_InterlockedCompareExchange64(
(volatile signed __int64 *)&kcb->KeyBodyArray[v3],
1i64,
(signed __int64)v14) )
{
CmpDumpOneKeyBody(v12, v14, KeyPath);
++*(_DWORD *)Count;
_InterlockedCompareExchange64((volatile signed __int64 *)&kcb->KeyBodyArray[v3], (signed __int64)v14, 1i64);
}
++v3;
++KeyBodyArray;
}
while( v3 < 4 );
CmpFreeTransientPoolWithTag(KeyPath, 0x624E4D43ui64);
}
else if( Context )
{
*((_DWORD *)Context + 5) = -1073741670;
}
}
}
}Referenced by:
CmpFreeAllMemory
CmpSearchAndCountWorker
CmpSearchForOpenSubKeys