KeLoadMTRR
NTSTATUS __fastcall KeLoadMTRR(INT64 a1){
bool v2;
unsigned __int64 v3;
unsigned __int64 v4;
unsigned __int64 v5;
unsigned int v6;
__int64 v7;
unsigned int v8;
_QWORD *v9;
__int64 v10;
unsigned int v12;
UINT64 *v13;
UINT64 Buffer[12];
int v15;
if( byte_140C2B130 )
{
if( !KiCompareVarMtrr() )
KeMtrrComparisonFailed = 1;
if( qword_140C2B140 )
{
KiReadFixedMtrr(Buffer);
if( !KeGetCurrentPrcb()->Number )
{
v12 = 0;
v13 = Buffer;
while( *(UINT64 *)((char *)v13 + (_BYTE *)qword_140C2B140 - (_BYTE *)Buffer) == *v13 )
{
++v12;
++v13;
if( v12 >= 0xB )
goto LABEL_6;
}
KeMtrrComparisonFailed = 1;
}
}
LABEL_6:
_disable();
v2 = (v15 & 0x200) != 0;
KiLockStepExecution(a1);
v3 = __readcr0();
__writecr0(v3 & 0xFFFFFFFF9FFFFFFFui64 | 0x40000000);
__wbinvd();
v4 = __readcr4();
if( (v4 & 0x80) != 0 )
__writecr4(v4 & 0xFFFFFFFFFFFFFF7Fui64);
else
KeFlushCurrentTbImmediately();
v5 = KiMtrrInfo & 0xFFFFFFFFFFFFF7FFui64;
__writemsr(0x2FFu, KiMtrrInfo & 0xFFFFFFFFFFFFF7FFui64);
v6 = 0;
if( (_BYTE)qword_140C2B128 )
{
v7 = 0i64;
v8 = 513;
do
{
v9 = qword_140C2B138;
v10 = 2 * v7;
__writemsr(v8 - 1, *((_QWORD *)qword_140C2B138 + v10));
__writemsr(v8, v9[v10 + 1]);
v7 = ++v6;
v8 += 2;
}
while( v6 < (unsigned __int64)(unsigned __int8)qword_140C2B128 );
}
if( qword_140C2B140 )
KiWriteFixedMtrr((UINT64 *)qword_140C2B140);
__writemsr(0x2FFu, v5 | 0x800);
__wbinvd();
KeFlushCurrentTbImmediately();
__writecr0(v3);
if( (v4 & 0x80) != 0 )
__writecr4(v4);
KiLockStepExecution(a1);
if( v2 )
_enable();
}
return 0;
}Referenced by:
HalpPostSleepMP
KiLoadMTRRTarget