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.