ST_STORE::StDmPageRemove

__int64 __fastcall ST_STORE::StDmPageRemove(UINT64 CompressedSize, __int64 a2){
  __int64 v3; 
  __int64 v4; 
  int v5; 
  int v6; 
  int v7; 
  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; 
  VOID *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; 
  unsigned __int8 v35; 
  int v36; 
  bool v37; 
  __int64 v38; 
  _KLOCK_ENTRY *v39; 
  __int64 v40; 
  _DWORD *v41; 
  __int64 v42; 
  UINT64 v43; 
  _ETHREAD *CurrentThread; 
  __int64 SessionId; 
  unsigned __int8 v46; 
  int v47; 
  __int64 v48; 
  _KLOCK_ENTRY *v49; 
  __int64 v50; 
  UINT64 StoreId; 
  UINT64 v52; 
  int v53; 
  VOID *Chunk; 
  VOID *EtwRegHandle; 
  __int128 v56[5]; 
  int v57; 
  int v59; 
  UINT64 a3; 

  v56[0] = 0i64;
  EtwRegHandle = SmEtwEnabled(SmEtwKeywordStoreOps);
  v3 = CompressedSize + 24;
  v5 = *(_DWORD *)(v4 + 12) + *(_DWORD *)(v4 + 8) - 1;
  v6 = *(_DWORD *)(CompressedSize + 56);
  HIDWORD(v52) = 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 *)CompressedSize,
      CompressedSize + 24);
    v6 = *(_DWORD *)(CompressedSize + 56);
  }
  *(_DWORD *)(CompressedSize + 56) = v6 & 0xFFFFFFFE;
  v7 = *(_DWORD *)(CompressedSize + 120);
  if( (*(_BYTE *)(CompressedSize + 120) & 1) != 0 )
  {
    B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultDeref(
      (__int64 *)(CompressedSize + 64),
      CompressedSize + 88);
    v7 = *(_DWORD *)(CompressedSize + 120);
  }
  v57 = 0;
  *(_DWORD *)(CompressedSize + 120) = v7 & 0xFFFFFFFE;
  v8 = 0;
  v9 = 0;
