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