MiAttemptPageFileReductionApc

VOID __stdcall MiAttemptPageFileReductionApc(VOID *NormalContext, VOID *SystemArgument1, VOID *SystemArgument2){
  unsigned int v3; 
  _MI_PARTITION *v4; 
  unsigned int NumberOfPagingFiles; 
  unsigned __int64 v6; 
  int v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  char *v12; 
  __int64 v13; 
  int *v14; 
  __int16 v15; 
  unsigned __int8 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; 
  unsigned int LastBackwardRunClear; 
  unsigned int v28; 
  int v29; 
  unsigned __int64 v30; 
  UINT64 v31; 
  INT64 *v32; 
  __int64 v33; 
  __int64 v34; 
  unsigned __int64 v35; 
  __int64 v36; 
  unsigned __int64 v37; 
  UINT64 v38; 
  unsigned __int8 v39; 
  __int64 v40; 
  unsigned __int64 v41; 
  _RTL_BITMAP *v42; 
  unsigned __int64 v43; 
  unsigned int v44; 
  char *v45; 
  UINT64 StartingRunIndex; 
  _MI_PARTITION *Partition; 
  _RTL_BITMAP *v48; 
  __int64 v49; 
  __int64 v50; 
  INT64 *v51; 
  _RTL_BITMAP *v52; 
  _RTL_BITMAP BitMapHeader; 
  _RTL_BITMAP v54; 
  _KEVENT *Event; 
  int v56; 

  Event = (_KEVENT *)NormalContext;
  StartingRunIndex = 0i64;
  v3 = *((_DWORD *)NormalContext + 8);
  v4 = (_MI_PARTITION *)*((_QWORD *)NormalContext + 3);
  BitMapHeader = 0i64;
  v54 = 0i64;
  if( v3 >= 0x10 )
  {
    if( !MiOkToShrinkPageFiles(v4->Vp.TotalCommittedPages, v4->Vp.TotalCommitLimit) )
      goto LABEL_46;
    NumberOfPagingFiles = v4->Vp.NumberOfPagingFiles;
    v7 = 1;
    v49 = 0x8000i64;
    v6 = 0x4000i64;
    v11 = (((v10 * (unsigned __int128)0xCCCCCCCCCCCCCCCDui64) >> 64) & 0xFFFFFFFFFFFFFFF8ui64) - v9;
    NormalContext = Event;
    v8 = v11 - 0x8000;
    v3 = 0;
  }
  else
  {
    v49 = 0i64;
    NumberOfPagingFiles = v3 + 1;
    v6 = *((unsigned int *)NormalContext + 9);
    v7 = 0;
    v8 = 0x7FFFFFFFFFFFFFFFi64;
  }
  v44 = NumberOfPagingFiles;
  v56 = v7;
  v43 = v6;
  if( v3 < NumberOfPagingFiles )
  {
    v12 = (char *)NormalContext + 4 * v3 + 40;
    v13 = 8i64 * v3 + 6944;
    v45 = v12;
    v50 = v13;
    while( 1 )
    {
      if( v6 > v8 )
        goto LABEL_46;
      v14 = *(int **)((char *)&v4->Core.PartitionId + v13);
      v15 = *((_WORD *)v14 + 102);
      if( ((v15 & 0x10) == 0 || !v7)
        && (v15 & 0x40) == 0
        && *(_QWORD *)v14 != *((_QWORD *)v14 + 2)
        && *((_QWORD *)v14 + 3) >= v6 )
      {
        break;
      }
LABEL_41:
      v12 += 4;
      v13 = v50 + 8;
      v45 = v12;
      ++v3;
      v50 += 8i64;
      if( v3 >= v44 )
        goto LABEL_46;
      v7 = v56;
    }
    v4 = (_MI_PARTITION *)*((_QWORD *)v14 + 31);
    Partition = v4;
    v51 = (INT64 *)(v14 + 58);
    v16 = ExAcquireSpinLockExclusive((INT64 *)v14 + 29);
    v17 = *((_QWORD *)v14 + 14);
    v18 = *v14;
    v19 = v16;
    v20 = (_RTL_BITMAP *)(v17 + 8);
    v21 = *(const signed __int32 **)(v17 + 16);
    v22 = *v14 - 1;
    v48 = (_RTL_BITMAP *)(v17 + 8);
    v52 = (_RTL_BITMAP *)(v17 + 24);
    if( _bittest(v21, v22) == 1 || (v23 = *(const signed __int32 **)(v17 + 32), _bittest(v23, v22) == 1) )
    {
      v30 = v43;
      v31 = 0i64;
      v29 = v56;
    }
    else
    {
      v24 = *(_QWORD *)v14 - *((_QWORD *)v14 + 2);
      if( v8 <= v24 )
        v24 = v8;
      v25 = (*(_QWORD *)v14 - v24) & 0xFFFFFFFFFFFFFFE0ui64;
      v26 = v18 - v25;
      v25 >>= 5;
      BitMapHeader.SizeOfBitMap = v26;
      v54.SizeOfBitMap = v26;
      BitMapHeader.Buffer = (unsigned int *)&v21[v25];
      v54.Buffer = (unsigned int *)&v23[v25];
      LastBackwardRunClear = RtlFindLastBackwardRunClear(&BitMapHeader, v26 - 1, &StartingRunIndex);
      if( LastBackwardRunClear <= v24 )
        v24 = LastBackwardRunClear;
      v28 = RtlFindLastBackwardRunClear(&v54, v26 - 1, (UINT64 *)((char *)&StartingRunIndex + 4));
      v29 = v56;
      v30 = v43;
      v20 = v48;
      v31 = v28;
      if( v24 <= v28 )
        v31 = v24;
      v4 = Partition;
      if( !v56 )
        v31 &= ~(v43 - 1);
    }
    if( v31 )
    {
      v33 = *(_QWORD *)v14;
      v34 = *((_QWORD *)v14 + 30);
      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 + 3) -= v31;
          *((_QWORD *)v14 + 6) -= v31;
          *(_QWORD *)v14 = v35;
          RtlSetBits(v20, (unsigned int)v35, (unsigned int)v31);
          RtlSetBits(v52, (unsigned int)v35, (unsigned int)v31);
          MiInvalidatePageFileBitmapsCache((_MMPAGING_FILE *)v14, (unsigned int)v35, (unsigned int)v31, 0i64);
          ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v14 + 29);
          __writecr8(v19);
          v8 -= v31;
          if( (v14[51] & 0x10) == 0 )
          {
            v38 = v31 + v49;
            if( !MiChargeCommit(v4, v31 + v49, 2ui64) )
            {
              v39 = ExAcquireSpinLockExclusive((INT64 *)v14 + 29);
              v40 = *((_QWORD *)v14 + 14);
              *((_QWORD *)v14 + 3) += v31;
              *((_QWORD *)v14 + 6) += v31;
              *(_QWORD *)v14 = v31 + v35;
              v41 = v39;
              v42 = (_RTL_BITMAP *)(v40 + 24);
              RtlClearBits((PRTL_BITMAP)(v40 + 8), v35, v31);
              RtlClearBits(v42, v35, v31);
              if( v35 < (unsigned int)v14[30] )
                v14[30] = v35;
              MiCoalescePageFileBitmapsCache((_MMPAGING_FILE *)v14, 0i64, (unsigned int)v35);
              ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v14 + 29);
              __writecr8(v41);
              goto LABEL_46;
            }
            MiReduceCommitLimits(v4, v31, 0i64);
            MiReturnCommit(v4, v38);
          }
          v12 = v45;
          *(_DWORD *)v45 = v35;
          goto LABEL_40;
        }
      }
      v32 = v51;
    }
    else
    {
      v32 = (INT64 *)(v14 + 58);
    }
    ExReleaseSpinLockExclusiveFromDpcLevel(v32);
    __writecr8(v19);
    v12 = v45;
LABEL_40:
    v6 = v43;
    goto LABEL_41;
  }
LABEL_46:
  KeSetEvent(Event, 0, 0);
}

Referenced by:

No references.