HalpInterruptInitializeIpis
INT64 __stdcall HalpInterruptInitializeIpis(){
INT64 result;
__int64 v1;
_QWORD *v2;
_DWORD *v3;
int v4;
int v5;
unsigned int v6;
PSTR MemoryInternal;
_DWORD *v8;
_DWORD *v9;
ULONG v10;
_DWORD *v11;
int *v12;
int v13;
unsigned __int64 v14;
unsigned __int16 Group;
__int64 v16;
__int64 v17;
struct _PROCESSOR_NUMBER ProcNumber;
ProcNumber = 0;
if( HalpInterruptIpiLines )
goto LABEL_2;
v1 = 0i64;
v2 = *(_QWORD **)(HalpInterruptController + 240);
while( v2 != (_QWORD *)(HalpInterruptController + 240) )
{
v3 = v2;
v2 = (_QWORD *)*v2;
v4 = v3[6] - v3[5];
v5 = v3[8];
if( v5 == 5 && v4 )
{
HalpInterruptIpiLines = (__int64)v3;
goto LABEL_2;
}
if( v5 == 4 && v4 && !v1 )
v1 = (__int64)v3;
}
HalpInterruptIpiLines = v1;
if( v1 )
{
LABEL_2:
if( HalpInterruptClusterModeEnabled )
{
if( !HalpInterruptClusterData )
{
v6 = HalpInterruptMaxProcessors;
if( (_DWORD)HalpInterruptMaxCluster
&& 20 * (int)HalpInterruptMaxCluster < (unsigned int)HalpInterruptMaxProcessors )
{
v6 = 20 * HalpInterruptMaxCluster;
}
MemoryInternal = HalpMmAllocateMemoryInternal(24 * v6, MmCached);
HalpInterruptClusterData = (__int64)MemoryInternal;
v8 = MemoryInternal;
if( !MemoryInternal )
return 3221225495i64;
memset((INT64)MemoryInternal, 0i64);
v9 = &v8[6 * v6];
while( v8 < v9 )
{
*v8 = -1;
v8 += 6;
}
HalpInterruptClusterDataEnd = HalpInterruptClusterData;
HalpInterruptClusterDataLimit = HalpInterruptClusterData + 24i64 * v6;
}
v10 = 0;
if( (_DWORD)HalpInterruptProcessorCount )
{
v11 = (_DWORD *)HalpInterruptTargets;
v12 = KiProcessorIndexToNumberMappingTable;
do
{
if( *v11 == 6 )
{
LODWORD(result) = KeGetProcessorNumberFromIndex(v10, &ProcNumber);
if( (int)result < 0 )
return result;
v13 = v11[2];
v14 = HalpInterruptClusterData;
Group = ProcNumber.Group;
while( v14 < HalpInterruptClusterDataEnd
&& (*(_WORD *)(v14 + 16) != ProcNumber.Group || *(_DWORD *)v14 != v13) )
v14 += 24i64;
if( v14 == HalpInterruptClusterDataEnd )
{
if( v14 >= HalpInterruptClusterDataLimit )
KeBugCheckEx(0x5Cu, 0x201ui64, 0i64, 0xFFFFFFFF80000005ui64, (unsigned int)HalpInterruptMaxCluster);
++HalpInterruptClusterDataCount;
v16 = HalpInterruptClusterDataEnd + 24;
*(_DWORD *)v14 = v13;
HalpInterruptClusterDataEnd = v16;
*(_WORD *)(v14 + 16) = Group;
}
v17 = *(_QWORD *)(v14 + 8);
_bittestandset64(&v17, *v12 & 0x3F);
*(_QWORD *)(v14 + 8) = v17;
}
++v10;
v11 += 6;
++v12;
}
while( v10 < (unsigned int)HalpInterruptProcessorCount );
}
}
}
else
{
HalpInterruptMaxProcessors = 1;
}
return 0i64;
}Referenced by:
HalpInitializeInterrupts
HalpInitializeInterruptsPn