CmpQueryKeyDataFromKeyNodeStack

__int64 __fastcall CmpQueryKeyDataFromKeyNodeStack(__int16 *a1, int a2, __int64 a3, unsigned int a4, unsigned int *a5){
  __int64 v5; 
  __int16 *v6; 
  size_t v7; 
  __int64 v8; 
  __int64 v9; 
  INT16 v10; 
  __int64 *EntryAtLayerHeight; 
  __int64 v12; 
  unsigned int v13; 
  INT16 v14; 
  unsigned int v15; 
  __int64 *v16; 
  __int16 v17; 
  unsigned int v18; 
  unsigned int v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  unsigned int v23; 
  unsigned int v24; 
  int SubKeyCountForKeyNodeStack; 
  unsigned int v26; 
  unsigned int v27; 
  unsigned int v28; 
  unsigned __int16 v29; 
  char v31; 
  unsigned int v32; 
  unsigned int v33; 
  const VOID *v34; 
  unsigned int v35; 
  unsigned int v36; 
  INT64 v37; 
  _HV_GET_CELL_CONTEXT v38; 
  __int128 v39; 
  __int128 v40; 
  __int128 v41; 
  __int64 v42; 

  v38 = 0i64;
  v37 = 0i64;
  v39 = 0i64;
  v40 = 0i64;
  v41 = 0i64;
  v31 = 0;
  v5 = 0i64;
  v33 = -1;
  HvpGetCellContextInitialize(&v38);
  v7 = 0;
  v8 = 0i64;
  v9 = 0i64;
  v42 = 0i64;
  v10 = *v6;
  if( *v6 >= 0 )
  {
    while( 1 )
    {
      EntryAtLayerHeight = (__int64 *)CmpKeyNodeStackGetEntryAtLayerHeight((INT64)v6, v10);
      if( EntryAtLayerHeight[2] )
        break;
      if( --v10 < 0 )
      {
        v8 = 0i64;
        goto LABEL_6;
      }
    }
    v8 = *EntryAtLayerHeight;
    v9 = EntryAtLayerHeight[2];
    v42 = v9;
  }
LABEL_6:
  v12 = *(_QWORD *)(v9 + 4);
  v13 = (unsigned __int16)*(_DWORD *)(v9 + 52);
  v32 = *(_DWORD *)(v9 + 56);
  v35 = *(_DWORD *)(v9 + 60);
  v36 = *(_DWORD *)(v9 + 64);
  if( *(char *)(v9 + 13) >= 0 )
  {
    v31 = 1;
    v5 = v8;
    v33 = *(_DWORD *)(v9 + 48);
    v7 = *(unsigned __int16 *)(v9 + 74);
  }
  v14 = v10 - 1;
  if( v14 >= 0 )
  {
    v15 = *(_DWORD *)(v9 + 56);
    do
    {
      v16 = (__int64 *)CmpKeyNodeStackGetEntryAtLayerHeight((INT64)v6, v14);
      v20 = v16[2];
      if( v20 )
      {
        if( (unsigned int)CmpGetEffectiveKeyNodeSemantics(*v16, v20) == 1 )
          break;
        if( v12 < *(_QWORD *)(v21 + 4) )
          v12 = *(_QWORD *)(v21 + 4);
        v23 = (unsigned __int16)*(_DWORD *)(v21 + 52);
        if( v13 >= v23 )
          v23 = v13;
        v13 = v23;
        v24 = *(_DWORD *)(v21 + 56);
        if( v15 >= v24 )
          v24 = v15;
        v15 = v24;
        if( !v31 && *(char *)(v21 + 13) >= 0 )
        {
          v31 = 1;
          v5 = v22;
          v33 = *(_DWORD *)(v21 + 48);
          v7 = *(unsigned __int16 *)(v21 + 74);
        }
        if( (unsigned int)CmpGetEffectiveKeyNodeSemantics(v22, v21) )
          break;
      }
      v14 = v17 - 1;
    }
    while( v14 >= 0 );
    v32 = v15;
    v36 = v19;
    v35 = v18;
    v9 = v42;
  }
  if( v31 && v7 )
  {
    v34 = (const VOID *)(*(__int64(__fastcall **)(__int64, _QWORD, _HV_GET_CELL_CONTEXT *))(v5 + 8))(v5, v33, &v38);
    v6 = a1;
  }
  else
  {
    v34 = 0i64;
    v7 = 0;
  }
  if( a2 )
  {
    if( a2 == 1 )
    {
      *(_QWORD *)&v39 = v12;
      SubKeyCountForKeyNodeStack = CmpPopulateKeyNodeInformation((__int64)&v39, v9, v34, v7, a3, a4, a5);
    }
    else
    {
      SubKeyCountForKeyNodeStack = CmpGetSubKeyCountForKeyNodeStack((INT64)v6, &v37);
      if( SubKeyCountForKeyNodeStack >= 0 )
      {
        SubKeyCountForKeyNodeStack = CmpGetValueCountForKeyNodeStack(a1, (_DWORD *)&v37 + 1);
        if( SubKeyCountForKeyNodeStack >= 0 )
        {
          if( (_DWORD)v37 )
          {
            v26 = v32;
          }
          else
          {
            v13 = 0;
            v26 = 0;
          }
          if( HIDWORD(v37) )
          {
            v27 = v35;
            v28 = v36;
          }
          else
          {
            v27 = 0;
            v28 = 0;
          }
          if( a2 == 4 )
          {
            *(_QWORD *)&v39 = v12;
            HIDWORD(v39) = v37;
            *(_QWORD *)&v40 = __PAIR64__(HIDWORD(v37), v13);
            *((_QWORD *)&v40 + 1) = __PAIR64__(v28, v27);
            v29 = 2 * *(_WORD *)(v9 + 72);
            if( (*(_BYTE *)(v9 + 2) & 0x20) == 0 )
              v29 = *(_WORD *)(v9 + 72);
            LODWORD(v41) = v29;
            SubKeyCountForKeyNodeStack = CmpPopulateKeyCachedInformation((__int64)&v39, a3, a4, a5);
          }
          else if( a2 == 2 )
          {
            *(_QWORD *)&v39 = v12;
            *(_QWORD *)((char *)&v40 + 4) = __PAIR64__(v13, v37);
            HIDWORD(v40) = v26;
            *(_QWORD *)&v41 = __PAIR64__(v27, HIDWORD(v37));
            DWORD2(v41) = v28;
            SubKeyCountForKeyNodeStack = CmpPopulateKeyFullInformation((__int64)&v39, v34, v7, a3, a4, a5);
          }
          else
          {
            SubKeyCountForKeyNodeStack = -1073741811;
          }
        }
      }
    }
  }
  else
  {
    *(_QWORD *)&v39 = v12;
    SubKeyCountForKeyNodeStack = CmpPopulateKeyBasicInformation((__int64)&v39, v9, a3, a4, a5);
  }
  if( v34 )
    (*(void(__fastcall **)(__int64, _HV_GET_CELL_CONTEXT *))(v5 + 16))(v5, &v38);
  return(unsigned int)SubKeyCountForKeyNodeStack;
}

Referenced by:

CmQueryLayeredKey
CmpEnumerateLayeredKey