HalpInterruptEnumerateUnmaskedInterrupts
__int64 __fastcall HalpInterruptEnumerateUnmaskedInterrupts(
__int64 (__fastcall *a1)(__int64, __int64),
__int64 a2,
_WORD *a3){
unsigned int v4;
unsigned int v5;
char v6;
unsigned __int8 v7;
ULONG_PTR *v8;
unsigned __int64 v9;
ULONG_PTR *v10;
ULONG_PTR *v11;
ULONG_PTR *v12;
ULONG_PTR *v13;
int v14;
_DWORD *v15;
ULONG_PTR *v19;
ULONG_PTR *v20;
v4 = (unsigned __int16)a3[1];
if( *a3 && v4 >= 0x20 )
{
memset((INT64)a3, 0i64);
v5 = 0;
v6 = 1;
v7 = HalpAcquireHighLevelLock(&HalpInterruptLock);
v8 = (ULONG_PTR *)HalpRegisteredInterruptControllers;
v9 = v7;
while( v8 != &HalpRegisteredInterruptControllers )
{
v19 = v8;
v10 = v8;
v8 = (ULONG_PTR *)*v8;
v11 = v10 + 30;
v12 = (ULONG_PTR *)v10[30];
v20 = v10 + 30;
while( v12 != v11 )
{
v13 = v12;
v12 = (ULONG_PTR *)*v12;
if( *((_DWORD *)v13 + 7) != -1 )
{
v14 = *((_DWORD *)v13 + 5);
if( v14 < *((_DWORD *)v13 + 6) )
{
do
{
v15 = (_DWORD *)(v13[5] + 56i64 * (unsigned int)(v14 - *((_DWORD *)v13 + 5)));
if( (v15[3] & 1) != 0 )
{
*((_DWORD *)a3 + 4) = *((_DWORD *)v13 + 7) + v14 - *((_DWORD *)v13 + 5);
a3[2] = 0;
*((_DWORD *)a3 + 2) = v15[2];
*((_DWORD *)a3 + 3) = *v15;
*((_QWORD *)a3 + 3) = v10[43];
v6 = a1(a2, (__int64)a3);
if( !v6 )
goto LABEL_16;
v10 = v19;
}
++v14;
}
while( v14 < *((_DWORD *)v13 + 6) );
v11 = v20;
}
}
}
}
LABEL_16:
KxReleaseSpinLock(&HalpInterruptLock);
__writecr8(v9);
if( v6 && SecondaryIcServicesEnabled )
return(unsigned int)HalpInterruptEnumerateUnmaskedSecondaryInterrupts(a1, a2, (__int64)a3);
}
else
{
return(unsigned int)-1073741811;
}
return v5;
}Referenced by:
No references.