MiDeleteSystemPageTable
INT64 __fastcall MiDeleteSystemPageTable(INT64 a1, UINT64 a2, INT64 a3){
__int64 v3;
INT64 v5;
int v6;
INT64 v8;
char v9;
int v10;
unsigned __int64 v11;
_MMPTE *PteBase;
char *v13;
CHAR v15;
UINT64 LeafVa;
BOOL v17;
unsigned __int64 v18;
MMPTE *v19;
unsigned __int64 v20;
struct _KLOCK_QUEUE_HANDLE LockHandle;
INT64 v22;
v3 = *(_QWORD *)(a1 + 168);
memset(&LockHandle, 0, sizeof(LockHandle));
v5 = *(_QWORD *)(v3 + 16);
v6 = a3;
v8 = MI_READ_PTE_LOCK_FREE(a2);
v9 = v8;
v22 = v8;
if( (v8 & 1) != 0 )
{
v10 = 0;
v11 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v22) >> 12) & 0xFFFFFFFFFi64;
PteBase = MmGetPteBase();
if( v9 >= 0 )
{
v13 = (char *)MmGetPfnDb() + 48 * v11;
if( v6 <= ((*(unsigned __int8 *)(a1 + 2) >> 2) & 7) )
{
v15 = 0;
}
else
{
if( (*((_QWORD *)v13 + 3) & 0x3FFFFFFFFFFFFFFFi64) != 1
|| *((_WORD *)v13 + 16) != 1
|| RtlCompareMemoryUlong((PVOID)((__int64)((a2 << 25) - ((_QWORD)PteBase << 25)) >> 16), 0x1000ui64, 0) != 4096 )
{
return 0i64;
}
v15 = 1;
}
if( v6 >= 1 )
{
if( !(unsigned int)MiEvictPageTableLock(*(_QWORD *)(a1 + 24), (volatile UINT64 *)a2, ZeroPte, v15) )
return 0i64;
v10 = 1;
}
MiAddSystemPageTableToList((_QWORD *)(v3 + 8), (INT64)v13);
PteBase = MmGetPteBase();
}
if( v6 >= 1 && v9 < 0 )
{
MiInsertLargeTbFlushEntry(v5, (unsigned int)v6, a2);
}
else
{
MiInsertTbFlushEntry(v5, (__int64)((a2 << 25) - ((_QWORD)PteBase << 25)) >> 16, 1i64, 0i64);
if( v6 == 1 )
{
LeafVa = MiGetLeafVa(a2);
MiInsertTbFlushEntry(v5, LeafVa, 512i64, 0i64);
}
}
if( !v10 )
{
v17 = MiPteInShadowRange(a2);
if( v6 == 3 )
{
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
v18 = ZeroPte;
if( v17 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ZeroPte & 1) != 0 )
v18 = ZeroPte | 0x8000000000000000ui64;
*(_QWORD *)a2 = v18;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
goto LABEL_28;
}
v20 = ZeroPte;
if( v17 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ZeroPte & 1) != 0 )
v20 = ZeroPte | 0x8000000000000000ui64;
*(_QWORD *)a2 = v20;
}
if( v6 == 3 )
{
LABEL_28:
v19 = (_MMPTE *)((char *)MmGetPteBase() + ((MiGetLeafVa(a2) >> 9) & 0x7FFFFFFFF8i64));
MiReplicatePteChange(v19, v19);
}
}
return 0i64;
}Referenced by:
No references.