MiMarkKernelStack
__int64 __fastcall MiMarkKernelStack(unsigned __int64 *a1, unsigned __int64 a2){
unsigned __int64 v2;
char *v4;
unsigned __int64 v5;
char v6;
__int64 result;
UINT64 SpinCount;
UINT64 v9;
v2 = *a1;
MiPteInShadowRange((UINT64)a1);
v9 = v2;
MiPteInShadowRange((UINT64)&v9);
v4 = (char *)MmGetPfnDb() + 48 * ((v2 >> 12) & 0xFFFFFFFFFi64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v4 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v4 + 3) < 0 );
}
*((_QWORD *)v4 + 5) = *((_QWORD *)v4 + 5) & 0x8FFFFFFFFFFFFFFFui64 | 0x2000000000000000i64;
v5 = *(_QWORD *)v4 ^ (*(_QWORD *)v4 ^ (a2 >> 3)) & 0xFFFFFFFFFFEi64;
*(_QWORD *)v4 = v5;
if( a2 && (v5 & 1) == 0 )
*(_QWORD *)v4 = v5 | 1;
v6 = v4[35];
*((_QWORD *)v4 + 2) |= 0x3E0ui64;
v4[35] = v6 & 0xF8 | 5;
result = 0x7FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
return result;
}Referenced by:
MiAllocateKernelStackPages
MiMarkBootKernelStack