MiJumpStackTarget
VOID __stdcall MiJumpStackTarget(VOID *Parameter){
_QWORD *v2;
__int64 v3;
signed __int32 v4;
unsigned int v5;
_MMPFN *PfnDb;
_MMPFN *v7;
_MMSUPPORT_INSTANCE *v8;
_MMPFN *v9;
__int64 v10;
UINT16 v11;
UINT64 PteBase;
char v13;
_LIST_ENTRY *Blink;
unsigned int v15;
unsigned __int64 *v16;
unsigned __int64 Long;
int v18;
__int64 v19;
signed __int32 v20;
unsigned int v21;
char WsIrql;
UINT64 SpinCount;
UINT64 v24;
UINT64 v25;
LODWORD(v24) = 0;
v2 = *(_QWORD **)Parameter;
v3 = *((_QWORD *)Parameter + 2);
v4 = _InterlockedDecrement((volatile signed __int32 *)v3);
v5 = ~v4 & 0x80000000;
if( (v4 & 0x7FFFFFFF) != 0 )
{
while( (*(_DWORD *)v3 & 0x80000000) != v5 )
KeYieldProcessorEx(&v24);
}
else
{
*(_DWORD *)v3 = v5 | *(_DWORD *)(v3 + 4);
if( !*((_DWORD *)v2 + 10) )
{
PfnDb = MmGetPfnDb();
v7 = &PfnDb[*v2];
v8 = (_MMSUPPORT_INSTANCE *)v2[8];
v9 = &PfnDb[v2[1]];
v10 = 0i64;
v11 = (v2[7] != 0i64) + 1;
MiLockWorkingSetShared();
LODWORD(SpinCount) = 0;
WsIrql = v13;
while( _interlockedbittestandset64((volatile signed __int32 *)&v7->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v7->u2._bf_0 < 0 );
}
if( *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v7->u4._bf_0 >> 39) & 0x3FF)) == v2[4]
&& MiCanStealKernelStack(v7, v11) == 1
&& ((MiGetLeafPfnBuddy(v7) + 32) & 0xFFFFFFFFFFFFFFDFui64) != 0
&& (PteBase = (UINT64)MmGetPteBase(), v2[6] == (__int64)((v7->PteLong << 25) - (PteBase << 25)) >> 16)
&& (Blink = v7->ListEntry.Blink,
(v10 = (PteBase + (((unsigned __int64)Blink >> 9) & 0x7FFFFFFFF8i64)) & -(__int64)(MiLockPageTableInternal(
(INT64)v8,
PteBase
+ (((unsigned __int64)Blink >> 9) & 0x7FFFFFFFF8i64),
(UINT8 *)1) != 0)) != 0) )
{
if( v2[7] )
{
MiRemoveLockedPageChargeAndDecRef(v7);
v2[7] = 0i64;
}
if( (MiFlags & 0x800) != 0 )
{
MiStackTheftFreezeProcessors(v2);
v15 = 0;
}
else
{
v15 = MiSwapStackPageNoDpc(0i64, v7, v9) != 1 ? 0xC0000434 : 0;
}
}
else
{
v15 = -1073740748;
}
*((_DWORD *)v2 + 10) = v15;
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( v10 )
MiUnlockPageTableInternal((INT64)v8, v10);
LOBYTE(PteBase) = WsIrql;
MiUnlockWorkingSetShared(v8, PteBase);
v16 = (unsigned __int64 *)v2[2];
Long = ZeroPte.u.Long;
LOBYTE(v18) = MiPteInShadowRange((UINT64)v16);
if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*v16 = Long;
}
}
v19 = *((_QWORD *)Parameter + 2);
v20 = _InterlockedDecrement((volatile signed __int32 *)v19);
v21 = ~v20 & 0x80000000;
if( (v20 & 0x7FFFFFFF) != 0 )
{
LODWORD(v25) = 0;
while( (*(_DWORD *)v19 & 0x80000000) != v21 )
KeYieldProcessorEx(&v25);
}
else
{
*(_DWORD *)v19 = v21 | *(_DWORD *)(v19 + 4);
}
_InterlockedDecrement(*((volatile signed __int32 **)Parameter + 1));
}Referenced by:
MiDoStackCopy