MiReleaseSystemCacheView
VOID __stdcall MiReleaseSystemCacheView(_MMPTE *FirstPte){
__int64 v2;
unsigned __int64 v3;
__int64 v4;
__int64 v5;
_MMPTE *v6;
unsigned __int64 v7;
__int64 v8;
unsigned __int64 Long;
int v10;
unsigned __int64 v11;
__int64 v12;
CHAR *v13;
void *v14;
void *v15;
UINT64 v16;
_MI_TB_FLUSH_LIST *v17;
__int64 *v18;
__int64 v19;
UINT64 WsIrql;
__int64 v21;
__int64 v22;
_KLOCK_QUEUE_HANDLE LockHandle;
__int64 v24[8];
LOBYTE(WsIrql) = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(v24, 0i64, sizeof(v24));
v2 = 0i64;
v3 = 0i64;
v22 = (_QWORD)MmGetPteBase() << 25;
LODWORD(v4) = MiGetSystemCacheReverseMap((((_QWORD)FirstPte << 25) - v22) >> 16);
v5 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * ((*(_DWORD *)(v4 + 32) >> 6) & 0x3FF));
v21 = v5;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 183, &LockHandle);
if( MiDecrementSystemCacheViewCount((((_QWORD)FirstPte << 25) - v22) >> 16) )
{
InsertTailListPte(v5 + 1784, &FirstPte->u.Long);
}
else
{
v3 = (unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64;
v6 = (_MMPTE *)((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64);
v7 = ((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64) + 4096;
if( ((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64) < v7 )
{
do
{
if( v6 != FirstPte )
{
RemoveListEntryPte((UINT64 *)(v5 + 1784), &v6->u.Long);
LODWORD(v8) = MiGetPteLink(v6[3].u.Long);
if( v8 == 1 )
{
v24[v2] = (__int64)v6;
v2 = (unsigned int)(v2 + 1);
}
else
{
Long = ZeroPte.u.Long;
LOBYTE(v10) = MiPteInShadowRange((UINT64)&v6[3]);
if( v10 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
v6[3].u.Long = Long;
v5 = v21;
v7 = v3 + 4096;
}
}
v6 += 64;
}
while( (unsigned __int64)v6 < v7 );
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v3 )
{
if( (_DWORD)v2 )
{
v18 = v24;
v19 = (unsigned int)v2;
do
{
MiWaitForSystemCacheViewFlush((_MI_FREE_SYSTEM_CACHE *)*v18++);
--v19;
}
while( v19 );
}
v11 = v3 << 25;
v12 = (__int64)(v11 - v22) >> 16;
v13 = MiLockWorkingSetOptimal(v5 + 7232, (UINT64)FirstPte, &WsIrql);
LODWORD(v14) = MiGetSystemCacheReverseMap(v12);
v15 = v14;
MiSetSystemCacheReverseMap(v12, 0i64);
MiUnlockPageTableInternal(v5 + 7232, (UINT64)v13);
LOBYTE(v16) = WsIrql;
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)(v5 + 7232), v16);
MiReturnSystemVa((VOID *)v12, (VOID *)((__int64)(v11 - v22 + 0x2000000000i64) >> 16), MiVaSystemCache, v17);
ExFreePoolWithTag(v15, 0);
}
}Referenced by:
MmFreeSystemCacheReserveView
MmUnmapViewInSystemCache