MmUpdateUserShadowStackValue
NTSTATUS __stdcall MmUpdateUserShadowStackValue(UINT64 a1, INT64 a2){
UINT64 v3;
_MMVAD_SHORT *v4;
int v5;
_MMSUPPORT_FULL *p_Vm;
INT64 *v7;
char v8;
char v9;
_MMPTE *v10;
__int64 v11;
unsigned __int64 v12;
__int64 v13;
_MMPFN *v14;
volatile signed __int64 *v15;
_BOOL4 v16;
_MMPTE v17;
_MI_PARTITION *v18;
UINT64 v19;
NTSTATUS v20;
UINT64 v21;
UINT64 SpinCount[2];
INT64 v24;
__int64 v25[8];
char WsIrql;
INT64 v28;
LODWORD(v28) = 0;
v24 = 0i64;
if( (a1 & 7) != 0 )
ExRaiseDatatypeMisalignment();
LODWORD(v3) = MiObtainReferencedVadEx(a1, 0, &v28);
v4 = (_MMVAD_SHORT *)v3;
SpinCount[1] = v3;
if( v3 )
{
v5 = *(_DWORD *)(v3 + 48);
if( (v5 & 0x100000) != 0 && (v5 & 0x1000000) == 0 && (v5 & 0x4000000) != 0 )
{
p_Vm = &KeGetCurrentThread()->ApcState.Process->Vm;
v7 = (INT64 *)((char *)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64));
while( 1 )
{
MiLockWorkingSetShared();
v9 = v8;
WsIrql = v8;
v10 = MiLockLowestValidPageTable((INT64)p_Vm, v7, (INT64 **)&v24);
LODWORD(v11) = MI_READ_PTE_LOCK_FREE(v24);
v25[0] = v11;
if( v10 == (_MMPTE *)((char *)MmGetPteBase() + (((unsigned __int64)v7 >> 9) & 0x7FFFFFFFF8i64))
&& (v11 & 1) != 0 )
{
break;
}
MiUnlockPageTableInternal((INT64)p_Vm, (UINT64)v10);
LOBYTE(v21) = v9;
MiUnlockWorkingSetShared(&p_Vm->Instance, v21);
}
LODWORD(v12) = MI_READ_PTE_LOCK_FREE((INT64)v25);
v13 = (v12 >> 12) & 0xFFFFFFFFFi64;
v14 = &MmGetPfnDb()[v13];
LODWORD(SpinCount[0]) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v14->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(SpinCount);
while( v14->u2._bf_0 < 0 );
}
v15 = (volatile signed __int64 *)((char *)MiMapPageInHyperSpaceWorker(v13, 0i64, 0x80000000ui64) + (a1 & 0xFFF));
v16 = a2 == _InterlockedCompareExchange64(v15, 0i64, a2);
MiUnmapPageInHyperSpaceWorker((VOID *)v15, 0x11u, 0x80000000ui64);
MiCaptureDirtyBitToPfn();
if( v17.u.Long )
v18 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v14->u4._bf_0 >> 39) & 0x3FF));
else
v18 = 0i64;
_InterlockedAnd64(&v14->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( v17.u.Long )
MiReleasePageFileInfo(v18, v17, 1ui64);
MiUnlockPageTableInternal((INT64)p_Vm, (UINT64)v10);
LOBYTE(v19) = WsIrql;
MiUnlockWorkingSetShared(&p_Vm->Instance, v19);
v20 = !v16 ? 0xC0000272 : 0;
}
else
{
v20 = -1073741800;
}
}
else
{
v20 = v28;
}
if( v4 )
MiUnlockAndDereferenceVad(v4);
return v20;
}Referenced by:
PspFreeUserFiberShadowStack