MiFlushTbAsNeeded

VOID __fastcall MiFlushTbAsNeeded(_MMPTE *PointerPte, UINT64 SizeInPages, _KTBFLUSH_TYPE FlushType){
  int v3; 
  int v7; 
  int v8; 
  int v9; 
  UINT64 v10; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v11; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v12; 
  unsigned __int64 Long_high; 
  int v14; 
  INT64 v15; 
  INT64 v16; 
  PVOID BugCheckParameter4; 
  _MI_TB_FLUSH_LIST TbFlushList; 
  __int16 v19; 
  __int16 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 i; 
  char v24[152]; 

  v20 = 0;
  v7 = v3;
  memset(v24, 0i64, sizeof(v24));
  v21 = 20i64;
  TbFlushList = FlushType;
  v8 = 0;
  v19 = 0;
  v9 = 0;
  v22 = 0i64;
  v10 = 0i64;
  for( i = 0i64; v10 < SizeInPages; ++PointerPte )
  {
    v11.Long = (unsigned __int64)PointerPte->u;
    if( (PointerPte->u.Long & 0xC01) == 0 && (PointerPte->u.Long & 0x3E0) == 0 )
    {
      if( *(&stru_140C4DB30 + 42) && (v11.Long & 0x10) == 0 )
        v11.Long &= ~*(&stru_140C4DB30 + 42);
      v12.Long = ZeroPte.u.Long;
      Long_high = HIDWORD(v11.Long);
      LOBYTE(v14) = MiPteInShadowRange((UINT64)PointerPte);
      if( v14 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
        v12.Long = ZeroPte.u.Long | 0x8000000000000000ui64;
      PointerPte->u.Long = v12.Long;
      if( (_DWORD)Long_high )
      {
        if( (_DWORD)Long_high == v8 )
        {
          if( v9 == 1 )
            MiInsertTbFlushEntry(
              &TbFlushList,
              (VOID *)((__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
              1ui64,
              0i64);
        }
        else
        {
          if( MiCompareTbFlushTimeStamp((unsigned int)Long_high, 0xFFFFFFFFui64, v15, v16, (UINT64)BugCheckParameter4) )
          {
            MiInsertTbFlushEntry(
              &TbFlushList,
              (VOID *)((__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
              1ui64,
              0i64);
            v9 = 1;
          }
          else
          {
            v9 = 0;
          }
          v8 = Long_high;
        }
      }
      else
      {
        v9 = 0;
        v8 = 0;
      }
    }
    else if( !v7 )
    {
      KeBugCheckEx(0x1Au, (PVOID)0x5100, PointerPte, (PVOID)(SizeInPages - v10), (PVOID)v11.Long);
    }
    ++v10;
  }
  MiFlushTbList(&TbFlushList);
}

Referenced by:

MiLinkPoolCommitChain
MiReservePtes