MiTrimUnusedPageFileRegionsWorker

VOID __stdcall MiTrimUnusedPageFileRegionsWorker(VOID *Parameter){
  _ETHREAD *CurrentThread; 
  __int64 v3; 
  UINT64 v4; 
  int v5; 
  unsigned int SessionId; 
  unsigned int v7; 
  char *v8; 
  unsigned int v9; 
  _MMPAGING_FILE *v10; 
  unsigned int v11; 
  unsigned __int64 v12; 
  INT64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  int v16; 
  INT64 v17; 
  _ETHREAD *v18; 
  int v19; 
  int v20; 
  bool v21; 
  __int64 v22; 
  _KLOCK_ENTRY *v23; 
  __int64 v24; 
  int v25[8]; 
  int v26; 
  NTSTATUS Status; 
  int v28; 
  unsigned int v29; 
  int ApcContext; 
  int ApcContext_4; 
  __int128 ApcContext_8; 
  __int128 v33; 
  UINT64 v34[2]; 
  char *v35; 
  _ETHREAD *v36; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  char v38[96]; 
  __int128 InputBuffer; 
  unsigned __int64 v40; 

  memset(v38, 0i64, 0x58u);
  v40 = 0i64;
  ApcContext_8 = 0i64;
  v33 = 0i64;
  *(_OWORD *)v34 = 0i64;
  InputBuffer = 0i64;
  IoStatusBlock = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v36 = CurrentThread;
  v3 = MiSwizzleInvalidPte(0i64);
  if( ExAcquireRundownProtection((_EX_RUNDOWN_REF *)Parameter + 119) )
  {
    --CurrentThread->Tcb.SpecialApcDisable;
    v4 = (UINT64)Parameter + 1128;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Parameter + 141, 0i64);
    KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
    v5 = *((_DWORD *)Parameter + 1734);
    SessionId = -1;
    v28 = v5;
    v7 = 0;
    v29 = 0;
    if( v5 )
    {
      v8 = (char *)Parameter + 6944;
      v9 = v5;
      v35 = (char *)Parameter + 6944;
      do
      {
        v10 = *(_MMPAGING_FILE **)v8;
        if( (*(_WORD *)(*(_QWORD *)v8 + 204i64) & 0x850) == 16 )
        {
          *(_QWORD *)&ApcContext_8 = 393216i64;
          *(_QWORD *)&v33 = (char *)&ApcContext_8 + 8;
          v34[1] = 0i64;
          *((_QWORD *)&ApcContext_8 + 1) = (char *)&ApcContext_8 + 8;
          v34[0] = v7 | 0x200000000000i64;
          *((_QWORD *)&v33 + 1) = Parameter;
          v11 = MiPageFileLargestBitmapsRun(v10);
          if( v11 >= HIDWORD(v34[0]) )
          {
            do
            {
              MiQueueSyncModifiedWriterApc(
                (__int64)Parameter,
                (INT64)v38,
                (INT64)MiTrimUnusedPageFileRegionsApc,
                (INT64)&ApcContext_8,
                &ApcContext_8);
              if( !HIDWORD(v34[1]) )
                break;
              *((_QWORD *)&InputBuffer + 1) = (unsigned __int64)LODWORD(v34[1]) << 12;
              v40 = (unsigned __int64)HIDWORD(v34[1]) << 12;
              *(_QWORD *)&InputBuffer = 0x100000000i64;
              KeResetEvent((_KEVENT *)&ApcContext_8);
              Status = ZwFsControlFile(
                         (_HANDLE)v10->FileHandle,
                         0,
                         (PIO_APC_ROUTINE)MiIrpCompletionApcRoutine,
                         &ApcContext_8,
                         &IoStatusBlock,
                         0x98208u,
                         &InputBuffer,
                         0x18u,
                         0i64,
                         0);
              if( Status == 259 )
              {
                KeWaitForSingleObject((UINT64)&ApcContext_8, 0, 0, 0, 0i64);
                Status = IoStatusBlock.Status;
              }
              LODWORD(v12) = MiTransferSoftwarePte(v3, (INT64)v10, LODWORD(v34[1]));
              v13 = v12;
              v14 = v12;
              if( *(&stru_140C4DB30 + 42) )
              {
                if( (v12 & 0x10) != 0 )
                  v14 = v12 & 0xFFFFFFFFFFFFFFEFui64;
                else
                  v14 = v12 & ~*(&stru_140C4DB30 + 42);
              }
              v15 = HIDWORD(v14);
              if( HIDWORD(v34[1]) )
              {
                v16 = HIDWORD(v34[1]);
                do
                {
                  MiReleasePageFileInfo((_MI_PARTITION *)Parameter, (_MMPTE)v13, 2ui64);
                  LODWORD(v17) = MiUpdatePageFileHighInPte(v13, ++v15);
                  v13 = v17;
                  --v16;
                }
                while( v16 );
              }
              if( Status < 0 )
                break;
              KeResetEvent((_KEVENT *)&ApcContext_8);
              v34[1] = (unsigned int)(HIDWORD(v34[1]) + LODWORD(v34[1]));
            }
            while( LODWORD(v34[1]) < v10->Size );
            v7 = v29;
            v8 = v35;
            v9 = v28;
          }
        }
        ++v7;
        v8 += 8;
        v29 = v7;
        v35 = v8;
      }
      while( v7 < v9 );
      CurrentThread = v36;
      v4 = (UINT64)Parameter + 1128;
      SessionId = -1;
    }
    --CurrentThread->Tcb.SpecialApcDisable;
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)v4);
    ApcContext_4 = 0;
    v18 = (_ETHREAD *)KeGetCurrentThread();
    if( MiGetSystemRegionType(v4) == 1 )
      SessionId = MmGetSessionIdEx(v18->Tcb.ApcState.Process);
    --v18->Tcb.SpecialApcDisable;
    ++v18->Tcb.AbAllocationRegionCount;
    v19 = (char)v18->Tcb.AbEntrySummary | (char)v18->Tcb.AbOrphanedEntrySummary;
    LOBYTE(v26) = v18->Tcb.AbAllocationRegionCount;
    v20 = v19 ^ 0x3F;
    while( 1 )
    {
      v21 = !_BitScanReverse((unsigned int *)&v22, v20);
      ApcContext = v22;
      if( v21 )
        break;
      v23 = &v18->Tcb.LockEntries[v22];
      v20 &= ~(1 << v22);
      if( (v23->AcquiredByte & 1) != 0
        && (v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
        && (v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (v4 & 0x7FFFFFFFFFFFFFFCi64)
        && v23->LockState.SessionId == SessionId )
      {
        v23->AcquiredByte &= ~1u;
        if( v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
        {
          if( v23 )
          {
            v23->CrossThreadReleasableAndBusyByte |= 2u;
            if( v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
              KiAbEntryRemoveFromTree(v23);
            ApcContext_4 = v23->BoostBitmap.AllFields & 0x1FFFF;
            v23->BoostBitmap.AllFields &= 0xFFFE0000;
            v23->ThreadLocalFlags &= ~1u;
            v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
            v24 = v23 - v18->Tcb.LockEntries;
            if( (_BYTE)v26 == 1 )
              v18->Tcb.AbEntrySummary |= 1 << v24;
            else
              _InterlockedOr8((volatile signed __int8 *)&v18->Tcb.AbOrphanedEntrySummary, 1 << v24);
            goto LABEL_36;
          }
          break;
        }
      }
    }
    if( (*(&v18->Tcb.MiscFlags + 1) & 0x10000) == 0 )
      KeBugCheckEx(0x162u, v18, (PVOID)v4, (PVOID)SessionId, 0i64);
LABEL_36:
    --v18->Tcb.AbAllocationRegionCount;
    KiAbThreadRemoveBoosts(&v18->Tcb, (VOID *)v4, (UINT64 *)&ApcContext_4);
    v21 = v18->Tcb.SpecialApcDisable++ == -1;
    if( v21 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v18->Tcb.ApcState.ApcListHead[0].Flink != &v18->Tcb.152 )
      KiCheckForKernelApcDelivery();
    KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
    MiContractWsSwapPageFile((_MI_PARTITION *)Parameter);
    ExReleaseRundownProtection((_EX_RUNDOWN_REF *)Parameter + 119);
    *((_QWORD *)Parameter + 135) = KiQueryUnbiasedInterruptTime(1u);
    _InterlockedOr(v25, 0);
    *((_QWORD *)Parameter + 134) = 0i64;
  }
  PsDereferencePartition(*((_QWORD *)Parameter + 22));
}

Referenced by:

No references.