MiInsertCachedPte

NTSTATUS __stdcall MiInsertCachedPte(_MI_SYSTEM_PTE_TYPE *PteInfo, _MMPTE *PointerPte, UINT64 NumberOfPtes){
  __int64 v3; 
  __int64 v6; 
  unsigned __int64 BasePte; 
  int v9; 
  unsigned __int64 PteBase; 
  unsigned __int64 v11; 
  _MMPTE *Pml4eBase; 
  _MMPTE *PxeUserLimit; 
  __int64 v14; 
  _MMPTE *v15; 
  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;} v16; 
  volatile _MI_CACHED_PTES *CachedPtes; 
  __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; 
  NTSTATUS v27; 
  unsigned __int64 v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  int v31; 
  unsigned __int64 v32; 
  signed __int32 v33[8]; 
  _MI_CACHED_PTE v34; 
  __int64 v35; 
  _MI_CACHED_PTE CachedPte; 
  __int64 v37; 
  __int64 v38; 
  _MMPTE *v39; 
  unsigned int v40; 
  int v41; 

  v40 = NumberOfPtes;
  v3 = (unsigned int)NumberOfPtes;
  v34 = 0i64;
  if( MiIsPteCachingOptimizationEnabled() )
  {
    if( (unsigned int)v3 >= 0x200 )
      return 0;
  }
  else if( (unsigned int)v3 > 0x40 )
  {
    return 0;
  }
  BasePte = (unsigned __int64)PteInfo->BasePte;
  v39 = (_MMPTE *)BasePte;
  v9 = 0;
  v41 = 0;
  PteBase = (unsigned __int64)MmGetPteBase();
  v11 = (__int64)(((_QWORD)PointerPte << 25) - (PteBase << 25)) >> 16;
  if( v11 >= PteBase && v11 <= (unsigned __int64)MmGetPteLimit() )
  {
    v9 = 1;
    v41 = 1;
    BasePte = PteBase + ((BasePte >> 9) & 0x7FFFFFFFF8i64);
    v39 = (_MMPTE *)BasePte;
    if( (unsigned int)v3 > (4096 - ((unsigned __int16)PointerPte & 0xFFFu)) >> 3 )
      return 0;
  }
  if( PointerPte == (_MMPTE *)BasePte )
    return 0;
  Pml4eBase = MmGetPml4eBase();
  PxeUserLimit = MmGetPxeUserLimit();
  if( (_DWORD)v3 == 1 )
  {
    v14 = 4096i64;
  }
  else
  {
    v15 = PointerPte + 1;
    v16.Long = v3 << 32;
    if( *(&stru_140C4DB30 + 42) )
    {
      if( (v16.Long & *(&stru_140C4DB30 + 42)) != 0 )
        v16.Long |= 0x10ui64;
      else
        v16.Long |= *(&stru_140C4DB30 + 42);
    }
    if( v15 >= Pml4eBase
      && v15 <= PxeUserLimit
      && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
      && (v16.Long & 1) != 0 )
    {
      v16.Long |= v6;
    }
    v15->u.Long = v16.Long;
    v14 = 0i64;
  }
  CachedPtes = PteInfo->CachedPtes;
  v37 = v14;
  if( v9 )
    CachedPtes += (unsigned __int16)KeNumberNodes;
  v18 = (__int64)&CachedPtes[KeGetCurrentPrcb()->ParentNode->Affinity.Reserved[0]];
  v38 = v18;
  _InterlockedOr(v33, 0);
  v19 = KiTbFlushTimeStamp;
  if( !(_DWORD)KiTbFlushTimeStamp )
  {
    do
    {
      KeFlushTb(FlushKernel, FlushAllAwakeProcessors);
      _InterlockedOr(v33, 0);
      v19 = KiTbFlushTimeStamp;
    }
    while( !(_DWORD)KiTbFlushTimeStamp );
    v18 = v38;
    v9 = v41;
  }
  v20 = (volatile signed __int64 *)(v18 + 8i64 * (v19 & 7));
  if( v9 )
  {
    v21 = v3 + *(int *)(v18 + 64);
    if( v21 >= 0x80 )
    {
      MiEmptyPteBins(PteInfo, (CHAR *)1);
      return 0;
    }
    if( v21 >= 0x40 )
    {
      MiEmptyPteBins(PteInfo, 0i64);
      v9 = v41;
    }
  }
  v22 = 0i64;
  if( *(&stru_140C4DB30 + 42) )
    v22 = *(&stru_140C4DB30 + 42);
  v23 = v14 | v22 & 0xFFFFFFFFFFFF0FFFui64;
