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