MiDeleteTransitionPte

_MI_PAGE_DELETE_RESULT __stdcall MiDeleteTransitionPte(
        _MMPTE *PointerPte,
        _MMPFN *Pfn1,
        UINT8 PageIrql,
        UINT64 ReleasePageFileInfo){
  __int64 v6; 
  UINT64 v7; 
  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;} v8; 
  __int64 v9; 
  _MMINPAGE_SUPPORT *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; 
  __int64 v13; 
  unsigned __int64 v14; 
  _MI_PAGE_DELETE_RESULT v15; 
  int v16; 
  INT64 v17; 
  UINT64 v18; 
  _MMPFN *v19; 
  __int64 v20; 
  UINT8 v21; 
  char v23; 
  PVOID BugCheckParameter4; 
  UINT64 v25; 
  UINT64 SpinCount; 
  _MI_PARTITION *Partition; 
  UINT8 v28; 
  int v29; 

  v29 = ReleasePageFileInfo;
  v28 = PageIrql;
  v6 = (unsigned __int128)(((char *)Pfn1 - (char *)MmGetPfnDb()) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64;
  v7 = ((unsigned __int64)v6 >> 63) + (v6 >> 3);
  if( (_MMPTE *)(Pfn1->PteLong | 0x8000000000000000ui64) != PointerPte )
    KeBugCheckEx(0x1Au, (PVOID)0x402, PointerPte, (PVOID)PointerPte->u.Long, Pfn1->ListEntry.Blink);
  v8.Long = (unsigned __int64)Pfn1->OriginalPte.u;
  v9 = Pfn1->u4._bf_0 & 0xFFFFFFFFFi64;
  v10 = 0i64;
  Partition = 0i64;
  v11.Long = 0i64;
  if( (v8.Long & 0x400) != 0 )
  {
    if( *(&stru_140C4DB30 + 42) && (v8.Long & 0x10) == 0 )
      v8.Long &= ~*(&stru_140C4DB30 + 42);
    MiDereferenceControlAreaPfnList(
      *(_CONTROL_AREA **)(v8.Hard._bf_0 >> 16),
      (_SUBSECTION *)(v8.Hard._bf_0 >> 16),
      PageIrql,
      2ui64);
    v12.Long = (unsigned __int64)Pfn1->OriginalPte.u;
    v13 = -2049i64;
    if( (v12.Long & 0x400) == 0 )
      v13 = -9i64;
    v14 = v13 & Pfn1->OriginalPte.u.Long;
    if( (v12.Long & 0x400) == 0 )
      v14 &= 0xFFFFFFFFFFFFFFF9ui64;
  }
  else
  {
    v14 = 0i64;
  }
  if( Pfn1->u3.ReferenceCount )
  {
    Pfn1->u2._bf_0 |= 0x4000000000000000ui64;
    v23 = *((_BYTE *)&Pfn1->u3 + 2);
    if( (v23 & 0x20) != 0 && (v23 & 8) == 0 )
    {
      v10 = (_MMINPAGE_SUPPORT *)(Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0
                                - 32);
      if( v10->ListHead[0].Flink == v10->ListHead )
        v10 = 0i64;
    }
    v15 = PageStillReferenced;
  }
  else
  {
    MiUnlinkPageFromList(Pfn1, 0i64);
    if( (*(_DWORD *)(&Pfn1->3 + 1) & 0x400i64) == 0 )
    {
      v11.Long = MiCapturePageFileInfoInline(&Pfn1->OriginalPte, 0i64, 1ui64).u.Long;
      Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF));
    }
    v15 = PageInserted;
  }
  LOBYTE(v16) = MiPteInShadowRange((UINT64)PointerPte);
  if( v16 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v14 & 1) != 0 )
    v14 |= 0x8000000000000000ui64;
  PointerPte->u.Long = v14;
  if( v15 == PageInserted )
    MiInsertPageInFreeOrZeroedList(v7, 2ui64, v17, v18, (UINT64)BugCheckParameter4, v25);
  _InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  v19 = &MmGetPfnDb()[v9];
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v19->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( v19->u2._bf_0 < 0 );
  }
  v20 = v19->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64;
  if( (*(_BYTE *)(&v19->u3 + 1) & 7) != 6 )
    KeBugCheckEx(
      0x4Eu,
      (PVOID)0x99,
      (PVOID)(48 * v9 / 48),
      (PVOID)(*(_BYTE *)(&v19->u3 + 1) & 7),
      (PVOID)(v19->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64));
  v19->u2._bf_0 ^= ((v20 - 1) ^ v19->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
  if( v20 == 1 )
    MiPfnShareCountIsZero(v19, 0i64);
  _InterlockedAnd64(&v19->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  v21 = v28;
  if( v28 != 17 )
    __writecr8(v28);
  if( v10 )
    MiInvalidateCollidedIos(v10);
  if( v11.Long && v29 )
    MiReleasePageFileInfo(Partition, (_MMPTE)v11.Long, v21 == 17);
  return v15;
}

Referenced by:

MiDecommitPages
MiDeletePerSessionProtos
MiDeleteSubsectionPages
MiDeleteSystemPagableVm
MiPurgeFileOnlyPfn
MiTryDeleteTransitionPte
MiWalkEntireImage
MmPurgeSection