MiTrimPte

NTSTATUS __fastcall MiTrimPte(INT64 a1, UINT64 a2, INT64 a3){
  int v3; 
  _MMSUPPORT_INSTANCE *v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  _BOOL4 v9; 
  UINT64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  int v13; 
  _MMPTE *v14; 
  unsigned __int64 v15; 
  _MMPFN *v16; 
  __int64 Blink; 
  _MMPTE *PteBase; 
  unsigned __int64 v19; 
  unsigned int v20; 
  _MMSUPPORT_INSTANCE *v21; 
  unsigned int v22; 
  _MMPTE *v23; 
  INT64 v24; 
  int v27; 

  v27 = 0;
  v3 = a3;
  v6 = *(_MMSUPPORT_INSTANCE **)(a1 + 24);
  v7 = *(_QWORD *)a2;
  v8 = (__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  v9 = a3 == 0;
  v10 = *(_QWORD *)(a1 + 168);
  v11 = *(_QWORD *)(v10 + 16);
  v12 = *(_QWORD *)(v10 + 8);
  if( v11 == v12 )
    return 3;
  v13 = *(_DWORD *)v10;
  if( (*(_DWORD *)v10 & 0x400) != 0
    && ((v13 & 0x800) != 0 && v11 >= 0x100 || v6->WorkingSetSize <= *(_QWORD *)(v10 + 48) - v12) )
  {
    return 3;
  }
  if( (v13 & 0x1000) == 0 )
  {
    LODWORD(v14) = MiComputeNextWalkPte(a2, v9);
    v6->VmWorkingSetList->NextPteToTrim = v14;
  }
  v15 = *(_QWORD *)a2;
  MiPteInShadowRange(a2);
  v16 = &MmGetPfnDb()[(v15 >> 12) & 0xFFFFFFFFFi64];
  if( v3 && ((v16->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) != 1 || (unsigned int)MiIsPageTableLocked((INT64)v6, a2)) )
    return 0;
  if( (v16->u4._bf_0 & 0x1000000000i64) == 0 )
  {
    Blink = (__int64)v16->ListEntry.Blink;
    if( Blink > 0 && MiDemoteCombinedPte(v6, (_MMPTE *)a2, (_MMPTE *)(Blink | 0x8000000000000000ui64)) == 1 )
      LOBYTE(v7) = MI_READ_PTE_LOCK_FREE(a2);
  }
  PteBase = MmGetPteBase();
  if( v8 < (unsigned __int64)PteBase || v8 > (unsigned __int64)MmGetPteLimit() )
  {
    v20 = HIBYTE(*(unsigned __int64 *)((char *)&PteBase->u.Long + ((v8 >> 9) & 0x7FFFFFFFF8i64))) & 0xF;
  }
  else
  {
    LODWORD(v19) = MI_READ_PTE_LOCK_FREE((INT64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64));
    v20 = (LODWORD(MmGetPfnDb()[(v19 >> 12) & 0xFFFFFFFFFi64].ListEntry.Flink) >> 1) & 7;
  }
  v21 = *(_MMSUPPORT_INSTANCE **)(a1 + 24);
  v22 = *(_DWORD *)v10 & 0xF;
  if( !(unsigned int)MiTrimThisWsle((__int64)v21, v8, (__int64)v16, (wchar_t *)v10, (v7 & 0x20) != 0, &v27) )
    goto LABEL_26;
  MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)(v10 + 56), (VOID *)v8, 1ui64, 0i64);
  if( (*(_DWORD *)v10 & 0x10) != 0 )
    MI_WSLE_LOG_ACCESS(v21, (_MMWSLE *)a2, v23);
  if( ++*(_QWORD *)(v10 + 16) == *(_QWORD *)(v10 + 8) || *(_DWORD *)(v10 + 68) == *(_DWORD *)(v10 + 64) )
  {
    v24 = a1;
    MiTrimWorkingSetBuildup((_MMMOD_WRITER_MDL_ENTRY *)a1, v10);
    if( *(_QWORD *)(v10 + 16) == *(_QWORD *)(v10 + 8) )
      return 3;
  }
  else
  {
LABEL_26:
    v24 = a1;
  }
  if( v27 && MiInsertVmAccessedEntry(*(UINT64 **)(v10 + 240), v8) )
  {
    MiTrimWorkingSetTail(v24);
    return 0;
  }
  if( v20 < v22 )
    return 0;
  if( ++*(_QWORD *)(v10 + 32) < *(_QWORD *)(v10 + 40) )
    return 0;
  return 3;
}

Referenced by:

No references.