MiInsertCachedPte

INT64 __fastcall MiInsertCachedPte(INT64 a1, UINT64 a2, UINT64 a3){
  __int64 v3; 
  __int64 v6; 
  unsigned __int64 v8; 
  int v9; 
  unsigned __int64 PteBase; 
  unsigned __int64 v11; 
  _MMPTE *Pml4eBase; 
  _MMPTE *PxeUserLimit; 
  __int64 v14; 
  _MMPTE *v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  unsigned int v19; 
  volatile signed __int64 *v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  signed __int64 v24; 
  int v25; 
  unsigned __int8 CurrentIrql; 
  int v27; 
  unsigned __int64 v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  signed __int32 v31[8]; 
  _MI_CACHED_PTE v32; 
  __int64 v33; 
  _MI_CACHED_PTE CachedPte; 
  __int64 v35; 
  __int64 v36; 
  unsigned __int64 v37; 
  unsigned int v38; 
  int v39; 
  v38 = a3;
  v3 = (unsigned int)a3;
  v32 = 0i64;
  if( (unsigned int)MiIsPteCachingOptimizationEnabled() )
  {
    if( (unsigned int)v3 >= 0x200 )
      return 0i64;
  }
  else if( (unsigned int)v3 > 0x40 )
  {
    return 0i64;
  }
  v8 = *(_QWORD *)(a1 + 16);
  v37 = v8;
  v9 = 0;
  v39 = 0;
  PteBase = (unsigned __int64)MmGetPteBase();
  v11 = (__int64)((a2 << 25) - (PteBase << 25)) >> 16;
  if( v11 >= PteBase && v11 <= (unsigned __int64)MmGetPteLimit() )
  {
    v9 = 1;
    v39 = 1;
    v8 = PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64);
    v37 = v8;
    if( (unsigned int)v3 > (4096 - (a2 & 0xFFF)) >> 3 )
      return 0i64;
  }
  if( a2 == v8 )
    return 0i64;
  Pml4eBase = MmGetPml4eBase();
  PxeUserLimit = MmGetPxeUserLimit();
  if( (_DWORD)v3 == 1 )
  {
    v14 = 4096i64;
  }
  else
  {
    v15 = (_MMPTE *)(a2 + 8);
    v16 = v3 << 32;
    if( qword_140C4DC80 )
    {
      if( (v16 & qword_140C4DC80) != 0 )
        v16 |= 0x10ui64;
      else
        v16 |= qword_140C4DC80;
    }
    if( v15 >= Pml4eBase
      && v15 <= PxeUserLimit
      && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
      && (v16 & 1) != 0 )
    {
      v16 |= v6;
    }
    *(_QWORD *)v15 = v16;
    v14 = 0i64;
  }
  v17 = *(_QWORD *)(a1 + 80);
  v35 = v14;
  if( v9 )
    v17 += 72i64 * (unsigned __int16)KeNumberNodes;
  v18 = v17 + 72i64 * *(unsigned __int16 *)(*((_QWORD *)KeGetCurrentPrcb() + 24) + 146i64);
  v36 = v18;
  _InterlockedOr(v31, 0);
  v19 = KiTbFlushTimeStamp;
  if( !(_DWORD)KiTbFlushTimeStamp )
  {
    do
    {
      KeFlushTb(0i64, 1u);
      _InterlockedOr(v31, 0);
      v19 = KiTbFlushTimeStamp;
    }
    while( !(_DWORD)KiTbFlushTimeStamp );
    v18 = v36;
    v9 = v39;
  }
  v20 = (volatile signed __int64 *)(v18 + 8i64 * (v19 & 7));
  if( v9 )
  {
    v21 = v3 + *(int *)(v18 + 64);
    if( v21 >= 0x80 )
    {
      MiEmptyPteBins((_MI_SYSTEM_PTE_TYPE *)a1, 1ui64);
      return 0i64;
    }
    if( v21 >= 0x40 )
    {
      MiEmptyPteBins((_MI_SYSTEM_PTE_TYPE *)a1, 0i64);
      v9 = v39;
    }
  }
  v22 = 0i64;
  if( qword_140C4DC80 )
    v22 = qword_140C4DC80;
  v23 = v14 | v22 & 0xFFFFFFFFFFFF0FFFui64;
