MiModifiedPageWriter

VOID __stdcall MiModifiedPageWriter(VOID *StartContext){
  _ETHREAD *CurrentThread; 
  char *v3; 
  _KEVENT *v4; 
  _KEVENT *v5; 
  _KEVENT *v6; 
  NTSTATUS v7; 
  _MMMOD_WRITER_MDL_ENTRY **v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  int v12; 
  unsigned int v13; 
  int v14; 
  _MMMOD_WRITER_MDL_ENTRY *v15; 
  _MMMOD_WRITER_MDL_ENTRY *Flink; 
  unsigned int v17; 
  int v18; 
  unsigned int v19; 
  char *v20; 
  __int64 v21; 
  char v22; 
  unsigned int v23; 
  __int64 i; 
  _QWORD *v25; 
  unsigned int v26; 
  unsigned int v27; 
  unsigned __int64 v28; 
  char *v29; 
  __int64 v30; 
  __int64 v31; 
  unsigned __int8 v32; 
  char v33; 
  unsigned __int64 v34; 
  unsigned int v35; 
  char *v36; 
  __int64 v37; 
  __int64 v38; 
  unsigned int j; 
  _QWORD *v40; 
  signed __int32 v41[8]; 
  INT64 NewBase; 
  unsigned __int64 v43; 
  _ETHREAD *v44; 
  VOID *Object[3]; 
  _KWAIT_BLOCK WaitBlockArray; 
  VOID *v47[6]; 
  _KWAIT_BLOCK v48; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  *((_QWORD *)StartContext + 118) = CurrentThread;
  v44 = CurrentThread;
  CurrentThread->SameThreadPassiveFlags |= 2u;
  LODWORD(NewBase) = KeSetActualBasePriorityThread(&CurrentThread->Tcb, 18i64);
  v3 = (char *)StartContext + 104;
  v47[2] = (char *)StartContext + 920;
  Object[0] = (char *)StartContext + 104;
  v47[0] = (char *)StartContext + 104;
  v4 = (_KEVENT *)((char *)StartContext + 880);
  Object[1] = (char *)StartContext + 736;
  v5 = (_KEVENT *)((char *)StartContext + 696);
  v47[1] = (char *)StartContext + 880;
  v6 = (_KEVENT *)((char *)StartContext + 1008);
  v47[3] = (char *)StartContext + 696;
  v47[4] = (char *)StartContext + 1008;
LABEL_2:
  *((_QWORD *)StartContext + 105) = 0i64;
  *((_DWORD *)StartContext + 212) = 0;
  *((_BYTE *)StartContext + 674) = 0;
  MiStoreCheckCompleteWriteBatch((INT64)StartContext);
  v7 = KeWaitForMultipleObjects(2ui64, Object, WaitAny, WrPageOut, 0, 0, 0i64, &WaitBlockArray);
  *((_BYTE *)StartContext + 674) = 1;
  if( v7 )
  {
    while( 1 )
    {
      if( *((_DWORD *)v3 + 1) )
        goto LABEL_68;
      if( !*((_QWORD *)StartContext + 950) )
        goto LABEL_2;
      --CurrentThread->Tcb.SpecialApcDisable;
      MiStoreCheckCompleteWriteBatch((INT64)StartContext);
      v8 = (_MMMOD_WRITER_MDL_ENTRY **)((char *)StartContext + 904);
      if( *v8 == (_MMMOD_WRITER_MDL_ENTRY *)v8 )
      {
        *((_BYTE *)StartContext + 673) = 1;
        KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
        if( !KeWaitForMultipleObjects(5ui64, v47, WaitAny, WrPageOut, 0, 0, 0i64, &v48) )
          goto LABEL_68;
        --CurrentThread->Tcb.SpecialApcDisable;
        *((_BYTE *)StartContext + 673) = 0;
      }
      if( *((_DWORD *)v5 + 1) )
      {
        KeResetEvent(v5);
        if( *((_DWORD *)StartContext + 173) )
          IoBoostThreadIoPriority(CurrentThread, IoPriorityNormal, 0i64);
      }
      if( *((_DWORD *)v4 + 1) )
      {
        KeResetEvent(v4);
        _InterlockedOr(v41, 0);
        v19 = *((_DWORD *)StartContext + 1734);
        if( v19 )
        {
          v20 = (char *)StartContext + 6944;
          v21 = v19;
          do
          {
            v22 = *(_BYTE *)(*(_QWORD *)v20 + 206i64);
            if( (v22 & 1) != 0 )
            {
              v23 = 0;
              *(_BYTE *)(*(_QWORD *)v20 + 206i64) = v22 & 0xFE;
              for( i = *(_QWORD *)v20; v23 < *(_DWORD *)(*(_QWORD *)v20 + 72i64); ++v23 )
              {
                v25 = *(_QWORD **)(*(_QWORD *)(i + 64) + 8i64 * v23);
                if( v25 && *v25 == 2575857425i64 )
                  MiMakePagefileWriterEntryAvailable(v25);
                i = *(_QWORD *)v20;
              }
            }
            v20 += 8;
            --v21;
          }
          while( v21 );
        }
      }
      if( *((_DWORD *)v6 + 1) )
      {
        KeResetEvent(v6);
        MiStoreUpdateMemoryConditions((_MI_PARTITION *)StartContext);
      }
      v9 = 0i64;
      v10 = *((_QWORD *)StartContext + 344);
      v11 = *((_QWORD *)StartContext + 950);
      if( *((__int64 *)StartContext + 896) >= 0 )
        v9 = *((_QWORD *)StartContext + 896);
      v43 = *((_QWORD *)StartContext + 344);
      if( *((_QWORD *)StartContext + 104) < 0x800ui64 && (v11 > *((_QWORD *)StartContext + 866) >> 2 || v11 > v9 >> 2) )
      {
        v26 = *((_DWORD *)StartContext + 212);
        if( v26 >= 0x40 && *((_DWORD *)StartContext + 210) / v26 < (unsigned int)MaxIoSize >> 3 )
        {
          v27 = *((_DWORD *)StartContext + 1734);
          v28 = 3 * (v11 >> 2);
          if( v27 )
          {
            v29 = (char *)StartContext + 6944;
            v30 = v27;
            do
            {
              v31 = *(_QWORD *)v29;
              if( (*(_WORD *)(*(_QWORD *)v29 + 204i64) & 0x60) == 0 )
              {
                if( v10 > v28 )
                {
                  v32 = ExAcquireSpinLockExclusive((INT64 *)(v31 + 232));
                  v33 = *(_BYTE *)(v31 + 207);
                  v34 = v32;
                  if( (v33 & 1) == 0 )
                  {
                    *(_BYTE *)(v31 + 207) = v33 | 1;
                    MiInitializePagefileBitmapsCache((_MMPAGING_FILE *)v31);
                    *(_DWORD *)(v31 + 124) = MaxIoSize;
                  }
                  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v31 + 232));
                  __writecr8(v34);
                }
                MiFreeModifiedReservations((_MMPAGING_FILE *)v31, 0i64);
                v10 = v43;
              }
              v29 += 8;
              --v30;
            }
            while( v30 );
            CurrentThread = v44;
            v8 = (_MMMOD_WRITER_MDL_ENTRY **)((char *)StartContext + 904);
            v5 = (_KEVENT *)((char *)StartContext + 696);
            v6 = (_KEVENT *)((char *)StartContext + 1008);
            v4 = (_KEVENT *)((char *)StartContext + 880);
          }
          ++*((_DWORD *)StartContext + 214);
          if( v10 > v28 )
          {
            *((_QWORD *)StartContext + 108) = KiQueryUnbiasedInterruptTime(1u);
            _InterlockedOr(v41, 0);
            *((_WORD *)StartContext + 438) |= 1u;
            ++*((_DWORD *)StartContext + 213);
          }
          *((_DWORD *)StartContext + 212) = 0;
          *((_QWORD *)StartContext + 105) = 0i64;
        }
      }
      if( *v8 == (_MMMOD_WRITER_MDL_ENTRY *)v8 )
        break;
      v12 = *((_DWORD *)StartContext + 288);
      if( (v12 & 1) != 0
        && (v12 & 0xFFFFFFFE) == 0
        && _InterlockedCompareExchange((volatile signed __int32 *)StartContext + 288, 0, 1) == 1 )
      {
        KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
        KeResetEvent((_KEVENT *)((char *)StartContext + 736));
LABEL_45:
        v3 = (char *)StartContext + 104;
        goto LABEL_2;
      }
      if( MiUseLowIoPriorityForModifiedPages((_MI_PARTITION *)StartContext) )
      {
        if( *((_QWORD *)StartContext + 950) < *((_QWORD *)StartContext + 91) )
        {
          KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
          goto LABEL_45;
        }
        *((_DWORD *)StartContext + 180) = 4;
        v13 = KeSetActualBasePriorityThread(&CurrentThread->Tcb, 4i64);
        v14 = 0;
      }
      else
      {
        if( *((_DWORD *)StartContext + 173) )
          IoBoostThreadIoPriority(CurrentThread, IoPriorityNormal, 0i64);
        v13 = -1;
        v14 = 8;
      }
      v15 = *v8;
      Flink = (_MMMOD_WRITER_MDL_ENTRY *)(*v8)->Links.Flink;
      if( (_MMMOD_WRITER_MDL_ENTRY **)(*v8)->Links.Blink != v8 || (_MMMOD_WRITER_MDL_ENTRY *)Flink->Links.Blink != v15 )
        __fastfail(3u);
      *v8 = Flink;
      Flink->Links.Blink = (_LIST_ENTRY *)v8;
      v17 = *(_DWORD *)&v15->u1 & 0xFFFFFFE3;
      v15->Links.Flink = (_LIST_ENTRY *)97;
      v15->u1 = (_MODWRITER_FLAGS)(v14 | v17);
      KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
      v15->PointerMdl = &v15->Mdl;
      MiGatherPagefilePages(v15);
      v5 = (_KEVENT *)((char *)StartContext + 696);
      v3 = (char *)StartContext + 104;
      if( v13 == -1 )
      {
        v6 = (_KEVENT *)((char *)StartContext + 1008);
      }
      else
      {
        KeQueryPriorityThread(CurrentThread);
        if( v18 != 18 )
          KeSetActualBasePriorityThread(&CurrentThread->Tcb, v13);
        *((_DWORD *)StartContext + 180) = 18;
        v5 = (_KEVENT *)((char *)StartContext + 696);
        v6 = (_KEVENT *)((char *)StartContext + 1008);
LABEL_29:
        v3 = (char *)StartContext + 104;
      }
    }
    KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
    goto LABEL_29;
  }
