ST_STORE::StCompactRegions

__int64 __fastcall ST_STORE::StCompactRegions(
        __int64 a1,
        __int64 a2,
        unsigned int a3,
        __int64 a4,
        unsigned int a5,
        int a6){
  __int64 v7; 
  __int64 v8; 
  _WORD *v9; 
  int v10; 
  _QWORD *v11; 
  int v12; 
  __int64 *v13; 
  int v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  struct B_TREE_NODE_HDR *LeafSibling; 
  unsigned int v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  int v23; 
  __int64 v24; 
  int *v25; 
  int v26; 
  int v27; 
  int v28; 
  unsigned int v29; 
  UINT64 v30; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  int v34; 
  int v35; 
  int *v36; 
  int v37; 
  int v38; 
  int v39; 
  int v40; 
  int v41; 
  int v43; 
  int v44; 
  int v45; 
  unsigned int v46; 
  int v47; 
  int v48; 
  __int128 v49; 
  unsigned int v50; 
  __int64 v51; 
  _WORD *v52; 
  __int64 v53; 
  int *v54; 
  _WORD *v55; 
  __int64 *v56; 
  INT64 result[3]; 
  int v58; 
  int v59; 
  __int64 v60; 
  char v61; 
  v7 = a3;
  v53 = a2;
  v50 = a3;
  v46 = a5;
  v51 = a4;
  memset((INT64)result, 0i64);
  v8 = *(_QWORD *)(a1 + 1032);
  v44 = 0;
  v49 = 0i64;
  v9 = (_WORD *)(v8 + 2i64 * a5);
  v55 = (_WORD *)(v8 + 2 * v7);
  v52 = v9;
  if( v55 == v9 )
    v10 = 0;
  else
    v10 = *v9 & 0x1FFF;
  v43 = v10;
  ST_STORE::StDmPageRecordUnprotect(a1, *(_QWORD *)(a1 + 760));
  v11 = (_QWORD *)(a1 + 88);
  v12 = *(_DWORD *)(a1 + 120);
  v13 = (__int64 *)(a1 + 64);
  v56 = (__int64 *)(a1 + 64);
  if( (v12 & 1) != 0 )
  {
    B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultDeref(
      (__int64 *)(a1 + 64),
      a1 + 88);
    v12 = *(_DWORD *)(a1 + 120);
  }
  *(_DWORD *)(a1 + 120) = v12 & 0xFFFFFFFE;
  **(_DWORD **)(a1 + 760) = (_DWORD)v7 << *(_DWORD *)(a1 + 812);
  v14 = B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchKey(
          a1 + 64,
          *(_DWORD *)(a1 + 768),
          a1 + 88);
  if( v14 != -1073741818 )
  {
    B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeIteratorFromSearchResult(
      a1 + 64,
      (__int64)&v49,
      a1 + 88);
    v15 = *((_QWORD *)&v49 + 1);
    v16 = v49;
    while( 1 )
    {
      if( v44 )
      {
        **(_DWORD **)(a1 + 760) = v50 << *(_DWORD *)(a1 + 812);
        v14 = B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchKey(
                (__int64)v13,
                *(_DWORD *)(a1 + 768),
                a1 + 88);
        if( v14 == -1073741818 )
          break;
        B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeIteratorCleanup(
          (__int64 *)&v49,
          v13);
        B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeIteratorFromSearchResult(
          (__int64)v13,
          (__int64)&v49,
          a1 + 88);
        v15 = *((_QWORD *)&v49 + 1);
        v16 = v49;
      }
      if( !v16 )
      {
LABEL_51:
        v14 = 0;
        break;
      }
      v15 += 4i64;
      v17 = (unsigned __int16)*(_DWORD *)v16 + 4i64;
      *((_QWORD *)&v49 + 1) = v15;
      if( v15 < v16 + 4 * v17 )
        goto LABEL_12;
      if( **(_DWORD **)((unsigned __int64)(v13 + 2) & -(__int64)(v13 != 0i64)) == -1 )
      {
        LeafSibling = *(struct B_TREE_NODE_HDR **)(v16 + 8);
      }
      else
      {
        LeafSibling = B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeFindLeafSibling(
                        (__int64)v13,
                        v16);
        if( LeafSibling == (struct B_TREE_NODE_HDR *)-1i64 )
          goto LABEL_13;
      }
      if( LeafSibling )
      {
        v15 = (unsigned __int64)LeafSibling + 16;
        *(_QWORD *)&v49 = LeafSibling;
        *((_QWORD *)&v49 + 1) = (char *)LeafSibling + 16;
        v16 = (__int64)LeafSibling;
LABEL_12:
        LeafSibling = (struct B_TREE_NODE_HDR *)v15;
      }
LABEL_13:
      if( LeafSibling == (struct B_TREE_NODE_HDR *)-1i64 )
        goto LABEL_66;
      if( !LeafSibling )
        goto LABEL_51;
      v19 = *(_DWORD *)LeafSibling;
      v20 = (unsigned int)(*(_DWORD *)(a1 + 464) * (*(_DWORD *)LeafSibling & *(_DWORD *)(a1 + 460)));
      v21 = v19 >> *(_DWORD *)(a1 + 456);
      _BitScanReverse((unsigned int *)&v22, v21);
      v48 = v19;
      v23 = *(_DWORD *)(a1 + 808);
      v24 = *(_QWORD *)(*(_QWORD *)(a1 + 8 * v22 + 192) + 16 * (v21 ^ (unsigned int)(1 << v22)));
      LODWORD(v22) = *(_DWORD *)(a1 + 812);
      v25 = (int *)(*(unsigned int *)(a1 + 472) + v20 + v24);
      v54 = v25;
      v26 = *v25 & v23;
      if( (unsigned int)*v25 >> v22 != v50 )
        goto LABEL_51;
      v27 = 4096;
      v28 = *(_DWORD *)(a1 + 824);
      v29 = v46;
      if( (v25[1] & 0xFFF) != 0 )
        v27 = v25[1] & 0xFFF;
      v47 = (unsigned int)(v27 + v28 + 15) >> 4;
      v30 = (-*(_DWORD *)(*(_QWORD *)(a1 + 1016) + 8i64) & (unsigned int)(v27
                                                                        + *(_DWORD *)(*(_QWORD *)(a1 + 1016) + 8i64)
                                                                        - 1))
          + v28;
      if( v46 == v50 || v47 + (*v52 & 0x1FFFu) <= *(_DWORD *)(a1 + 816) )
      {
        v31 = v51;
      }
      else
      {
        v10 = 0;
        v31 = v53;
        v29 = v50;
        v44 = 0;
        v52 = v55;
        v51 = v53;
        v43 = 0;
        v46 = v50;
      }
      if( v26 != v10 || v50 != v29 )
      {
        if( !v31 )
        {
          v14 = -1073741802;
          break;
        }
        memmove((UINT8 *)(v31 + (unsigned int)(16 * v10)), (UINT8 *)(v53 + (unsigned int)(16 * v26)), v30);
        ST_STORE::StDmPageRecordUnprotect(a1, (__int64)v25);
        v32 = a1 + 96;
        v33 = a1 + 96;
        v34 = *(_DWORD *)(a1 + 112);
        v35 = v10 | (v46 << *(_DWORD *)(a1 + 812));
        v45 = v35;
        if( v34 != -1 && v34 )
          v33 = *v11 + 16i64 * (unsigned int)(v34 - 1);
        if( *(_QWORD *)v33 == v16 )
        {
          *(_QWORD *)(v33 + 8) = v15;
        }
        else
        {
          B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultDeref(
            (__int64 *)(a1 + 64),
            a1 + 88);
          if( *(_DWORD *)(a1 + 112) == -1 )
          {
            *(_OWORD *)v33 = v49;
          }
          else
          {
            B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchKey(
              a1 + 64,
              *(_DWORD *)(v16 + 16),
              a1 + 88);
            v41 = *(_DWORD *)(a1 + 112);
            if( v41 != -1 && v41 )
              v32 = *v11 + 16i64 * (unsigned int)(v41 - 1);
            *(_QWORD *)(v32 + 8) = v15;
          }
          v35 = v45;
        }
        if( v44 )
        {
LABEL_27:
          v36 = v54;
          **(_DWORD **)(a1 + 760) = *v54;
          B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeChangeKey(
            (_DWORD *)(a1 + 64),
            a1 + 88,
            *(_DWORD *)(a1 + 768));
          B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeIteratorCleanup(
            (__int64 *)&v49,
            (__int64 *)(a1 + 64));
          v37 = v48;
          *v36 = v45;
          v48 = v37;
          result[0] = (INT64)&v61;
          v49 = 0i64;
          result[1] = 0i64;
          result[2] = 0i64;
          v60 = 0i64;
          v58 = 0;
          v59 = 8;
          v14 = B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeInsert(
                  (char **)(a1 + 64),
                  &v48,
                  (__int64)result);
          B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultCleanup(
            (__int64 *)(a1 + 64),
            (__int64)result,
            1);
          if( v14 < 0 )
          {
            *v36 = **(_DWORD **)(a1 + 760);
            B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeChangeKey(
              (_DWORD *)(a1 + 64),
              a1 + 88,
              v37);
            break;
          }
          v38 = B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeDelete(
                  a1 + 64,
                  *(_DWORD *)(a1 + 768),
                  a1 + 88);
          v14 = v38;
          if( v38 < 0 )
          {
            if( v38 == -1073741818 )
              break;
            __int2c();
          }
          v15 = *((_QWORD *)&v49 + 1);
          v16 = v49;
        }
        else
        {
          **(_DWORD **)(a1 + 760) = v35;
          v39 = B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeChangeKey(
                  (_DWORD *)(a1 + 64),
                  a1 + 88,
                  *(_DWORD *)(a1 + 768));
          if( !v39 )
          {
            v44 = 1;
            goto LABEL_27;
          }
          if( v39 == -1 )
          {
LABEL_66:
            v14 = -1073741818;
            break;
          }
          v40 = v48;
          *v54 = v45;
          B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeChangeKey(
            (_DWORD *)(a1 + 64),
            a1 + 88,
            v40);
        }
        if( v50 != v46 )
        {
          ST_STORE::StDmpUpdateRegionState(a1, v50, -v47, 1);
          ST_STORE::StDmpUpdateRegionState(a1, v46, v47, 0);
        }
        v10 = v43;
        v13 = (__int64 *)(a1 + 64);
      }
      v10 += v47;
      v43 = v10;
      if( a6 && (unsigned int)ST_STORE::StDmCheckForCompaction(a1, 0) != 2 )
      {
        v14 = -2147483634;
        break;
      }
    }
  }
  B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeIteratorCleanup(
    (__int64 *)&v49,
    v56);
  return(unsigned int)v14;
}

Referenced by:

No references.