MiReleaseSystemCacheView
VOID __stdcall MiReleaseSystemCacheView(MMPTE *FirstPte){
__int64 v2;
unsigned __int64 v3;
__int64 v4;
UINT64 *v5;
unsigned __int64 v6;
unsigned __int64 v7;
__int64 v8;
CHAR *v9;
void *SystemCacheReverseMap;
__int64 *v11;
__int64 v12;
char v13[8];
__int64 v14;
__int64 v15;
struct _KLOCK_QUEUE_HANDLE LockHandle;
__int64 result[8];
v13[0] = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
memset((INT64)result, 0i64);
v2 = 0i64;
v3 = 0i64;
v15 = (_QWORD)MmGetPteBase() << 25;
v4 = *(_QWORD *)(qword_140C4E388
+ 8i64
* ((*(_DWORD *)(MiGetSystemCacheReverseMap((((_QWORD)FirstPte << 25) - v15) >> 16) + 32) >> 6) & 0x3FF));
v14 = v4;
KeAcquireInStackQueuedSpinLock(&qword_140C4E0E8, &LockHandle);
if( MiDecrementSystemCacheViewCount((((_QWORD)FirstPte << 25) - v15) >> 16) )
{
InsertTailListPte(v4 + 1784, (UINT64 *)FirstPte);
}
else
{
v3 = (unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64;
v5 = (UINT64 *)((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64);
v6 = ((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64) + 4096;
if( ((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64) < v6 )
{
do
{
if( v5 != (UINT64 *)FirstPte )
{
RemoveListEntryPte((UINT64 *)(v4 + 1784), v5);
if( MiGetPteLink(v5[3]) == 1 )
{
result[v2] = (__int64)v5;
v2 = (unsigned int)(v2 + 1);
}
else
{
v5[3] = ZeroPte;
v4 = v14;
v6 = v3 + 4096;
}
}
v5 += 64;
}
while( (unsigned __int64)v5 < v6 );
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v3 )
{
if( (_DWORD)v2 )
{
v11 = result;
v12 = (unsigned int)v2;
do
{
MiWaitForSystemCacheViewFlush(*v11++);
--v12;
}
while( v12 );
}
v7 = v3 << 25;
v8 = (__int64)(v7 - v15) >> 16;
v9 = MiLockWorkingSetOptimal(v4 + 7232, (UINT64)FirstPte, (BYTE *)v13);
SystemCacheReverseMap = (void *)MiGetSystemCacheReverseMap(v8);
MiSetSystemCacheReverseMap(v8, 0i64);
MiUnlockPageTableInternal(v4 + 7232, (UINT64)v9);
MiUnlockWorkingSetShared(v4 + 7232, v13[0]);
MiReturnSystemVa(v8, (__int64)(v7 - v15 + 0x2000000000i64) >> 16, 8i64);
ExFreePoolWithTag(SystemCacheReverseMap, 0);
}
}Referenced by:
MmFreeSystemCacheReserveView
MmUnmapViewInSystemCache