ST_STORE::StDmPageRemove

__int64 __fastcall ST_STORE::StDmPageRemove(__int64 a1, __int64 a2){
  __int64 v3; 
  __int64 v4; 
  int v5; 
  int v6; 
  int v7; 
  unsigned int v8; 
  int v9; 
  int v10; 
  __int64 v11; 
  struct B_TREE_NODE_HDR *v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned int v16; 
  _DWORD *v17; 
  int v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  int v22; 
  unsigned __int64 v23; 
  unsigned int v24; 
  __int64 v25; 
  __int64 v26; 
  int v27; 
  struct B_TREE_NODE_HDR *LeafSibling; 
  int v30; 
  __int64 v31; 
  UINT64 v32; 
  _ETHREAD *v33; 
  unsigned int v34; 
  char v35; 
  int v36; 
  bool v37; 
  __int64 v38; 
  unsigned __int64 v39; 
  __int64 v40; 
  _DWORD *v41; 
  __int64 v42; 
  UINT64 v43; 
  _ETHREAD *CurrentThread; 
  ULONG_PTR SessionId; 
  char v46; 
  int v47; 
  __int64 v48; 
  unsigned __int64 v49; 
  __int64 v50; 
  ULONG_PTR BugCheckParameter4; 
  int v52; 
  unsigned int v53; 
  int v54; 
  UINT64 a2a; 
  PVOID EtwRegHandle; 
  __int128 v57[5]; 
  unsigned int v58; 
  int v60; 
  int v61; 
  v57[0] = 0i64;
  EtwRegHandle = SmEtwEnabled(0i64);
  v3 = a1 + 24;
  v5 = *(_DWORD *)(v4 + 12) + *(_DWORD *)(v4 + 8) - 1;
  v6 = *(_DWORD *)(a1 + 56);
  v53 = v5;
  if( (v6 & 1) != 0 )
  {
    B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchResultDeref(
      (__int64 *)a1,
      a1 + 24);
    v6 = *(_DWORD *)(a1 + 56);
  }
  *(_DWORD *)(a1 + 56) = v6 & 0xFFFFFFFE;
  v7 = *(_DWORD *)(a1 + 120);
  if( (*(_BYTE *)(a1 + 120) & 1) != 0 )
  {
    B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultDeref(
      (__int64 *)(a1 + 64),
      a1 + 88);
    v7 = *(_DWORD *)(a1 + 120);
  }
  v58 = 0;
  *(_DWORD *)(a1 + 120) = v7 & 0xFFFFFFFE;
  v8 = 0;
  v9 = 0;
LABEL_6:
  v60 = v9;
  while( 1 )
  {
    v10 = B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
            a1,
            *(_DWORD *)(a2 + 8),
            v3);
    if( v10 == -1073741818 )
      break;
    B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeIteratorFromSearchResult(
      a1,
      (__int64)v57,
      v3);
    v12 = *(struct B_TREE_NODE_HDR **)&v57[0];
    if( !*(_QWORD *)&v57[0] )
      goto LABEL_33;
    v13 = *((_QWORD *)&v57[0] + 1) + 8i64;
    v14 = (unsigned __int16)**(_DWORD **)&v57[0] + 2i64;
    *((_QWORD *)&v57[0] + 1) = v13;
    if( v13 < *(_QWORD *)&v57[0] + 8 * v14 )
      goto LABEL_10;
    v11 = a1 + 16;
    if( **(_DWORD **)((a1 + 16) & -(__int64)(a1 != 0)) == -1 )
    {
      LeafSibling = *(struct B_TREE_NODE_HDR **)(*(_QWORD *)&v57[0] + 8i64);
    }
    else
    {
      LeafSibling = B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeFindLeafSibling(
                      a1,
                      *(__int64 *)&v57[0]);
      v11 = -1i64;
      if( LeafSibling == (struct B_TREE_NODE_HDR *)-1i64 )
      {
        v15 = -1i64;
        goto LABEL_11;
      }
    }
    if( LeafSibling )
    {
      v13 = (unsigned __int64)LeafSibling + 16;
      *(_QWORD *)&v57[0] = LeafSibling;
      *((_QWORD *)&v57[0] + 1) = (char *)LeafSibling + 16;
      v12 = LeafSibling;
LABEL_10:
      v15 = v13;
      goto LABEL_11;
    }
    v15 = 0i64;
LABEL_11:
    if( v15 == -1 )
    {
      v10 = -1073741818;
      break;
    }
    if( !v15 )
    {
      v8 = v58;
      goto LABEL_33;
    }
    v16 = *(_DWORD *)v15;
    if( v53 < *(_DWORD *)v15 )
    {
      v8 = v58;
LABEL_33:
      if( v8 )
      {
        v42 = *(_QWORD *)(a1 + 800);
        if( (*(_BYTE *)(v42 + 6021) & 4) != 0 )
        {
          v43 = v42 + 6024;
          if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v43, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
            ExfTryToWakePushLock((volatile INT64 *)v43);
          v52 = 0;
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          if( (unsigned int)MiGetSystemRegionType(v43) == 1 )
            SessionId = (unsigned int)MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
          else
            SessionId = 0xFFFFFFFFi64;
          --*((_WORD *)CurrentThread + 243);
          v46 = ++*((_BYTE *)CurrentThread + 794);
          v47 = (*((char *)CurrentThread + 792) | *((char *)CurrentThread + 870)) ^ 0x3F;
          while( 1 )
          {
            v37 = !_BitScanReverse((unsigned int *)&v48, v47);
            if( v37 )
              goto LABEL_107;
            v49 = *((_QWORD *)CurrentThread + 100) + 96 * v48;
            v47 &= ~(1 << v48);
            if( (*(_BYTE *)(v49 + 26) & 1) != 0
              && (*(_DWORD *)(v49 + 32) & 1) == 0
              && (*(_QWORD *)(v49 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v43 & 0x7FFFFFFFFFFFFFFCi64)
              && *(_DWORD *)(v49 + 40) == (_DWORD)SessionId )
            {
              *(_BYTE *)(v49 + 26) &= ~1u;
              if( *(_QWORD *)(v49 + 32) )
                break;
            }
          }
          if( !v49 )
          {
LABEL_107:
            if( (*((_DWORD *)CurrentThread + 30) & 0x10000) == 0 )
              KeBugCheckEx(0x162u, (ULONG_PTR)CurrentThread, v43, SessionId, 0i64);
            goto LABEL_119;
          }
          *(_BYTE *)(v49 + 32) |= 2u;
          if( *(__int64 *)(v49 + 32) < 0 )
            KiAbEntryRemoveFromTree(v49);
          v52 = *(_DWORD *)(v49 + 88) & 0x1FFFF;
          *(_DWORD *)(v49 + 88) &= 0xFFFE0000;
          *(_BYTE *)(v49 + 25) &= ~1u;
          *(_QWORD *)(v49 + 32) = 0i64;
          v50 = (__int64)(v49 - *((_QWORD *)CurrentThread + 100)) / 96;
          if( v46 == 1 )
            *((_BYTE *)CurrentThread + 792) |= 1 << v50;
          else
            _InterlockedOr8((volatile signed __int8 *)CurrentThread + 870, 1 << v50);
LABEL_119:
          --*((_BYTE *)CurrentThread + 794);
          KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, v43, (unsigned int *)&v52);
          v37 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
          if( v37 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
            KiCheckForKernelApcDelivery();
          KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
        }
        SMKM_STORE_MGR::SmEvictKeys(v11, &v60, v8);
        SMKM_STORE::SmStAcquireStoreLockExclusive(*(_QWORD *)(a1 + 800));
      }
      if( !*(_BYTE *)(a1 + 776) && (*(_BYTE *)(a1 + 1904) & 3) != 3 )
      {
        v27 = ST_STORE::StDmCheckForCompaction(a1, 0);
        if( v27 )
          ST_STORE::StQueueCompaction(a1, v27);
      }
      v10 = 0;
      break;
    }
    v17 = ST_STORE::StDmCombinePageEntry(a1, v15);
    v54 = *(_DWORD *)(v15 + 4);
    a2a = (UINT64)v17;
    ST_STORE::StDmPageRecordUnprotect(a1, (__int64)v17);
    if( EtwRegHandle )
    {
      LODWORD(BugCheckParameter4) = *(_DWORD *)a2a;
      SmEtwLogStoreOp(EtwRegHandle, 1ui64, (PVOID)v15, (UINT64)EtwRegHandle, BugCheckParameter4, a1, 0, 0);
    }
    v18 = *(_DWORD *)(v3 + 24);
    v19 = v3 + 8;
    v20 = v3 + 8;
    if( v18 == -1 || !v18 )
    {
      v21 = a1 + 24;
    }
    else
    {
      v26 = 16i64 * (unsigned int)(v18 - 1);
      v21 = a1 + 24;
      v20 = *(_QWORD *)(a1 + 24) + v26;
    }
    if( *(struct B_TREE_NODE_HDR **)v20 == v12 )
    {
      *(_QWORD *)(v20 + 8) = v13;
    }
    else
    {
      B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchResultDeref(
        (__int64 *)a1,
        v21);
      if( *(_DWORD *)(a1 + 48) != -1 )
      {
        v3 = a1 + 24;
        B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
          a1,
          *((_DWORD *)v12 + 4),
          a1 + 24);
        v30 = *(_DWORD *)(a1 + 48);
        if( v30 != -1 && v30 )
          v19 = *(_QWORD *)v3 + 16i64 * (unsigned int)(v30 - 1);
        *(_QWORD *)(v19 + 8) = v13;
        goto LABEL_21;
      }
      *(_OWORD *)v20 = v57[0];
    }
    v3 = a1 + 24;
LABEL_21:
    B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeIteratorCleanup(
      (__int64 *)v57,
      (__int64 *)a1);
    v57[0] = 0i64;
    v22 = B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeDeleteEx(
            a1,
            v3);
    v10 = v22;
    if( v22 < 0 )
    {
      if( v22 != -1073741818 )
        __int2c();
      break;
    }
    v23 = a2a;
    if( !*(_BYTE *)(a1 + 776) )
    {
      v24 = *(_DWORD *)(a2a + 4);
      if( !(v24 >> 12) )
        __int2c();
      v8 = v58;
      *(_DWORD *)(a2a + 4) = v24 & 0xFFF | (((v24 >> 12) - 1) << 12);
      if( ((v24 >> 12) - 1) << 12 )
        continue;
    }
    v10 = B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchKey(
            a1 + 64,
            v54,
            a1 + 88);
    if( v10 < 0 )
    {
      if( v10 == -1073741818 )
        goto LABEL_59;
      if( v10 != -1073741275 || (v8 = v58, **(int **)(a1 + 1920) < 2) )
      {
        __int2c();
LABEL_59:
        if( v10 != -1073741275 )
          break;
        v8 = v58;
      }
    }
    else
    {
      v10 = ST_STORE::StDmPageRecordRemove(a1, v23, a1 + 88);
      if( v10 < 0 )
        break;
      SmHpChunkFree((_DWORD *)(a1 + 192), v23);
      v25 = a2;
      v8 = v58;
      if( (*(_DWORD *)(a2 + 16) & 1) != 0 )
      {
        if( v58 && v16 - v9 != v58 )
        {
          v31 = *(_QWORD *)(a1 + 800);
          if( (*(_BYTE *)(v31 + 6021) & 4) != 0 )
          {
            v32 = v31 + 6024;
            if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v32, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
              ExfTryToWakePushLock((volatile INT64 *)v32);
            v61 = 0;
            v33 = (_ETHREAD *)KeGetCurrentThread();
            if( (unsigned int)MiGetSystemRegionType(v32) == 1 )
              v34 = MmGetSessionIdEx(*((_QWORD *)v33 + 23));
            else
              v34 = -1;
            --*((_WORD *)v33 + 243);
            v35 = ++*((_BYTE *)v33 + 794);
            v36 = (*((char *)v33 + 792) | *((char *)v33 + 870)) ^ 0x3F;
            while( 1 )
            {
              v37 = !_BitScanReverse((unsigned int *)&v38, v36);
              if( v37 )
                break;
              v39 = *((_QWORD *)v33 + 100) + 96 * v38;
              v36 &= ~(1 << v38);
              if( (*(_BYTE *)(v39 + 26) & 1) != 0
                && (*(_DWORD *)(v39 + 32) & 1) == 0
                && (*(_QWORD *)(v39 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v32 & 0x7FFFFFFFFFFFFFFCi64)
                && *(_DWORD *)(v39 + 40) == v34 )
              {
                *(_BYTE *)(v39 + 26) &= ~1u;
                if( *(_QWORD *)(v39 + 32) )
                {
                  if( v39 )
                  {
                    *(_BYTE *)(v39 + 32) |= 2u;
                    if( *(__int64 *)(v39 + 32) < 0 )
                      KiAbEntryRemoveFromTree(v39);
                    v61 = 0;
                    v61 = *(_DWORD *)(v39 + 88) & 0x1FFFF;
                    *(_DWORD *)(v39 + 88) &= 0xFFFE0000;
                    *(_BYTE *)(v39 + 25) &= ~1u;
                    *(_QWORD *)(v39 + 32) = 0i64;
                    v40 = (__int64)(v39 - *((_QWORD *)v33 + 100)) / 96;
                    if( v35 == 1 )
                      *((_BYTE *)v33 + 792) |= 1 << v40;
                    else
                      _InterlockedOr8((volatile signed __int8 *)v33 + 870, 1 << v40);
                    goto LABEL_81;
                  }
                  break;
                }
              }
            }
            if( (*((_DWORD *)v33 + 30) & 0x10000) == 0 )
              KeBugCheckEx(0x162u, (ULONG_PTR)v33, v32, v34, 0i64);
LABEL_81:
            --*((_BYTE *)v33 + 794);
            KiAbThreadRemoveBoosts((ULONG_PTR)v33, v32, (unsigned int *)&v61);
            v37 = (*((_WORD *)v33 + 243))++ == 0xFFFF;
            if( v37 && *((_ETHREAD **)v33 + 19) != (_ETHREAD *)((char *)v33 + 152) )
              KiCheckForKernelApcDelivery();
            KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
          }
          SMKM_STORE_MGR::SmEvictKeys(v25, &v60, v58);
          SMKM_STORE::SmStAcquireStoreLockExclusive(*(_QWORD *)(a1 + 800));
          v9 = v60;
          v3 = a1 + 24;
          v8 = 0;
          v58 = 0;
        }
        v41 = *(_DWORD **)(a1 + 1920);
        if( !*v41 || *v41 == 3 && v16 < v41[1] )
        {
          if( !v8 )
            v9 = v16;
          v58 = ++v8;
          goto LABEL_6;
        }
      }
    }
  }
  B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeIteratorCleanup(
    (__int64 *)v57,
    (__int64 *)a1);
  return(unsigned int)v10;
}

Referenced by:

No references.