MiMarkKernelStack
VOID __stdcall MiMarkKernelStack(_MMPTE *PointerPte, _MMPTE *EndPte, _ETHREAD *StackOwner){
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v3;
_MMPFN *v5;
unsigned __int64 v6;
char v7;
UINT64 SpinCount;
UINT64 Long;
v3.Long = (unsigned __int64)PointerPte->u;
MiPteInShadowRange((UINT64)PointerPte);
Long = v3.Long;
MiPteInShadowRange((UINT64)&Long);
v5 = &MmGetPfnDb()[(v3.Long >> 12) & 0xFFFFFFFFFi64];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v5->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v5->u2._bf_0 < 0 );
}
v5->u4._bf_0 = v5->u4._bf_0 & 0x8FFFFFFFFFFFFFFFui64 | 0x2000000000000000i64;
v6 = v5->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 ^ (v5->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 ^ ((unsigned __int64)EndPte >> 3)) & 0xFFFFFFFFFFEi64;
v5->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = v6;
if( EndPte && (v6 & 1) == 0 )
v5->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = v6 | 1;
v7 = *((_BYTE *)&v5->u3 + 3);
v5->OriginalPte.u.Long |= 0x3E0ui64;
*((_BYTE *)&v5->u3 + 3) = v7 & 0xF8 | 5;
_InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}Referenced by:
MiAllocateKernelStackPages
MiMarkBootKernelStack