MiTrimUnusedPageFileRegionsWorker

VOID __stdcall MiTrimUnusedPageFileRegionsWorker(PVOID Parameter){
  _ETHREAD *CurrentThread; 
  INT64 v3; 
  UINT64 v4; 
  unsigned int v5; 
  unsigned int SessionId; 
  unsigned int v7; 
  char *v8; 
  unsigned int v9; 
  __int64 v10; 
  unsigned int v11; 
  UINT64 v12; 
  UINT8 v13; 
  UINT8 v14; 
  UINT64 v15; 
  UINT64 updated; 
  UINT8 v17; 
  INT64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  int v21; 
  _ETHREAD *v22; 
  int v23; 
  int v24; 
  bool v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  __int64 v28; 
  int v29[8]; 
  PIO_STATUS_BLOCK IoStatusBlock; 
  ULONG FsControlCode[2]; 
  PVOID InputBuffer; 
  ULONG InputBufferLength[2]; 
  PVOID OutputBuffer; 
  INT64 OutputBufferLength; 
  INT64 v36; 
  INT64 a12; 
  struct _KEVENT Event; 
  __int128 v39; 
  UINT64 v40[2]; 
  char *v41; 
  _ETHREAD *v42; 
  struct _IO_STATUS_BLOCK v43; 
  KAPC result; 
  INT64 a7[2]; 
  unsigned __int64 v46; 
  memset((INT64)&result, 0i64);
  v46 = 0i64;
  Event.Header.WaitListHead = 0i64;
  v39 = 0i64;
  *(_OWORD *)v40 = 0i64;
  *(_OWORD *)a7 = 0i64;
  v43 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v42 = CurrentThread;
  v3 = MiSwizzleInvalidPte(0i64);
  if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)Parameter + 119) )
  {
    --*((_WORD *)CurrentThread + 243);
    v4 = (UINT64)Parameter + 1128;
    ExAcquirePushLockExclusiveEx((UINT64)Parameter + 1128, 0i64);
    KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
    v5 = *((_DWORD *)Parameter + 1734);
    SessionId = -1;
    a12 = v5;
    v7 = 0;
    if( v5 )
    {
      v8 = (char *)Parameter + 6944;
      v9 = v5;
      v41 = (char *)Parameter + 6944;
      do
      {
        v10 = *(_QWORD *)v8;
        if( (*(_WORD *)(*(_QWORD *)v8 + 204i64) & 0x850) == 16 )
        {
          Event.Header.WaitListHead.Flink = (_LIST_ENTRY *)393216;
          *(_QWORD *)&v39 = &Event.Header.WaitListHead.Blink;
          v40[1] = 0i64;
          Event.Header.WaitListHead.Blink = (_LIST_ENTRY *)&Event.Header.WaitListHead.Blink;
          v40[0] = v7 | 0x200000000000i64;
          *((_QWORD *)&v39 + 1) = Parameter;
          v11 = MiPageFileLargestBitmapsRun(v10);
          if( v11 >= HIDWORD(v40[0]) )
          {
            do
            {
              MiQueueSyncModifiedWriterApc(
                (INT64)Parameter,
                &result,
                (INT64)MiTrimUnusedPageFileRegionsApc,
                (INT64)&Event.Header.WaitListHead,
                &Event.Header.WaitListHead);
              if( !HIDWORD(v40[1]) )
                break;
              a7[1] = (unsigned __int64)LODWORD(v40[1]) << 12;
              v46 = (unsigned __int64)HIDWORD(v40[1]) << 12;
              a7[0] = 0x100000000i64;
              KeResetEvent(&Event.Header.WaitListHead, v12, v13, v14, (IRP *)IoStatusBlock);
              HIDWORD(v36) = ZwFsControlFile(
                               *(HANDLE *)(v10 + 224),
                               0i64,
                               (PIO_APC_ROUTINE)MiIrpCompletionApcRoutine,
                               &Event.Header.WaitListHead,
                               &v43,
                               0x98208u,
                               a7,
                               0x18u,
                               0i64,
                               0);
              if( HIDWORD(v36) == 259 )
              {
                KeWaitForSingleObject(&Event.Header.WaitListHead, Executive, 0, 0, 0i64);
                HIDWORD(v36) = v43.Status;
              }
              updated = MiTransferSoftwarePte(v3, v10, LODWORD(v40[1]));
              v19 = updated;
              if( qword_140C4DC80 )
              {
                if( (updated & 0x10) != 0 )
                  v19 = updated & 0xFFFFFFFFFFFFFFEFui64;
                else
                  v19 = updated & ~qword_140C4DC80;
              }
              v20 = HIDWORD(v19);
              if( HIDWORD(v40[1]) )
              {
                v21 = HIDWORD(v40[1]);
                do
                {
                  MiReleasePageFileInfo(
                    (INT64)Parameter,
                    updated,
                    2,
                    v18,
                    (INT64)IoStatusBlock,
                    *(INT64 *)FsControlCode,
                    (INT64)InputBuffer,
                    *(INT64 *)InputBufferLength,
                    (INT64)OutputBuffer,
                    OutputBufferLength,
                    v36,
                    a12);
                  updated = MiUpdatePageFileHighInPte(updated, ++v20);
                  --v21;
                }
                while( v21 );
              }
              if( v36 < 0 )
                break;
              KeResetEvent(&Event.Header.WaitListHead, v15, v17, v18, (IRP *)IoStatusBlock);
              v40[1] = (unsigned int)(HIDWORD(v40[1]) + LODWORD(v40[1]));
            }
            while( (unsigned __int64)LODWORD(v40[1]) < *(_QWORD *)v10 );
            v7 = HIDWORD(a12);
            v8 = v41;
            v9 = a12;
          }
        }
        ++v7;
        v8 += 8;
        HIDWORD(a12) = v7;
        v41 = v8;
      }
      while( v7 < v9 );
      CurrentThread = v42;
      v4 = (UINT64)Parameter + 1128;
      SessionId = -1;
    }
    --*((_WORD *)CurrentThread + 243);
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)v4);
    Event.Header.SignalState = 0;
    v22 = (_ETHREAD *)KeGetCurrentThread();
    if( (unsigned int)MiGetSystemRegionType(v4) == 1 )
      SessionId = MmGetSessionIdEx(*((_QWORD *)v22 + 23));
    --*((_WORD *)v22 + 243);
    ++*((_BYTE *)v22 + 794);
    v23 = *((char *)v22 + 792) | *((char *)v22 + 870);
    LOBYTE(v36) = *((_BYTE *)v22 + 794);
    v24 = v23 ^ 0x3F;
    while( 1 )
    {
      v25 = !_BitScanReverse((unsigned int *)&v26, v24);
      Event.Header.LockNV = v26;
      if( v25 )
        break;
      v27 = *((_QWORD *)v22 + 100) + 96 * v26;
      v24 &= ~(1 << v26);
      if( (*(_BYTE *)(v27 + 26) & 1) != 0
        && (*(_DWORD *)(v27 + 32) & 1) == 0
        && (*(_QWORD *)(v27 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v4 & 0x7FFFFFFFFFFFFFFCi64)
        && *(_DWORD *)(v27 + 40) == SessionId )
      {
        *(_BYTE *)(v27 + 26) &= ~1u;
        if( *(_QWORD *)(v27 + 32) )
        {
          if( v27 )
          {
            *(_BYTE *)(v27 + 32) |= 2u;
            if( *(__int64 *)(v27 + 32) < 0 )
              KiAbEntryRemoveFromTree(v27);
            Event.Header.SignalState = *(_DWORD *)(v27 + 88) & 0x1FFFF;
            *(_DWORD *)(v27 + 88) &= 0xFFFE0000;
            *(_BYTE *)(v27 + 25) &= ~1u;
            *(_QWORD *)(v27 + 32) = 0i64;
            v28 = (__int64)(v27 - *((_QWORD *)v22 + 100)) / 96;
            if( (_BYTE)v36 == 1 )
              *((_BYTE *)v22 + 792) |= 1 << v28;
            else
              _InterlockedOr8((volatile signed __int8 *)v22 + 870, 1 << v28);
            goto LABEL_36;
          }
          break;
        }
      }
    }
    if( (*((_DWORD *)v22 + 30) & 0x10000) == 0 )
      KeBugCheckEx(0x162u, (ULONG_PTR)v22, v4, SessionId, 0i64);
LABEL_36:
    --*((_BYTE *)v22 + 794);
    KiAbThreadRemoveBoosts((ULONG_PTR)v22, v4, (unsigned int *)&Event.Header.SignalState);
    v25 = (*((_WORD *)v22 + 243))++ == 0xFFFF;
    if( v25 && *((_ETHREAD **)v22 + 19) != (_ETHREAD *)((char *)v22 + 152) )
      KiCheckForKernelApcDelivery();
    KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
    MiContractWsSwapPageFile((_MI_PARTITION *)Parameter);
    ExReleaseRundownProtection((PEX_RUNDOWN_REF)Parameter + 119);
    *((_QWORD *)Parameter + 135) = KiQueryUnbiasedInterruptTime(1u);
    _InterlockedOr(v29, 0);
    *((_QWORD *)Parameter + 134) = 0i64;
  }
  PsDereferencePartition(*((_QWORD *)Parameter + 22));
}

Referenced by:

No references.