KiInitializeMTRR
VOID __stdcall KiInitializeMTRR(UINT8 LastProcessor){
UINT8 v1;
char v2;
unsigned __int64 v3;
unsigned __int64 v4;
unsigned int v5;
__int64 v6;
unsigned int v7;
unsigned __int64 v8;
unsigned __int64 v9;
__int64 v10;
unsigned __int64 v11;
__int64 v12;
struct _KPRCB *CurrentPrcb;
VOID *PoolWithTag;
VOID *v15;
v1 = LastProcessor;
v2 = 1;
if( !*((_DWORD *)KeGetPcr() + 105) )
{
qword_140C2B128 = __readmsr(0xFEu);
KiMtrrInfo = __readmsr(0x2FFu);
CurrentPrcb = KeGetCurrentPrcb();
byte_140C2B131 = 0;
if( *((_BYTE *)CurrentPrcb + 141) == 1 && (__readmsr(0xC0010010) & 0x40000) != 0 )
byte_140C2B131 = 1;
if( (((_BYTE)qword_140C2B128 != 0) & _bittest64(&KiMtrrInfo, 0xBu)) != 0 )
{
if( (KeFeatureBits & 0x40) == 0 && (qword_140C2B128 & 0x400) != 0 )
qword_140C2B128 &= ~0x400ui64;
PoolWithTag = qword_140C2B138;
if( qword_140C2B138
|| (PoolWithTag = ExAllocatePoolWithTag(
NonPagedPoolNx,
16 * (unsigned int)(unsigned __int8)qword_140C2B128,
0x2020654Bui64),
(qword_140C2B138 = PoolWithTag) != 0i64) )
{
memset((INT64)PoolWithTag, 0i64);
}
v15 = qword_140C2B140;
if( qword_140C2B140
|| (qword_140C2B128 & 0x100) != 0
&& (v15 = ExAllocatePoolWithTag(NonPagedPoolNx, 0x58ui64, 0x2020654Bui64), (qword_140C2B140 = v15) != 0i64) )
{
memset((INT64)v15, 0i64);
}
}
else
{
if( (KeFeatureBits & 0x40) != 0
&& (qword_140C2B128 & 0x1FF) != 0
&& (KiMtrrInfo & 0x800) == 0
&& (*((_BYTE *)CurrentPrcb + 141) != 1 || (_BYTE)KiMtrrInfo != 6)
&& (_BYTE)KdDebuggerEnabled )
{
DbgPrintEx(0x65u, 0, "Caching is disabled by incorrect MTRR settings.\n");
__debugbreak();
}
v2 = 0;
}
}
if( qword_140C2B138 && (qword_140C2B140 || (qword_140C2B128 & 0x100) == 0) )
{
v3 = __readmsr(0xFEu);
if( (KeFeatureBits & 0x40) == 0 && (v3 & 0x400) != 0 )
v3 &= ~0x400ui64;
if( v3 != qword_140C2B128 )
KeBugCheckEx(0x3Eu, 0x40ui64, 0i64, 0i64, 0i64);
if( __readmsr(0x2FFu) != KiMtrrInfo )
DbgPrintEx(0x65u, 0, "KiInitializeMTRR: MTRR_MSR_DEFAULT is not consistent between processors.\n");
}
else
{
v2 = 0;
LOBYTE(v3) = 0;
}
if( !v2 )
goto LABEL_51;
if( !*((_DWORD *)KeGetPcr() + 105) )
{
if( qword_140C2B140 )
KiReadFixedMtrr((UINT64 *)qword_140C2B140);
v4 = (unsigned __int8)v3;
v5 = 0;
if( (_BYTE)v3 )
{
v6 = 0i64;
v7 = 513;
do
{
v8 = __readmsr(v7 - 1);
v9 = __readmsr(v7);
v11 = v9;
if( (v9 & 0x800) != 0 )
{
v10 = v9 & KiMtrrMaskMask;
if( ((v10 + KiMaskToLength(v9 & KiMtrrMaskMask)) & ~(1i64 << *(char *)KiMtrrMaxRangeShift)) != 0 )
{
DbgPrintEx(0x65u, 0, "KiInitializeMTRR: Found non-contiguous MTRR mask!\n");
v2 = 0;
}
v12 = 2 * v6;
*((_QWORD *)qword_140C2B138 + v12) = v8;
*((_QWORD *)qword_140C2B138 + v12 + 1) = v11;
}
++v5;
v7 += 2;
v6 = v5;
}
while( v5 < v4 );
v1 = LastProcessor;
}
}
if( v2 )
{
if( v1 )
{
byte_140C2B130 = 1;
if( KeGetCurrentIrql() < 2u )
{
MmLockPagableSectionByHandle(ExPageLockHandle);
KeRestoreMtrrBroadcast();
MiLockPagableImageSection(ExPageLockHandle, 0i64);
}
}
}
else
{
LABEL_51:
if( qword_140C2B138 )
{
ExFreePoolWithTag(qword_140C2B138, 0);
qword_140C2B138 = 0i64;
}
if( qword_140C2B140 )
{
ExFreePoolWithTag(qword_140C2B140, 0);
qword_140C2B140 = 0i64;
}
}
}Referenced by:
KiInitMachineDependent