LABEL_34:
  v24 = *v20;
  v33 = *v20;
  while( 1 )
  {
    while( 1 )
    {
      CachedPte = (_MI_CACHED_PTE)v24;
      if( (_DWORD)v24 != v19 )
      {
        if( HIDWORD(v24) )
          break;
      }
      if( v23 )
      {
        if( qword_140C4DC80 )
        {
          if( (v23 & 0x10) != 0 )
            LODWORD(v23) = v23 & 0xFFFFFFEF;
          else
            LODWORD(v23) = ~(_DWORD)qword_140C4DC80 & v23;
        }
      }
      else
      {
        LODWORD(v23) = 0;
      }
      v23 = ((unsigned __int64)HIDWORD(v33) << 32) | (unsigned int)v23;
      if( qword_140C4DC80 )
      {
        if( (qword_140C4DC80 & v23) != 0 )
          v23 |= 0x10ui64;
        else
          v23 |= qword_140C4DC80;
      }
      v29 = v23;
      if( a2 >= (unsigned __int64)MmGetPml4eBase()
        && a2 <= (unsigned __int64)MmGetPxeUserLimit()
        && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
        && (v23 & 1) != 0 )
      {
        v29 = v23 | 0x8000000000000000ui64;
      }
      *(_QWORD *)a2 = v29;
      v32.GlobalTimeStamp = v19;
      v32.PteIndex = (__int64)(a2 - v8) >> 3;
      v24 = _InterlockedCompareExchange64(v20, v32.Long, v24);
      v33 = v24;
      if( v24 == CachedPte )
      {
        _InterlockedExchangeAdd((volatile signed __int32 *)(v36 + 64), v38);
        return 1i64;
      }
    }
    if( !(_DWORD)v24 )
      goto LABEL_34;
    _InterlockedOr(v31, 0);
    if( (unsigned int)(KiTbFlushTimeStamp - v24) <= 2 )
    {
      if( (v24 & 1) != 0 || (v25 = 0, (unsigned int)(KiTbFlushTimeStamp - v24) < 2) )
        v25 = 1;
    }
    else
    {
      v25 = 0;
    }
    if( v25 )
      break;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    v24 = _InterlockedCompareExchange64(v20, 0i64, v24);
    v33 = v24;
    if( v24 == CachedPte )
    {
      if( v9 )
      {
        v27 = MiReleaseLargePteMappings((_MI_SYSTEM_PTE_TYPE *)a1, &CachedPte, 0i64);
      }
      else
      {
        v28 = MiReplenishBitMap(a1, CachedPte.PteIndex, 0i64);
        v27 = v28;
        _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 88), v28);
      }
      _InterlockedExchangeAdd((volatile signed __int32 *)(v36 + 64), -v27);
      v24 = 0i64;
      v33 = 0i64;
    }
    __writecr8(CurrentIrql);
    v8 = v37;
    v9 = v39;
  }
  v32.PteIndex = (__int64)(a2 - v8) >> 3;
  *(_QWORD *)a2 = v35 | MiSwizzleInvalidPte(0i64) & 0xFFFFFFFFFFFF0FFFui64;
  if( v39 )
  {
    LODWORD(v30) = MiReleaseLargePteMappings((_MI_SYSTEM_PTE_TYPE *)a1, &v32, 0i64);
  }
  else
  {
    v30 = MiReplenishBitMap(a1, v32.PteIndex, 0i64);
    _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 88), v30);
  }
  _InterlockedExchangeAdd((volatile signed __int32 *)(v36 + 64), -(int)v30);
  return 1i64;
}

Referenced by:

MiReleasePtes
MmUnmapIoSpace