MiReadWriteAnyLevelShadowPte
UINT64 __fastcall MiReadWriteAnyLevelShadowPte(unsigned __int64 a1, int a2, int a3, unsigned __int64 a4){
_EPROCESS *Process;
__int64 v6;
__int64 v7;
unsigned __int64 *ShadowMapping;
UINT8 v9;
unsigned __int64 *v10;
__int64 v11;
unsigned __int64 v12;
UINT64 v13;
char *v14;
UINT64 v15;
unsigned __int64 v17;
int v18;
UINT64 BugCheckParameter4;
__int64 v20;
PVOID BugCheckParameter2[2];
__int128 v22;
UINT8 OldIrql;
int v24;
v24 = a3;
*(_OWORD *)BugCheckParameter2 = 0i64;
Process = KeGetCurrentThread()->ApcState.Process;
v6 = a2;
v20 = a2;
v7 = a2;
v22 = 0i64;
ShadowMapping = (unsigned __int64 *)Process->Vm.Shared.ShadowMapping;
if( a2 < 4i64 )
{
a2 = 4;
do
{
BugCheckParameter2[v6] = (PVOID)a1;
a1 = (unsigned __int64)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64);
++v6;
}
while( v6 < 4 );
}
BugCheckParameter4 = 0i64;
v9 = 17;
OldIrql = 17;
v10 = ShadowMapping;
v11 = a2;
do
{
v12 = (unsigned __int64)BugCheckParameter2[--v11];
if( v11 == 3 )
{
v10 += (v12 >> 3) & 0x1FF;
}
else
{
if( v9 != 17 )
MiUnmapPageInHyperSpaceWorker(ShadowMapping, v9, 0x80000000ui64);
v13 = BugCheckParameter4;
MiPteInShadowRange((UINT64)&BugCheckParameter4);
v14 = (char *)MiMapPageInHyperSpaceWorker((v13 >> 12) & 0xFFFFFFFFFi64, &OldIrql, 0x80000000ui64);
v9 = OldIrql;
ShadowMapping = (unsigned __int64 *)v14;
v7 = v20;
v10 = (unsigned __int64 *)&v14[8 * ((v12 >> 3) & 0x1FF)];
}
if( v24 && v11 == v7 )
{
if( (a4 & 1) != 0 )
{
if( !v11 )
a4 |= 0x100ui64;
v17 = a4;
LOBYTE(v18) = MiPteInShadowRange((UINT64)v10);
if( v18 )
{
if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (a4 & 1) != 0 )
v17 = a4 | 0x8000000000000000ui64;
v9 = OldIrql;
}
*v10 = v17;
}
else
{
MiPteInShadowRange((UINT64)v10);
*v10 = a4;
}
}
else
{
LODWORD(v15) = MI_READ_PTE_LOCK_FREE((INT64)v10);
BugCheckParameter4 = v15;
if( v11 && (v15 & 1) != 0 && (v15 & 0x80u) != 0i64 )
KeBugCheckEx(0x1Au, (PVOID)0x3606, (PVOID)v12, 0i64, (PVOID)BugCheckParameter4);
}
v7 = v20;
}
while( v11 != v20 );
if( v9 != 17 )
MiUnmapPageInHyperSpaceWorker(ShadowMapping, v9, 0x80000000ui64);
return BugCheckParameter4;
}Referenced by:
MiCheckKernelShadow
MiInitializeShadowPageTable
MiMakeShadowPageTableRange
MmDeleteShadowMapping