MmUpdateUserShadowStackValue
INT64 __fastcall MmUpdateUserShadowStackValue(UINT64 a1, INT64 a2){
INT64 v3;
void *v4;
int v5;
INT64 v6;
INT64 *v7;
UINT8 v8;
_MMPTE *v9;
INT64 v10;
unsigned __int64 v11;
char *v12;
__int64 v13;
volatile signed __int64 *v14;
BOOL v15;
UINT64 v16;
INT64 v17;
INT64 v18;
unsigned int v19;
UINT64 SpinCount;
INT64 v22;
INT64 v23;
__int64 v24[8];
UINT8 v26;
INT64 v27;
LODWORD(v27) = 0;
v23 = 0i64;
if( (a1 & 7) != 0 )
ExRaiseDatatypeMisalignment();
v3 = MiObtainReferencedVadEx(a1, 0, &v27);
v4 = (void *)v3;
v22 = v3;
if( v3 )
{
v5 = *(_DWORD *)(v3 + 48);
if( (v5 & 0x100000) != 0 && (v5 & 0x1000000) == 0 && (v5 & 0x4000000) != 0 )
{
v6 = *((_QWORD *)KeGetCurrentThread() + 23) + 1664i64;
v7 = (INT64 *)((char *)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64));
while( 1 )
{
v8 = MiLockWorkingSetShared(v6);
v26 = v8;
v9 = MiLockLowestValidPageTable(v6, v7, (INT64 **)&v23);
v10 = MI_READ_PTE_LOCK_FREE(v23);
v24[0] = v10;
if( v9 == (_MMPTE *)((char *)MmGetPteBase() + (((unsigned __int64)v7 >> 9) & 0x7FFFFFFFF8i64))
&& (v10 & 1) != 0 )
{
break;
}
MiUnlockPageTableInternal(v6, (UINT64)v9);
MiUnlockWorkingSetShared(v6, v8);
}
v11 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)v24) >> 12) & 0xFFFFFFFFFi64;
v12 = (char *)MmGetPfnDb() + 48 * v11;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v12 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v12 + 3) < 0 );
}
LODWORD(v13) = MiMapPageInHyperSpaceWorker(v11, 0i64, 0x80000000ui64);
v14 = (volatile signed __int64 *)((a1 & 0xFFF) + v13);
v15 = a2 == _InterlockedCompareExchange64(v14, 0i64, a2);
MiUnmapPageInHyperSpaceWorker((PVOID)v14, 0x11u, 0x80000000ui64);
v16 = MiCaptureDirtyBitToPfn((INT64)v12);
if( v16 )
v18 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v12 + 5) >> 39) & 0x3FFi64));
else
v18 = 0i64;
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( v16 )
MiReleasePageFileInfo(v18, v16, 1, v17, SpinCount, v22, v23, v24[0], v24[1], v24[2], v24[3], v24[4]);
MiUnlockPageTableInternal(v6, (UINT64)v9);
MiUnlockWorkingSetShared(v6, v26);
v19 = !v15 ? 0xC0000272 : 0;
}
else
{
v19 = -1073741800;
}
}
else
{
v19 = v27;
}
if( v4 )
MiUnlockAndDereferenceVad(v4);
return v19;
}Referenced by:
PspFreeUserFiberShadowStack