LABEL_68:
  if( *((_DWORD *)StartContext + 173) )
    IoBoostThreadIoPriority(CurrentThread, IoPriorityNormal, 0i64);
  ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)StartContext + 119);
  v35 = *((_DWORD *)StartContext + 1734);
  if( v35 )
  {
    v36 = (char *)StartContext + 6944;
    v37 = v35;
    do
    {
      if( *(_QWORD *)v36 )
      {
        --CurrentThread->Tcb.SpecialApcDisable;
        v38 = *(_QWORD *)v36;
        for( j = 0; j < *(_DWORD *)(*(_QWORD *)v36 + 72i64); ++j )
        {
          v40 = *(_QWORD **)(*(_QWORD *)(v38 + 64) + 8i64 * j);
          if( v40 )
          {
            while( *v40 == 97i64 )
            {
              *((_BYTE *)StartContext + 673) = 1;
              KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
              KeWaitForSingleObject((UINT64)StartContext + 920, 19, 0, 0, 0i64);
              --CurrentThread->Tcb.SpecialApcDisable;
            }
          }
          v38 = *(_QWORD *)v36;
        }
        KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
      }
      v36 += 8;
      --v37;
    }
    while( v37 );
  }
  KeSetActualBasePriorityThread(&CurrentThread->Tcb, (unsigned int)NewBase);
  KeSetEvent((PRKEVENT)((char *)StartContext + 760), 0, 0);
}

Referenced by:

No references.