LABEL_6:
  v59 = 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(
            CompressedSize,
            *(_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(
      CompressedSize,
      (__int64)v56,
      v3);
    v12 = *(struct B_TREE_NODE_HDR **)&v56[0];
    if( !*(_QWORD *)&v56[0] )
      goto LABEL_33;
    v13 = *((_QWORD *)&v56[0] + 1) + 8i64;
    v14 = (unsigned __int16)**(_DWORD **)&v56[0] + 2i64;
    *((_QWORD *)&v56[0] + 1) = v13;
    if( v13 < *(_QWORD *)&v56[0] + 8 * v14 )
      goto LABEL_10;
    v11 = CompressedSize + 16;
    if( **(_DWORD **)((CompressedSize + 16) & -(__int64)(CompressedSize != 0)) == -1 )
    {
      LeafSibling = *(struct B_TREE_NODE_HDR **)(*(_QWORD *)&v56[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(
                      CompressedSize,
                      *(__int64 *)&v56[0]);
      v11 = -1i64;
      if( LeafSibling == (struct B_TREE_NODE_HDR *)-1i64 )
      {
        v15 = -1i64;
        goto LABEL_11;
      }
    }
    if( LeafSibling )
    {
      v13 = (unsigned __int64)LeafSibling + 16;
      *(_QWORD *)&v56[0] = LeafSibling;
      *((_QWORD *)&v56[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 = v57;
      goto LABEL_33;
    }
    v16 = *(_DWORD *)v15;
    if( HIDWORD(v52) < *(_DWORD *)v15 )
    {
      v8 = v57;
LABEL_33:
      if( v8 )
      {
        v42 = *(_QWORD *)(CompressedSize + 800);
        if( (*(_BYTE *)(v42 + 6021) & 4) != 0 )
        {
          v43 = v42 + 6024;
          if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v43, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
            ExfTryToWakePushLock((_EX_PUSH_LOCK *)v43);
          LODWORD(v52) = 0;
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          if( MiGetSystemRegionType(v43) == 1 )
            SessionId = (unsigned int)MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
          else
            SessionId = 0xFFFFFFFFi64;
          --CurrentThread->Tcb.SpecialApcDisable;
          v46 = ++CurrentThread->Tcb.AbAllocationRegionCount;
          v47 = ((char)CurrentThread->Tcb.AbEntrySummary | (char)CurrentThread->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
          while( 1 )
          {
            v37 = !_BitScanReverse((unsigned int *)&v48, v47);
            if( v37 )
              goto LABEL_107;
            v49 = &CurrentThread->Tcb.LockEntries[v48];
            v47 &= ~(1 << v48);
            if( (v49->AcquiredByte & 1) != 0
              && (v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
              && (v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (v43 & 0x7FFFFFFFFFFFFFFCi64)
              && v49->LockState.SessionId == (_DWORD)SessionId )
            {
              v49->AcquiredByte &= ~1u;
              if( v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
                break;
            }
          }
          if( !v49 )
          {
LABEL_107:
            if( (*(&CurrentThread->Tcb.MiscFlags + 1) & 0x10000) == 0 )
              KeBugCheckEx(0x162u, CurrentThread, (PVOID)v43, (PVOID)SessionId, 0i64);
            goto LABEL_119;
          }
          v49->CrossThreadReleasableAndBusyByte |= 2u;
          if( v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
            KiAbEntryRemoveFromTree(v49);
          LODWORD(v52) = v49->BoostBitmap.AllFields & 0x1FFFF;
          v49->BoostBitmap.AllFields &= 0xFFFE0000;
          v49->ThreadLocalFlags &= ~1u;
          v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
          v50 = v49 - CurrentThread->Tcb.LockEntries;
          if( v46 == 1 )
            CurrentThread->Tcb.AbEntrySummary |= 1 << v50;
          else
            _InterlockedOr8((volatile signed __int8 *)&CurrentThread->Tcb.AbOrphanedEntrySummary, 1 << v50);
LABEL_119:
          --CurrentThread->Tcb.AbAllocationRegionCount;
          KiAbThreadRemoveBoosts(&CurrentThread->Tcb, (VOID *)v43, &v52);
          v37 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
          if( v37
            && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
          {
            KiCheckForKernelApcDelivery();
          }
          KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
        }
        SMKM_STORE_MGR::SmEvictKeys(v11, &v59, v8);
        SMKM_STORE::SmStAcquireStoreLockExclusive(*(_QWORD *)(CompressedSize + 800));
      }
      if( !*(_BYTE *)(CompressedSize + 776) && (*(_BYTE *)(CompressedSize + 1904) & 3) != 3 )
      {
        v27 = ST_STORE::StDmCheckForCompaction(CompressedSize, 0);
        if( v27 )
          ST_STORE::StQueueCompaction(CompressedSize, v27);
      }
      v10 = 0;
      break;
    }
    v17 = ST_STORE::StDmCombinePageEntry(CompressedSize, v15);
    v53 = *(_DWORD *)(v15 + 4);
    Chunk = v17;
    ST_STORE::StDmPageRecordUnprotect(CompressedSize, (INT64)v17);
    if( EtwRegHandle )
    {
      LODWORD(StoreId) = *(_DWORD *)Chunk;
      SmEtwLogStoreOp(EtwRegHandle, 1ui64, (VOID *)v15, (UINT64)EtwRegHandle, StoreId, CompressedSize, 0, 0);
    }
    v18 = *(_DWORD *)(v3 + 24);
    v19 = v3 + 8;
    v20 = v3 + 8;
    if( v18 == -1 || !v18 )
    {
      v21 = CompressedSize + 24;
    }
    else
    {
      v26 = 16i64 * (unsigned int)(v18 - 1);
      v21 = CompressedSize + 24;
      v20 = *(_QWORD *)(CompressedSize + 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 *)CompressedSize,
        v21);
      if( *(_DWORD *)(CompressedSize + 48) != -1 )
      {
        v3 = CompressedSize + 24;
        B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
          CompressedSize,
          *((_DWORD *)v12 + 4),
          CompressedSize + 24);
        v30 = *(_DWORD *)(CompressedSize + 48);
        if( v30 != -1 && v30 )
          v19 = *(_QWORD *)v3 + 16i64 * (unsigned int)(v30 - 1);
        *(_QWORD *)(v19 + 8) = v13;
        goto LABEL_21;
      }
      *(_OWORD *)v20 = v56[0];
    }
    v3 = CompressedSize + 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 *)v56,
      (__int64 *)CompressedSize);
    v56[0] = 0i64;
    v22 = B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeDeleteEx(
            CompressedSize,
            v3);
    v10 = v22;
    if( v22 < 0 )
    {
      if( v22 != -1073741818 )
        __int2c();
      break;
    }
    v23 = Chunk;
    if( !*(_BYTE *)(CompressedSize + 776) )
    {
      v24 = *((_DWORD *)Chunk + 1);
      if( !(v24 >> 12) )
        __int2c();
      v8 = v57;
      *((_DWORD *)Chunk + 1) = 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(
            CompressedSize + 64,
            v53,
            CompressedSize + 88);
    if( v10 < 0 )
    {
      if( v10 == -1073741818 )
        goto LABEL_59;
      if( v10 != -1073741275 || (v8 = v57, **(int **)(CompressedSize + 1920) < 2) )
      {
        __int2c();
LABEL_59:
        if( v10 != -1073741275 )
          break;
        v8 = v57;
      }
    }
    else
    {
      v10 = ST_STORE::StDmPageRecordRemove(CompressedSize, (unsigned __int64)v23, CompressedSize + 88);
      if( v10 < 0 )
        break;
      SmHpChunkFree((_SMHP_CHUNK_HEAP *)(CompressedSize + 192), v23);
      v25 = a2;
      v8 = v57;
      if( (*(_DWORD *)(a2 + 16) & 1) != 0 )
      {
        if( v57 && v16 - v9 != v57 )
        {
          v31 = *(_QWORD *)(CompressedSize + 800);
          if( (*(_BYTE *)(v31 + 6021) & 4) != 0 )
          {
            v32 = v31 + 6024;
            if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v32, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
              ExfTryToWakePushLock((_EX_PUSH_LOCK *)v32);
            LODWORD(a3) = 0;
            v33 = (_ETHREAD *)KeGetCurrentThread();
            if( MiGetSystemRegionType(v32) == 1 )
              v34 = MmGetSessionIdEx(v33->Tcb.ApcState.Process);
            else
              v34 = -1;
            --v33->Tcb.SpecialApcDisable;
            v35 = ++v33->Tcb.AbAllocationRegionCount;
            v36 = ((char)v33->Tcb.AbEntrySummary | (char)v33->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
            while( 1 )
            {
              v37 = !_BitScanReverse((unsigned int *)&v38, v36);
              if( v37 )
                break;
              v39 = &v33->Tcb.LockEntries[v38];
              v36 &= ~(1 << v38);
              if( (v39->AcquiredByte & 1) != 0
                && (v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
                && (v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (v32 & 0x7FFFFFFFFFFFFFFCi64)
                && v39->LockState.SessionId == v34 )
              {
                v39->AcquiredByte &= ~1u;
                if( v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
                {
                  if( v39 )
                  {
                    v39->CrossThreadReleasableAndBusyByte |= 2u;
                    if( v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
                      KiAbEntryRemoveFromTree(v39);
                    LODWORD(a3) = 0;
                    LODWORD(a3) = v39->BoostBitmap.AllFields & 0x1FFFF;
                    v39->BoostBitmap.AllFields &= 0xFFFE0000;
                    v39->ThreadLocalFlags &= ~1u;
                    v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
                    v40 = v39 - v33->Tcb.LockEntries;
                    if( v35 == 1 )
                      v33->Tcb.AbEntrySummary |= 1 << v40;
                    else
                      _InterlockedOr8((volatile signed __int8 *)&v33->Tcb.AbOrphanedEntrySummary, 1 << v40);
                    goto LABEL_81;
                  }
                  break;
                }
              }
            }
            if( (*(&v33->Tcb.MiscFlags + 1) & 0x10000) == 0 )
              KeBugCheckEx(0x162u, v33, (PVOID)v32, (PVOID)v34, 0i64);
LABEL_81:
            --v33->Tcb.AbAllocationRegionCount;
            KiAbThreadRemoveBoosts(&v33->Tcb, (VOID *)v32, &a3);
            v37 = v33->Tcb.SpecialApcDisable++ == -1;
            if( v37 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v33->Tcb.ApcState.ApcListHead[0].Flink != &v33->Tcb.152 )
              KiCheckForKernelApcDelivery();
            KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
          }
          SMKM_STORE_MGR::SmEvictKeys(v25, &v59, v57);
          SMKM_STORE::SmStAcquireStoreLockExclusive(*(_QWORD *)(CompressedSize + 800));
          v9 = v59;
          v3 = CompressedSize + 24;
          v8 = 0;
          v57 = 0;
        }
        v41 = *(_DWORD **)(CompressedSize + 1920);
        if( !*v41 || *v41 == 3 && v16 < v41[1] )
        {
          if( !v8 )
            v9 = v16;
          v57 = ++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 *)v56,
    (__int64 *)CompressedSize);
  return(unsigned int)v10;
}

Referenced by:

No references.