IvtInitializeMTRR
CHAR __stdcall IvtInitializeMTRR(INT64 a1){
_QWORD *v1;
unsigned __int64 v2;
__int16 v3;
unsigned __int64 v4;
unsigned __int64 v5;
unsigned int v6;
__int64 v7;
void *retaddr;
v1 = *(_QWORD **)(a1 + 8);
v2 = __readmsr(0xFEu);
v3 = v2 & 0x5FF;
v4 = __readmsr(0x2FFu);
LOBYTE(v5) = (v3 & 0x100) != 0i64;
if( (((v4 & 0x400) != 0) & (unsigned __int8)v5) != 0 )
{
v1[36] = __readmsr(0x250u);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v1[37] = __readmsr(0x258u);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v1[38] = __readmsr(0x259u);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v1[39] = __readmsr(0x268u);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v1[40] = __readmsr(0x269u);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v1[41] = __readmsr(0x26Au);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v1[42] = __readmsr(0x26Bu);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v1[43] = __readmsr(0x26Cu);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v1[44] = __readmsr(0x26Du);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v1[45] = __readmsr(0x26Eu);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v5 = __readmsr(0x26Fu);
v1[46] = v5;
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
}
v6 = 0;
if( (_BYTE)v3 )
{
do
{
v7 = 2 * v6;
v1[v7 + 48] = __readmsr((int)v7 + 512);
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
v5 = __readmsr((int)v7 + 513);
v1[(unsigned int)(v7 + 1) + 48] = ((unsigned __int64)HIDWORD(v5) << 32) | (unsigned int)v5;
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
LOBYTE(v5) = ++v6;
}
while( v6 < (unsigned __int64)(unsigned __int8)v3 );
}
if( (v3 & 0x100) == 0 )
v4 &= ~0x400ui64;
v1[33] = v4;
_InterlockedOr((volatile signed __int32 *)&retaddr, 0);
return v5;
}Referenced by:
IvtInitializeIommu