MiZeroAndFlushPtes

VOID __stdcall MiZeroAndFlushPtes(VOID *BaseVa, UINT64 NumberOfPages){
  _MMPTE *PteBase; 
  unsigned __int64 v4; 
  UINT64 v5; 
  unsigned __int64 v6; 
  NTSTATUS v7; 
  int v8; 
  UINT64 v9; 
  unsigned int v10; 
  __int64 v11; 
  UINT64 v12; 
  __int64 v13; 
  UINT64 v14; 
  UINT64 v15; 
  __int64 v16; 
  int v17; 
  UINT64 v18; 
  int v19; 
  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;} v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 *v23; 
  __int64 v24; 
  __int64 v25; 
  unsigned __int64 Long; 
  int v27; 
  bool v29; 
  __int64 *v30; 
  __int64 v31; 
  unsigned __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  _MMPTE *v35; 
  int v36; 
  UINT64 v37; 
  VOID *Va; 
  UINT64 v39; 
  UINT64 v40; 
  UINT64 v41; 
  UINT64 v42; 
  unsigned __int64 v43; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  __int64 v45; 
  _MI_TB_FLUSH_LIST TbFlushList[48]; 
  __int64 v47[32]; 

  v39 = NumberOfPages;
  memset(TbFlushList, 0i64, 0xB8u);
  PteBase = MmGetPteBase();
  v4 = (unsigned __int64)BaseVa & 0xFFFFFFFFFFFFF000ui64;
  Va = (VOID *)((unsigned __int64)BaseVa & 0xFFFFFFFFFFFFF000ui64);
  v45 = 0i64;
  *(_OWORD *)&LockHandle.LockQueue.Lock = 0i64;
  v5 = (UINT64)PteBase + (((unsigned __int64)BaseVa >> 9) & 0x7FFFFFFFF8i64);
  v6 = 1i64;
  v7 = MI_IS_PHYSICAL_ADDRESS(BaseVa);
  v8 = v7;
  v36 = v7;
  if( v7 > 0 )
  {
    v25 = (unsigned int)v7;
    do
    {
      v6 <<= 9;
      v5 = (UINT64)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64);
      --v25;
    }
    while( v25 );
  }
  v9 = 0i64;
  TbFlushList[2] = 20;
  v40 = 0i64;
  v10 = 0;
  *(_QWORD *)&TbFlushList[6] = 0i64;
  v11 = MiSwizzleInvalidPte(768i64);
  v12 = v39;
  v13 = v11;
  while( 2 )
  {
    v14 = v12;
    v12 %= v6;
    v39 = v12;
    LockHandle.LockQueue.Next = (_KSPIN_LOCK_QUEUE *volatile)(v5 + 8 * (v14 / v6));
    if( (_KSPIN_LOCK_QUEUE *volatile)v5 >= LockHandle.LockQueue.Next )
      goto LABEL_18;
    MiPteInShadowRange((UINT64)&v37);
    v43 = v6 << 12;
    do
    {
      v42 = v9;
      v41 = v9;
      LODWORD(v15) = MI_READ_PTE_LOCK_FREE(v5);
      v37 = v15;
      v16 = (v15 >> 12) & 0xFFFFFFFFFi64;
      if( v8 == 3 )
      {
        KeAcquireInStackQueuedSpinLock(
          (PKSPIN_LOCK)&stru_140C4DB30 + 522,
          (PKLOCK_QUEUE_HANDLE)&LockHandle.LockQueue.Lock);
        Long = ZeroPte.u.Long;
        LOBYTE(v27) = MiPteInShadowRange(v5);
        if( v27 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
          Long = ZeroPte.u.Long | 0x8000000000000000ui64;
        *(_QWORD *)v5 = Long;
        KeReleaseInStackQueuedSpinLockFromDpcLevel((PKLOCK_QUEUE_HANDLE)&LockHandle.LockQueue.Lock);
        __writecr8((unsigned __int8)v45);
        v9 = v5;
        v8 = v36;
        if( v41 )
          v9 = v42;
        v40 = v5;
        goto LABEL_32;
      }
      LOBYTE(v17) = MiPteInShadowRange(v5);
      v18 = 1i64;
      v19 = 0;
      if( v8 >= 1 )
      {
        v20.Long = v13;
        if( !v17 )
          goto LABEL_8;
        if( MiPteHasShadow() )
        {
          v19 = v18;
          if( *(&stru_140C4DB30 + 537) )
            goto LABEL_8;
        }
        else if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) == 0 )
        {
          goto LABEL_8;
        }
        v29 = ((unsigned __int8)v13 & (unsigned __int8)v18) == 0;
      }
      else
      {
        v20.Long = ZeroPte.u.Long;
        if( !v17 || (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) == 0 )
          goto LABEL_8;
        v29 = (ZeroPte.u.Long & 1) == 0;
      }
      if( !v29 )
        v20.Long |= 0x8000000000000000ui64;
LABEL_8:
      *(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;} *)v5 = (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;})v20.Long;
      if( v19 )
        MiWritePteShadow();
      if( v8 < (int)v18 )
      {
        MiInsertTbFlushEntry(TbFlushList, Va, v18, (unsigned int)v8);
        goto LABEL_12;
      }
LABEL_32:
      MiInsertLargeTbFlushEntry(TbFlushList, (unsigned int)v8, v5);
LABEL_12:
      if( (MmGetPfnDb()[v16].u4._bf_0 & 0x4000000000000i64) == 0 )
      {
        if( v10 && (v21 = v47[2 * v10 - 1], v21 == v16) )
        {
          v47[2 * v10 - 1] = v6 + v21;
        }
        else
        {
          v24 = 2i64 * v10++;
          v47[v24] = v16;
          v47[v24 + 1] = v16 + v6;
          if( v10 == 16 )
          {
            MiFlushTbList(TbFlushList);
            v30 = v47;
            v31 = 16i64;
            do
            {
              MiDereferenceIoPages(1i64, *v30, v30[1] - *v30);
              v30 += 2;
              --v31;
            }
            while( v31 );
            v8 = v36;
            v10 = 0;
          }
        }
      }
      v5 += 8i64;
      v4 = (unsigned __int64)Va + v43;
      Va = (char *)Va + v43;
    }
    while( (_KSPIN_LOCK_QUEUE *volatile)v5 < LockHandle.LockQueue.Next );
    v12 = v39;
LABEL_18:
    if( v12 )
    {
      v8 = 0;
      v36 = 0;
      v6 = 1i64;
      v5 = (UINT64)MmGetPteBase() + ((v4 >> 9) & 0x7FFFFFFFF8i64);
      continue;
    }
    break;
  }
  if( v9 )
  {
    MiGetLeafVa(v40);
    LODWORD(v32) = MiGetLeafVa(v9);
    MiReplicatePteChange((_MMPTE *)(v34 + (v33 & (v32 >> 9))), v35);
  }
  MiFlushTbList(TbFlushList);
  v22 = v10;
  if( v10 )
  {
    v23 = v47;
    do
    {
      MiDereferenceIoPages(1i64, *v23, v23[1] - *v23);
      v23 += 2;
      --v22;
    }
    while( v22 );
  }
}

Referenced by:

MiFillSystemPtes
MmMapMdl
MmUnlockPages
MmUnmapIoSpace
MmUnmapLockedPages