MiReleaseProcessReferenceToSessionDataPage

VOID __stdcall MiReleaseProcessReferenceToSessionDataPage(_MM_SESSION_SPACE *SessionGlobal){
  unsigned int v2; 
  UINT64 v3; 
  __int64 v4; 
  __int64 v5; 
  _MMPFN *PfnDb; 
  _MMPFN *v7; 
  _MMPTE *PteAddress; 
  unsigned __int64 v9; 
  _MMPFN *v10; 
  _KTBFLUSH_TYPE v11; 
  _ETHREAD *CurrentThread; 

  if( _InterlockedExchangeAdd((volatile signed __int32 *)SessionGlobal + 3, 0xFFFFFFFF) == 1 )
  {
    MiUnlinkSessionList(SessionGlobal);
    v2 = *((_DWORD *)SessionGlobal + 2);
    LODWORD(v4) = MiPartitionIdToPointer(*((_WORD *)SessionGlobal + 215), v3);
    v5 = v4;
    PfnDb = MmGetPfnDb();
    v7 = &PfnDb[*((_QWORD *)SessionGlobal + 4)];
    MiLockAndDecrementShareCount(v7, 1ui64);
    MiLockAndDecrementShareCount(v7, 0i64);
    PteAddress = MiGetPteAddress(SessionGlobal);
    LODWORD(v9) = MI_READ_PTE_LOCK_FREE((INT64)PteAddress);
    v10 = &PfnDb[(v9 >> 12) & 0xFFFFFFFFFi64];
    MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), PteAddress, 1ui64, v11);
    MiReturnPfnReferenceCount(v10);
    PsDereferencePartition(*(_QWORD *)(v5 + 176));
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.SpecialApcDisable;
    ExAcquirePushLockExclusiveEx(&stru_140C4DAF8, 0i64);
    _bittestandreset(*(signed __int32 **)(*(&stru_140C4DB30 + 548) + 8i64), v2);
    if( (_InterlockedExchangeAdd64(&stru_140C4DAF8._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&stru_140C4DAF8);
    KeAbPostRelease(&stru_140C4DAF8);
    KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  }
}

Referenced by:

MiSessionObjectDelete
MmDeleteProcessAddressSpace