CmpKeyEnumStackEntryBegin

INT64 __fastcall CmpKeyEnumStackEntryBegin(INT64 *a1, UINT64 *a2, INT64 a3){
  INT64 *v5; 
  INT64 *v6; 
  INT64 result; 
  INT64 *v8; 
  INT64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned int v12; 
  unsigned int v13; 
  INT16 *v14; 
  unsigned int SubKeyByNumber; 
  _CM_KEY_NODE *v16; 
  INT64 v17; 
  _CM_KEY_NODE *v18; 

  *a1 = *a2;
  a1[1] = (*(__int64(__fastcall **)(UINT64, _QWORD, INT64 *))(*a2 + 8))(*a2, *((unsigned int *)a2 + 2), a1 + 2);
  v5 = a1 + 10;
  v6 = a1 + 3;
  result = -4i64 - (_QWORD)a1;
  v8 = a1 + 12;
  v9 = a3 - (_QWORD)a1;
  v10 = 4i64 - (_QWORD)a1;
  v11 = 2i64;
  do
  {
    v12 = *(_DWORD *)((char *)v6 + result + a1[1]);
    *(_DWORD *)((char *)a1 + (_QWORD)v6 + v9 - a3 + 8) = v12;
    if( a3 )
      v13 = *(_DWORD *)((char *)v6 + v9 - 8);
    else
      v13 = 0;
    *(_DWORD *)v6 = v13;
    if( v12 > v13 )
    {
      v14 = (INT16 *)(*(__int64(__fastcall **)(INT64, _QWORD, INT64 *))(*a1 + 8))(
                       *a1,
                       *(unsigned int *)((char *)v6 + v10 + a1[1]),
                       v8 - 5);
      *(v5 - 5) = (INT64)v14;
      SubKeyByNumber = CmpDoFindSubKeyByNumber(*a1, v14, *(unsigned int *)v6);
      *((_DWORD *)v6 + 12) = SubKeyByNumber;
      v16 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(INT64, _QWORD, INT64 *))(*a1 + 8))(*a1, SubKeyByNumber, v8);
      *v5 = (INT64)v16;
      v17 = (INT64)v16;
      v18 = (_CM_KEY_NODE *)a1[15];
      if( !v18 || (int)CmpCompareKeysByName(v16, v18) < 0 )
      {
        a1[15] = v17;
        *((_DWORD *)a1 + 28) = *((_DWORD *)v6 + 12);
      }
      v10 = 4i64 - (_QWORD)a1;
      v9 = a3 - (_QWORD)a1;
    }
    result = -4i64 - (_QWORD)a1;
    ++v8;
    ++v5;
    v6 = (INT64 *)((char *)v6 + 4);
    --v11;
  }
  while( v11 );
  return result;
}

Referenced by:

CmpKeyEnumStackBeginEnumerationForKeyNodeStack