EmonOverflowHandler
VOID __stdcall EmonOverflowHandler(_KTRAP_FRAME *TrFrame){
unsigned int Number;
_KTRAP_FRAME *v2;
__int64 v3;
__int64 v4;
unsigned int v5;
unsigned int v6;
unsigned __int64 v7;
unsigned int v8;
unsigned int v9;
unsigned __int64 v10;
unsigned __int64 v11;
_KPROFILE_SOURCE v12;
__int64 v13;
__int64 v14;
unsigned int v15;
int v16;
unsigned int v17;
UINT64 v18;
unsigned __int64 v19;
int v20;
UINT64 v21;
__int64 v22;
UINT64 v23;
UINT64 v24;
unsigned __int64 v25;
__int64 v26;
unsigned int v27;
unsigned int v28;
int v29;
__int64 v30;
__int64 v31;
unsigned __int64 v32;
unsigned __int64 v33;
__int64 **v34;
__int64 v35;
unsigned __int64 v36;
__int64 *v37;
bool v38;
__int64 v39;
__int64 v40;
unsigned int v41;
unsigned int v42;
unsigned __int64 v43;
unsigned __int64 v44;
_KPROFILE_SOURCE v45;
__int64 v46;
__int64 v47;
unsigned int v48;
int v49;
unsigned int v50;
UINT64 v51;
unsigned __int64 v52;
int v53;
UINT64 v54;
__int64 v55;
UINT64 v56;
UINT64 v57;
unsigned __int64 v58;
__int64 v59;
unsigned int v60;
unsigned int v61;
int v62;
__int64 v63;
__int64 v64;
unsigned __int64 v65;
int v66;
UINT64 TotalTransitions;
UINT64 v68;
_LARGE_INTEGER PerformanceFrequency;
__int64 v70;
_LARGE_INTEGER v71;
unsigned __int64 v72;
unsigned int v74;
int v75;
unsigned int v76;
unsigned int v77;
unsigned int v78;
unsigned int v79;
Number = KeGetPcr()->Prcb.Number;
v2 = TrFrame;
v74 = 0;
v3 = *(&CmpDummyThreadEvent + 620) + 16i64 * Number * *(&CmpDummyThreadEvent + 1217);
if( *(&CmpDummyThreadEvent + 1216) >= 2u )
{
v32 = *(&CmpDummyThreadEvent + 621) & __readmsr(0x38Eu);
v72 = v32;
if( (v32 & 0x4000000000000000i64) != 0 )
EmonPebsOverflowHandler();
v33 = v32 & 0xBFFFFFFFFFFFFFFFui64;
v34 = (__int64 **)*(&CmpDummyThreadEvent + 616);
if( (v32 & 0x4000000000000000i64) == 0 )
v33 = v32;
if( (_UNKNOWN *)*(&CmpDummyThreadEvent + 616) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 4928) )
{
v35 = Number;
do
{
v36 = v33 & (unsigned __int64)v34[v35 + 4];
if( v36 )
{
v37 = v34[2];
if( v37 )
((void(__fastcall *)(unsigned __int64, __int64 **, _KTRAP_FRAME *))v37)(
v33 & (unsigned __int64)v34[v35 + 4],
v34,
v2);
}
v34 = (__int64 **)*v34;
v33 &= ~v36;
}
while( v34 != (__int64 **)((char *)&CmpDummyThreadEvent + 4928) );
}
v38 = !_BitScanForward64((unsigned __int64 *)&v39, v33);
v75 = v39;
if( v38 )
{
LABEL_101:
__writemsr(0x390u, v32);
return;
}
while( 1 )
{
v33 &= ~(1i64 << v39);
if( (unsigned int)v39 >= *(&CmpDummyThreadEvent + 1223) )
{
LODWORD(v39) = *(&CmpDummyThreadEvent + 1223) + v39 - 32;
v75 = v39;
}
v40 = 2i64 * (unsigned int)v39;
if( *(_DWORD *)(v3 + 16i64 * (unsigned int)v39) )
goto LABEL_99;
v70 = 0i64;
v41 = v39 - *(&CmpDummyThreadEvent + 1223) + 32;
v77 = v41;
if( (unsigned int)v39 >= *(&CmpDummyThreadEvent + 1223) )
{
v44 = __readmsr(0x38Fu);
_bittestandreset64((__int64 *)&v44, v41);
v42 = 911;
v70 = v44;
v43 = v44;
}
else
{
v42 = v39 + 390;
v43 = *(_DWORD *)(v3 + 16i64 * (unsigned int)v39 + 12) & 0xFFAFFFFF;
}
__writemsr(v42, v43);
v45 = *(_DWORD *)(v3 + 16i64 * (unsigned int)v39 + 4);
if( v45 )
{
KeProfileInterruptWithSource(TrFrame, v45);
LODWORD(v52) = *(_DWORD *)(v3 + 16i64 * (unsigned int)v39 + 8);
goto LABEL_89;
}
v68 = 0i64;
v71.QuadPart = 0i64;
if( HalpTimerProfilingCallback )
HalpTimerProfilingCallback(TrFrame);
else
KeProfileInterruptWithSource(TrFrame, ProfileTime);
v46 = qword_140C4A3C8;
v47 = 32i64 * KeGetPcr()->Prcb.Number;
v48 = *(_DWORD *)(v47 + qword_140C4A3C8 + 24);
if( !v48 )
{
LODWORD(v52) = 0;
goto LABEL_86;
}
TotalTransitions = *(unsigned int *)(v47 + qword_140C4A3C8 + 16);
v49 = *(_DWORD *)(v47 + qword_140C4A3C8 + 20);
if( v49 )
{
v53 = v49 - 1;
*(_DWORD *)(v47 + qword_140C4A3C8 + 20) = v53;
if( v53 )
goto LABEL_75;
v79 = 0x2710 / v48;
*(_DWORD *)(v47 + v46 + 20) = 0x2710 / v48;
if( !(0x2710 / v48) )
{
*(_DWORD *)(v47 + v46 + 20) = 1;
v79 = 1;
}
PoGetProcessorIdleAccounting(&v68);
v51 = v68;
if( v68 == *(_QWORD *)(v47 + v46 + 8) )
{
v54 = KeQueryPerformanceCounter(&v71);
v55 = qword_140C4A3C8;
v56 = v54;
v57 = v54 - *(_QWORD *)(v47 + qword_140C4A3C8);
if( v54 != *(_QWORD *)(v47 + qword_140C4A3C8) )
{
v58 = (unsigned int)TotalTransitions * v79 * (unsigned __int64)*(unsigned int *)(v47 + qword_140C4A3C8 + 24);
*(_QWORD *)(v47 + qword_140C4A3C8) = v56;
v52 = v71.QuadPart * (v58 / v57) / 0x989680;
if( v52 < 0x1000 )
v52 = 4096i64;
if( v52 > 0x7FFFFFFF )
LODWORD(v52) = 0x7FFFFFFF;
*(_DWORD *)(v47 + v55 + 16) = v52;
goto LABEL_86;
}
goto LABEL_75;
}
}
else
{
v50 = 0x2710 / v48;
if( !(0x2710 / v48) )
v50 = 1;
*(_DWORD *)(v47 + qword_140C4A3C8 + 20) = v50;
PoGetProcessorIdleAccounting(&v68);
v51 = v68;
}
*(_QWORD *)(v47 + v46 + 8) = v51;
*(_QWORD *)(v47 + qword_140C4A3C8) = KeQueryPerformanceCounter(0i64);
LABEL_75:
LODWORD(v52) = TotalTransitions;
LABEL_86:
LODWORD(v39) = v75;
v41 = v77;
LABEL_89:
if( (unsigned int)v39 >= *(&CmpDummyThreadEvent + 1223) )
{
if( *(&CmpDummyThreadEvent + 1236) < 0x40u )
v63 = (1i64 << *(&CmpDummyThreadEvent + 4944)) - 1;
else
v63 = -1i64;
__writemsr(v39 - *(&CmpDummyThreadEvent + 1223) + 777, v63 & -(__int64)(unsigned int)v52);
v64 = v70;
_bittestandset64(&v64, v41);
v61 = HIDWORD(v64);
v62 = v64;
v60 = 911;
}
else
{
if( *(&CmpDummyThreadEvent + 1231) < 0x40u )
v59 = (1i64 << *(&CmpDummyThreadEvent + 4924)) - 1;
else
v59 = -1i64;
__writemsr(v39 + 193, v59 & -(__int64)(unsigned int)v52);
v60 = v39 + 390;
v61 = 0;
v62 = *(_DWORD *)(v3 + 8 * v40 + 12) | 0x500000;
}
__writemsr(v60, __PAIR64__(v61, v62));
LABEL_99:
v38 = !_BitScanForward64(&v65, v33);
LODWORD(v39) = v65;
v75 = v65;
if( v38 )
{
v32 = v72;
goto LABEL_101;
}
}
}
if( *(&CmpDummyThreadEvent + 1231) < 0x40u )
v4 = (1i64 << *(&CmpDummyThreadEvent + 4924)) - 1;
else
v4 = -1i64;
if( *(&CmpDummyThreadEvent + 1217) )
{
v5 = 0;
while( 1 )
{
if( !*(_DWORD *)(v3 + 16i64 * v5) )
{
v6 = v5 + 193;
v7 = __readmsr(v5 + 193);
if( ((((unsigned __int64)HIDWORD(v7) << 32) | (unsigned int)v7) & v4) < (v4 & 0xFFFFFFFF80000001ui64) )
break;
}
LABEL_46:
v5 = ++v74;
if( v74 >= *(&CmpDummyThreadEvent + 1217) )
return;
}
v70 = 0i64;
v8 = v5 - *(&CmpDummyThreadEvent + 1223) + 32;
v76 = v8;
if( v5 >= *(&CmpDummyThreadEvent + 1223) )
{
v11 = __readmsr(0x38Fu);
_bittestandreset64((__int64 *)&v11, v8);
v9 = 911;
v70 = v11;
v10 = v11;
v2 = TrFrame;
}
else
{
v9 = v5 + 390;
v10 = *(_DWORD *)(v3 + 16i64 * v5 + 12) & 0xFFAFFFFF;
}
__writemsr(v9, v10);
v12 = *(_DWORD *)(v3 + 16i64 * v5 + 4);
if( v12 )
{
KeProfileInterruptWithSource(v2, v12);
LODWORD(v19) = *(_DWORD *)(v3 + 16i64 * v5 + 8);
goto LABEL_36;
}
TotalTransitions = 0i64;
PerformanceFrequency.QuadPart = 0i64;
if( HalpTimerProfilingCallback )
HalpTimerProfilingCallback(v2);
else
KeProfileInterruptWithSource(v2, ProfileTime);
v13 = qword_140C4A3C8;
v14 = 32i64 * KeGetPcr()->Prcb.Number;
v15 = *(_DWORD *)(v14 + qword_140C4A3C8 + 24);
if( !v15 )
{
LODWORD(v19) = 0;
goto LABEL_33;
}
v66 = *(_DWORD *)(v14 + qword_140C4A3C8 + 16);
v16 = *(_DWORD *)(v14 + qword_140C4A3C8 + 20);
if( v16 )
{
v20 = v16 - 1;
*(_DWORD *)(v14 + qword_140C4A3C8 + 20) = v20;
if( v20 )
goto LABEL_22;
v78 = 0x2710 / v15;
*(_DWORD *)(v14 + v13 + 20) = 0x2710 / v15;
if( !(0x2710 / v15) )
{
*(_DWORD *)(v14 + v13 + 20) = 1;
v78 = 1;
}
PoGetProcessorIdleAccounting(&TotalTransitions);
v18 = TotalTransitions;
if( TotalTransitions == *(_QWORD *)(v14 + v13 + 8) )
{
v21 = KeQueryPerformanceCounter(&PerformanceFrequency);
v22 = qword_140C4A3C8;
v23 = v21;
v24 = v21 - *(_QWORD *)(v14 + qword_140C4A3C8);
if( v21 != *(_QWORD *)(v14 + qword_140C4A3C8) )
{
v25 = v66 * v78 * (unsigned __int64)*(unsigned int *)(v14 + qword_140C4A3C8 + 24);
*(_QWORD *)(v14 + qword_140C4A3C8) = v23;
v19 = PerformanceFrequency.QuadPart * (v25 / v24) / 0x989680;
if( v19 < 0x1000 )
v19 = 4096i64;
if( v19 > 0x7FFFFFFF )
LODWORD(v19) = 0x7FFFFFFF;
*(_DWORD *)(v14 + v22 + 16) = v19;
goto LABEL_33;
}
goto LABEL_22;
}
}
else
{
v17 = 0x2710 / v15;
if( !(0x2710 / v15) )
v17 = 1;
*(_DWORD *)(v14 + qword_140C4A3C8 + 20) = v17;
PoGetProcessorIdleAccounting(&TotalTransitions);
v18 = TotalTransitions;
}
*(_QWORD *)(v14 + v13 + 8) = v18;
*(_QWORD *)(v14 + qword_140C4A3C8) = KeQueryPerformanceCounter(0i64);
LABEL_22:
LODWORD(v19) = v66;
LABEL_33:
v8 = v76;
v6 = v5 + 193;
LABEL_36:
if( v5 >= *(&CmpDummyThreadEvent + 1223) )
{
if( *(&CmpDummyThreadEvent + 1236) < 0x40u )
v30 = (1i64 << *(&CmpDummyThreadEvent + 4944)) - 1;
else
v30 = -1i64;
__writemsr(v5 - *(&CmpDummyThreadEvent + 1223) + 777, v30 & -(__int64)(unsigned int)v19);
v31 = v70;
_bittestandset64(&v31, v8);
v28 = HIDWORD(v31);
v29 = v31;
v27 = 911;
}
else
{
if( *(&CmpDummyThreadEvent + 1231) < 0x40u )
v26 = (1i64 << *(&CmpDummyThreadEvent + 4924)) - 1;
else
v26 = -1i64;
__writemsr(v6, v26 & -(__int64)(unsigned int)v19);
v27 = v5 + 390;
v28 = 0;
v29 = *(_DWORD *)(v3 + 16i64 * v5 + 12) | 0x500000;
}
v2 = TrFrame;
__writemsr(v27, __PAIR64__(v28, v29));
goto LABEL_46;
}
}Referenced by:
No references.