CmpKeyEnumStackEntryAdvance

INT64 __fastcall CmpKeyEnumStackEntryAdvance(__int64 *a1){
  __int64 v1; 
  int v3; 
  __int64 v4; 
  _CM_KEY_NODE **v5; 
  INT64 result; 
  __int64 v7; 
  __int64 v8; 
  __int64 *v9; 
  int v10; 
  UINT64 v11; 
  unsigned int SubKeyByNumber; 
  __int64 *v13; 
  _CM_KEY_NODE *v14; 
  _CM_KEY_NODE *v15; 

  v1 = a1[15];
  v3 = 0;
  v4 = 0i64;
  v5 = (_CM_KEY_NODE **)(a1 + 10);
  result = (INT64)(a1 + 10);
  v7 = 2i64;
  while( *(_QWORD *)result != v1 )
  {
    ++v3;
    ++v4;
    result += 8i64;
    if( v4 >= 2 )
      goto LABEL_7;
  }
  v8 = v3;
  v9 = &a1[v3];
  result = (*(__int64(__fastcall **)(__int64, __int64 *))(*a1 + 16))(*a1, v9 + 12);
  a1[v8 + 10] = 0i64;
  v10 = *((_DWORD *)a1 + v8 + 6);
  *((_DWORD *)a1 + v8 + 18) = -1;
  v11 = (unsigned int)(v10 + 1);
  *((_DWORD *)a1 + v8 + 6) = v11;
  if( (unsigned int)v11 < *((_DWORD *)a1 + v8 + 8) )
  {
    SubKeyByNumber = CmpDoFindSubKeyByNumber(*a1, (INT16 *)a1[v8 + 5], v11);
    *((_DWORD *)a1 + v8 + 18) = SubKeyByNumber;
    result = (*(__int64(__fastcall **)(__int64, _QWORD, __int64 *))(*a1 + 8))(*a1, SubKeyByNumber, v9 + 12);
    a1[v8 + 10] = result;
  }
LABEL_7:
  a1[15] = 0i64;
  v13 = a1 + 9;
  *((_DWORD *)a1 + 28) = -1;
  do
  {
    v14 = *v5;
    if( *v5 )
    {
      v15 = (_CM_KEY_NODE *)a1[15];
      if( !v15 || (result = CmpCompareKeysByName(*v5, v15), (int)result < 0) )
      {
        a1[15] = (__int64)v14;
        result = *(unsigned int *)v13;
        *((_DWORD *)a1 + 28) = result;
      }
    }
    ++v5;
    v13 = (__int64 *)((char *)v13 + 4);
    --v7;
  }
  while( v7 );
  return result;
}

Referenced by:

CmpKeyEnumStackAdvanceInternal