MiMarkBootKernelStack
VOID __stdcall MiMarkBootKernelStack(_MMPTE *PointerPte, _MMPTE *EndPte){
UINT64 v4;
VOID *v5;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
_ETHREAD *v7;
char v8;
char v9;
_MMPTE *PteBase;
__int64 v11;
UINT64 v12;
_MI_TB_FLUSH_LIST TbFlushList[48];
memset(TbFlushList, 0i64, 0xB8u);
*(_QWORD *)&TbFlushList[6] = 0i64;
v4 = 0i64;
TbFlushList[2] = 20;
LOBYTE(TbFlushList[1]) = 1;
AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeKernelStacks, v5);
MiLockWorkingSetShared();
v9 = v8;
if( PointerPte < EndPte )
{
PteBase = MmGetPteBase();
while( 1 )
{
if( !v4 )
goto LABEL_11;
if( ((unsigned __int16)PointerPte & 0xFFF) == 0 )
break;
LABEL_5:
MiMarkKernelStack(PointerPte, (_MMPTE *)0xFFFFFFFFFFFFFFF0i64, &v7->Tcb);
if( (MiFlags & 0x40000) == 0 )
{
LODWORD(v11) = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
MiWriteValidPteNewProtection((INT64 *)PointerPte, v11 | 0x8000000000000062ui64);
MiInsertTbFlushEntry(
TbFlushList,
(VOID *)((__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)PteBase << 25)) >> 16),
1ui64,
0i64);
}
if( ++PointerPte >= EndPte )
goto LABEL_8;
}
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v4);
LABEL_11:
v4 = (UINT64)PteBase + (((unsigned __int64)PointerPte >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal((INT64)AnyMultiplexedVm, v4, 0i64);
goto LABEL_5;
}
LABEL_8:
MiFlushTbList(TbFlushList);
if( v4 )
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v4);
LOBYTE(v12) = v9;
MiUnlockWorkingSetShared(AnyMultiplexedVm, v12);
}Referenced by:
MiInitializeKernelStacks