MiStackTheftIsr
ULONG_PTR __fastcall MiStackTheftIsr(ULONG_PTR Argument){
VOID *v1;
__int64 v2;
unsigned __int8 CurrentIrql;
signed __int32 v4;
unsigned int v5;
_MMPFN *PfnDb;
_MMPFN *v7;
_MMPFN *v8;
char v9;
signed __int32 v10;
unsigned int v11;
signed __int32 v12;
ULONG_PTR result;
UINT64 SpinCount;
UINT64 v15;
UINT64 v16;
v1 = *(VOID **)(*(_QWORD *)&Argument + 48i64);
v2 = *(_QWORD *)&Argument;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
LODWORD(v15) = 0;
v4 = _InterlockedDecrement((volatile signed __int32 *)(*(_QWORD *)&Argument + 72i64));
v5 = ~v4 & 0x80000000;
if( (v4 & 0x7FFFFFFF) != 0 )
{
while( (*(_DWORD *)(v2 + 72) & 0x80000000) != v5 )
KeYieldProcessorEx(&v15);
LODWORD(v16) = 0;
v12 = _InterlockedDecrement((volatile signed __int32 *)(v2 + 72));
v11 = ~v12 & 0x80000000;
if( (v12 & 0x7FFFFFFF) == 0 )
goto LABEL_3;
while( (*(_DWORD *)(v2 + 72) & 0x80000000) != v11 )
KeYieldProcessorEx(&v16);
}
else
{
PfnDb = MmGetPfnDb();
*(_DWORD *)(v2 + 72) = v5 | *(_DWORD *)(v2 + 76);
v7 = &PfnDb[*(_QWORD *)v2];
v8 = &PfnDb[*(_QWORD *)(v2 + 8)];
MiCopyKstack(v8, v7, *(_MMPTE **)(v2 + 16));
KeFlushSingleCurrentTb(v1);
MiSwitchKstackPages(v8, v7);
v7->u4._bf_0 &= ~0x8000000000000000ui64;
*((_BYTE *)&v7->u3 + 2) &= 0xC7u;
v9 = *((_BYTE *)&v7->u3 + 3) & 0xDF;
LODWORD(SpinCount) = 0;
*((_BYTE *)&v7->u3 + 3) = v9;
v10 = _InterlockedDecrement((volatile signed __int32 *)(v2 + 72));
v11 = ~v10 & 0x80000000;
if( (v10 & 0x7FFFFFFF) == 0 )
{
LABEL_3:
*(_DWORD *)(v2 + 72) = v11 | *(_DWORD *)(v2 + 76);
goto LABEL_13;
}
while( (*(_DWORD *)(v2 + 72) & 0x80000000) != v11 )
KeYieldProcessorEx(&SpinCount);
}
LABEL_13:
KeFlushSingleCurrentTb(v1);
result = CurrentIrql;
__writecr8(CurrentIrql);
return result;
}Referenced by:
No references.