HalpInterruptInitializeIpis
NTSTATUS __stdcall HalpInterruptInitializeIpis(){
NTSTATUS result;
__int64 v1;
_QWORD *v2;
_DWORD *v3;
int v4;
int v5;
unsigned int v6;
PSTR MemoryInternal;
_DWORD *v8;
_DWORD *v9;
unsigned int v10;
_DWORD *v11;
int *v12;
int v13;
unsigned __int64 v14;
unsigned __int16 Group;
__int64 v16;
__int64 v17;
_PROCESSOR_NUMBER ProcNumber;
ProcNumber = 0;
if( qword_140C50700 )
goto LABEL_2;
v1 = 0i64;
v2 = *(_QWORD **)(Controller + 240);
while( v2 != (_QWORD *)(Controller + 240) )
{
v3 = v2;
v2 = (_QWORD *)*v2;
v4 = v3[6] - v3[5];
v5 = v3[8];
if( v5 == 5 && v4 )
{
qword_140C50700 = (__int64)v3;
goto LABEL_2;
}
if( v5 == 4 && v4 && !v1 )
v1 = (__int64)v3;
}
qword_140C50700 = v1;
if( v1 )
{
LABEL_2:
if( *(&CmpDummyThreadEvent + 7160) )
{
if( !*(&stru_140CF2E80 + 808) )
{
v6 = HIDWORD(qword_140C50640);
if( (_DWORD)HalpInterruptMaxCluster
&& (unsigned int)(20 * (_DWORD)HalpInterruptMaxCluster) < HIDWORD(qword_140C50640) )
{
v6 = 20 * (_DWORD)HalpInterruptMaxCluster;
}
MemoryInternal = HalpMmAllocateMemoryInternal(24 * v6, MmCached);
*(&stru_140CF2E80 + 808) = MemoryInternal;
v8 = MemoryInternal;
if( !MemoryInternal )
return -1073741801;
memset(MemoryInternal, 0i64, 24 * v6);
v9 = &v8[6 * v6];
while( v8 < v9 )
{
*v8 = -1;
v8 += 6;
}
*(&stru_140CF2E80 + 809) = *(&stru_140CF2E80 + 808);
HalpInterruptClusterDataLimit = *(&stru_140CF2E80 + 808) + 24i64 * v6;
}
v10 = 0;
if( (_DWORD)qword_140C50640 )
{
v11 = (_DWORD *)qword_140C50630;
v12 = KiProcessorIndexToNumberMappingTable;
do
{
if( *v11 == 6 )
{
result = KeGetProcessorNumberFromIndex(v10, &ProcNumber);
if( result < 0 )
return result;
v13 = v11[2];
v14 = *(&stru_140CF2E80 + 808);
Group = ProcNumber.Group;
while( v14 < *(&stru_140CF2E80 + 809)
&& (*(_WORD *)(v14 + 16) != ProcNumber.Group || *(_DWORD *)v14 != v13) )
v14 += 24i64;
if( v14 == *(&stru_140CF2E80 + 809) )
{
if( v14 >= HalpInterruptClusterDataLimit )
KeBugCheckEx(
0x5Cu,
(PVOID)0x201,
0i64,
(PVOID)0xFFFFFFFF80000005i64,
(PVOID)(unsigned int)HalpInterruptMaxCluster);
++HalpInterruptClusterDataCount;
v16 = *(&stru_140CF2E80 + 809) + 24i64;
*(_DWORD *)v14 = v13;
*(&stru_140CF2E80 + 809) = 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)qword_140C50640 );
}
}
}
else
{
HIDWORD(qword_140C50640) = 1;
}
return 0;
}Referenced by:
HalpInitializeInterrupts
HalpInitializeInterruptsPn