MiReadWriteAnyLevelShadowPte
UINT64 __fastcall MiReadWriteAnyLevelShadowPte(UINT64 a1, INT64 a2, INT64 a3, UINT64 a4){
__int64 v5;
__int64 v6;
__int64 v7;
UINT64 *v8;
UINT8 v9;
UINT64 *v10;
__int64 v11;
ULONG_PTR v12;
ULONG_PTR v13;
UINT64 *v14;
ULONG_PTR v15;
ULONG_PTR BugCheckParameter4;
__int64 v18;
ULONG_PTR BugCheckParameter2[2];
__int128 v20;
UINT8 OldIrql;
int v22;
v22 = a3;
*(_OWORD *)BugCheckParameter2 = 0i64;
v5 = *((_QWORD *)KeGetCurrentThread() + 23);
v6 = (int)a2;
v18 = (int)a2;
v7 = (int)a2;
v20 = 0i64;
v8 = *(UINT64 **)(v5 + 1928);
if( (int)a2 < 4i64 )
{
LODWORD(a2) = 4;
do
{
BugCheckParameter2[v6] = a1;
a1 = (UINT64)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64);
++v6;
}
while( v6 < 4 );
}
BugCheckParameter4 = 0i64;
v9 = 17;
OldIrql = 17;
v10 = v8;
v11 = (int)a2;
do
{
v12 = BugCheckParameter2[--v11];
if( v11 == 3 )
{
v10 += (v12 >> 3) & 0x1FF;
}
else
{
if( v9 != 17 )
MiUnmapPageInHyperSpaceWorker(v8, v9, 0x80000000ui64);
v13 = BugCheckParameter4;
MiPteInShadowRange((UINT64)&BugCheckParameter4);
LODWORD(v14) = MiMapPageInHyperSpaceWorker((v13 >> 12) & 0xFFFFFFFFFi64, &OldIrql, 0x80000000ui64);
v9 = OldIrql;
v8 = v14;
v7 = v18;
v10 = &v14[(v12 >> 3) & 0x1FF];
}
if( v22 && v11 == v7 )
{
if( (a4 & 1) != 0 )
{
if( !v11 )
a4 |= 0x100ui64;
*v10 = a4;
}
else
{
*v10 = a4;
}
}
else
{
v15 = MI_READ_PTE_LOCK_FREE((INT64)v10);
BugCheckParameter4 = v15;
if( v11 && (v15 & 1) != 0 && (v15 & 0x80u) != 0i64 )
KeBugCheckEx(0x1Au, 0x3606ui64, v12, 0i64, BugCheckParameter4);
}
v7 = v18;
}
while( v11 != v18 );
if( v9 != 17 )
MiUnmapPageInHyperSpaceWorker(v8, v9, 0x80000000ui64);
return BugCheckParameter4;
}Referenced by:
MiCheckKernelShadow
MiInitializeShadowPageTable
MmDeleteShadowMapping