MiAttemptPageFileReductionApc

VOID __stdcall MiAttemptPageFileReductionApc(PVOID NormalContext, PVOID SystemArgument1, PVOID SystemArgument2){
  unsigned int v3; 
  _MI_PARTITION *v4; 
  unsigned int v5; 
  unsigned __int64 v6; 
  int v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  char *v12; 
  __int64 v13; 
  INT64 v14; 
  __int16 v15; 
  KIRQL v16; 
  __int64 v17; 
  int v18; 
  unsigned __int64 v19; 
  RTL_BITMAP *v20; 
  const signed __int32 *v21; 
  unsigned int v22; 
  const signed __int32 *v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  unsigned int v26; 
  ULONG LastBackwardRunClear; 
  ULONG v28; 
  int v29; 
  unsigned __int64 v30; 
  UINT64 v31; 
  INT64 *v32; 
  __int64 v33; 
  __int64 v34; 
  unsigned __int64 v35; 
  __int64 v36; 
  unsigned __int64 v37; 
  UINT64 v38; 
  KIRQL v39; 
  __int64 v40; 
  unsigned __int64 v41; 
  RTL_BITMAP *v42; 
  unsigned __int64 v43; 
  unsigned int v44; 
  char *v45; 
  ULONG StartingRunIndex; 
  ULONG v47; 
  _MI_PARTITION *Partition; 
  PRTL_BITMAP v49; 
  __int64 v50; 
  __int64 v51; 
  INT64 *v52; 
  PRTL_BITMAP v53; 
  struct _RTL_BITMAP BitMapHeader; 
  struct _RTL_BITMAP v55; 
  PRKEVENT Event; 
  int v57; 
  Event = (PRKEVENT)NormalContext;
  StartingRunIndex = 0;
  v47 = 0;
  v3 = *((_DWORD *)NormalContext + 8);
  v4 = (_MI_PARTITION *)*((_QWORD *)NormalContext + 3);
  BitMapHeader = 0i64;
  v55 = 0i64;
  if( v3 >= 0x10 )
  {
    if( !(unsigned int)MiOkToShrinkPageFiles(*((_QWORD *)v4 + 933), *((_QWORD *)v4 + 949)) )
      goto LABEL_46;
    v5 = *((_DWORD *)v4 + 1734);
    v7 = 1;
    v50 = 0x8000i64;
    v6 = 0x4000i64;
    v11 = (((v10 * (unsigned __int128)0xCCCCCCCCCCCCCCCDui64) >> 64) & 0xFFFFFFFFFFFFFFF8ui64) - v9;
    NormalContext = Event;
    v8 = v11 - 0x8000;
    v3 = 0;
  }
  else
  {
    v50 = 0i64;
    v5 = v3 + 1;
    v6 = *((unsigned int *)NormalContext + 9);
    v7 = 0;
    v8 = 0x7FFFFFFFFFFFFFFFi64;
  }
  v44 = v5;
  v57 = v7;
  v43 = v6;
  if( v3 < v5 )
  {
    v12 = (char *)NormalContext + 4 * v3 + 40;
    v13 = 8i64 * v3 + 6944;
    v45 = v12;
    v51 = v13;
    while( 1 )
    {
      if( v6 > v8 )
        goto LABEL_46;
      v14 = *(_QWORD *)((char *)v4 + v13);
      v15 = *(_WORD *)(v14 + 204);
      if( ((v15 & 0x10) == 0 || !v7)
        && (v15 & 0x40) == 0
        && *(_QWORD *)v14 != *(_QWORD *)(v14 + 16)
        && *(_QWORD *)(v14 + 24) >= v6 )
      {
        break;
      }
LABEL_41:
      v12 += 4;
      v13 = v51 + 8;
      v45 = v12;
      ++v3;
      v51 += 8i64;
      if( v3 >= v44 )
        goto LABEL_46;
      v7 = v57;
    }
    v4 = *(_MI_PARTITION **)(v14 + 248);
    Partition = v4;
    v52 = (INT64 *)(v14 + 232);
    v16 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v14 + 232));
    v17 = *(_QWORD *)(v14 + 112);
    v18 = *(_DWORD *)v14;
    v19 = v16;
    v20 = (RTL_BITMAP *)(v17 + 8);
    v21 = *(const signed __int32 **)(v17 + 16);
    v22 = *(_DWORD *)v14 - 1;
    v49 = (PRTL_BITMAP)(v17 + 8);
    v53 = (PRTL_BITMAP)(v17 + 24);
    if( _bittest(v21, v22) == 1 || (v23 = *(const signed __int32 **)(v17 + 32), _bittest(v23, v22) == 1) )
    {
      v30 = v43;
      v31 = 0i64;
      v29 = v57;
    }
    else
    {
      v24 = *(_QWORD *)v14 - *(_QWORD *)(v14 + 16);
      if( v8 <= v24 )
        v24 = v8;
      v25 = (*(_QWORD *)v14 - v24) & 0xFFFFFFFFFFFFFFE0ui64;
      v26 = v18 - v25;
      v25 >>= 5;
      BitMapHeader.SizeOfBitMap = v26;
      v55.SizeOfBitMap = v26;
      BitMapHeader.Buffer = (unsigned int *)&v21[v25];
      v55.Buffer = (unsigned int *)&v23[v25];
      LastBackwardRunClear = RtlFindLastBackwardRunClear(&BitMapHeader, v26 - 1, &StartingRunIndex);
      if( LastBackwardRunClear <= v24 )
        v24 = LastBackwardRunClear;
      v28 = RtlFindLastBackwardRunClear(&v55, v26 - 1, &v47);
      v29 = v57;
      v30 = v43;
      v20 = v49;
      v31 = v28;
      if( v24 <= v28 )
        v31 = v24;
      v4 = Partition;
      if( !v57 )
        v31 &= ~(v43 - 1);
    }
    if( v31 )
    {
      v33 = *(_QWORD *)v14;
      v34 = *(_QWORD *)(v14 + 240);
      v35 = *(_QWORD *)v14 - v31;
      if( !v34 )
        goto LABEL_36;
      do
      {
        v36 = v34;
        v34 = *(_QWORD *)(v34 + 8);
      }
      while( v34 );
      v37 = *(_QWORD *)(v36 - 8);
      if( !v37 || v35 > v37 )
        goto LABEL_36;
      v35 = v37 + 1;
      if( v37 + 1 >= v37 )
      {
        v31 = v33 - v35;
        if( !v29 )
        {
          v31 &= ~(v30 - 1);
          v35 = v33 - v31;
        }
        if( v31 )
        {
LABEL_36:
          *(_QWORD *)(v14 + 24) -= v31;
          *(_QWORD *)(v14 + 48) -= v31;
          *(_QWORD *)v14 = v35;
          RtlSetBits(v20, (unsigned int)v35, (unsigned int)v31);
          RtlSetBits(v53, (unsigned int)v35, (unsigned int)v31);
          MiInvalidatePageFileBitmapsCache(v14, (unsigned int)v35, (unsigned int)v31, 0i64);
          ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v14 + 232));
          __writecr8(v19);
          v8 -= v31;
          if( (*(_BYTE *)(v14 + 204) & 0x10) == 0 )
          {
            v38 = v31 + v50;
            if( !(unsigned int)MiChargeCommit(v4, v31 + v50, 2ui64) )
            {
              v39 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v14 + 232));
              v40 = *(_QWORD *)(v14 + 112);
              *(_QWORD *)(v14 + 24) += v31;
              *(_QWORD *)(v14 + 48) += v31;
              *(_QWORD *)v14 = v31 + v35;
              v41 = v39;
              v42 = (RTL_BITMAP *)(v40 + 24);
              RtlClearBits((RTL_BITMAP *)(v40 + 8), (unsigned int)v35, (unsigned int)v31);
              RtlClearBits(v42, (unsigned int)v35, (unsigned int)v31);
              if( v35 < *(unsigned int *)(v14 + 120) )
                *(_DWORD *)(v14 + 120) = v35;
              MiCoalescePageFileBitmapsCache(v14, 0i64, (unsigned int)v35);
              ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v14 + 232));
              __writecr8(v41);
              goto LABEL_46;
            }
            MiReduceCommitLimits(v4, v31, 0i64);
            MiReturnCommit(v4, v38);
          }
          v12 = v45;
          *(_DWORD *)v45 = v35;
          goto LABEL_40;
        }
      }
      v32 = v52;
    }
    else
    {
      v32 = (INT64 *)(v14 + 232);
    }
    ExReleaseSpinLockExclusiveFromDpcLevel(v32);
    __writecr8(v19);
    v12 = v45;
LABEL_40:
    v6 = v43;
    goto LABEL_41;
  }
LABEL_46:
  KeSetEvent(Event, 0);
}

Referenced by:

No references.