LABEL_34:
  v24 = *v20;
  v35 = *v20;
  while( 1 )
  {
    while( 1 )
    {
      CachedPte = (_MI_CACHED_PTE)v24;
      if( (_DWORD)v24 != v19 )
      {
        if( HIDWORD(v24) )
          break;
      }
      if( v23 )
      {
        if( *(&stru_140C4DB30 + 42) )
        {
          if( (v23 & 0x10) != 0 )
            LODWORD(v23) = v23 & 0xFFFFFFEF;
          else
            LODWORD(v23) = ~*(&stru_140C4DB30 + 84) & v23;
        }
      }
      else
      {
        LODWORD(v23) = 0;
      }
      v23 = ((unsigned __int64)HIDWORD(v35) << 32) | (unsigned int)v23;
      if( *(&stru_140C4DB30 + 42) )
      {
        if( (*(&stru_140C4DB30 + 42) & v23) != 0 )
          v23 |= 0x10ui64;
        else
          v23 |= *(&stru_140C4DB30 + 42);
      }
      v29 = v23;
      if( PointerPte >= MmGetPml4eBase()
        && PointerPte <= MmGetPxeUserLimit()
        && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
        && (v23 & 1) != 0 )
      {
        v29 = v23 | 0x8000000000000000ui64;
      }
      PointerPte->u.Long = v29;
      v34.GlobalTimeStamp = v19;
      v34.PteIndex = (__int64)((__int64)PointerPte - BasePte) >> 3;
      v24 = _InterlockedCompareExchange64(v20, v34.Long, v24);
      v35 = v24;
      if( v24 == CachedPte )
      {
        _InterlockedExchangeAdd((volatile signed __int32 *)(v38 + 64), v40);
        return 1;
      }
    }
    if( !(_DWORD)v24 )
      goto LABEL_34;
    _InterlockedOr(v33, 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);
    v35 = v24;
    if( v24 == CachedPte )
    {
      if( v9 )
      {
        v27 = MiReleaseLargePteMappings(PteInfo, &CachedPte, 0i64);
      }
      else
      {
        LODWORD(v28) = MiReplenishBitMap(PteInfo, CachedPte.PteIndex, 0i64);
        v27 = v28;
        _InterlockedExchangeAdd64((volatile signed __int64 *)&PteInfo->TotalFreeSystemPtes, v28);
      }
      _InterlockedExchangeAdd((volatile signed __int32 *)(v38 + 64), -v27);
      v24 = 0i64;
      v35 = 0i64;
    }
    __writecr8(CurrentIrql);
    BasePte = (unsigned __int64)v39;
    v9 = v41;
  }
  v34.PteIndex = (__int64)((__int64)PointerPte - BasePte) >> 3;
  v30 = v37 | MiSwizzleInvalidPte(0i64) & 0xFFFFFFFFFFFF0FFFui64;
  LOBYTE(v31) = MiPteInShadowRange((UINT64)PointerPte);
  if( v31 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v30 & 1) != 0 )
    v30 |= 0x8000000000000000ui64;
  PointerPte->u.Long = v30;
  if( v41 )
  {
    LODWORD(v32) = MiReleaseLargePteMappings(PteInfo, &v34, 0i64);
  }
  else
  {
    LODWORD(v32) = MiReplenishBitMap(PteInfo, v34.PteIndex, 0i64);
    _InterlockedExchangeAdd64((volatile signed __int64 *)&PteInfo->TotalFreeSystemPtes, v32);
  }
  _InterlockedExchangeAdd((volatile signed __int32 *)(v38 + 64), -(int)v32);
  return 1;
}

Referenced by:

MiReleasePtes
MmUnmapIoSpace