IvtHandleInterrupt

CHAR __stdcall IvtHandleInterrupt(INT64 a1){
  CHAR v1; 
  __int64 v3; 
  int v4; 
  int v5; 
  unsigned int v6; 
  __int64 v7; 
  unsigned int v8; 
  __int64 v9; 
  void *v10; 
  void *BugCheckParameter4; 
  __int64 v12; 
  void *v14; 
  char v15; 
  __int64 *v16; 
  __int64 v17; 
  signed __int32 v18[8]; 

  v1 = 0;
  v3 = *(_QWORD *)(a1 + 8);
  if( *(_BYTE *)(a1 + 268) )
  {
    v4 = *(_DWORD *)(v3 + 220);
    if( (v4 & 1) != 0 )
    {
      v1 = 1;
      *(_DWORD *)(v3 + 220) = v4;
      _InterlockedOr(v18, 0);
    }
  }
  v5 = *(_DWORD *)(v3 + 52);
  if( (v5 & 2) != 0 && v5 != -1 )
  {
    v6 = 0;
    v7 = v3 + 16 * ((*(_QWORD *)(a1 + 176) >> 24) & 0x3FFi64);
    v8 = *(unsigned __int8 *)(a1 + 181) + 1;
    if( *(unsigned __int8 *)(a1 + 181) != -1 )
    {
      do
      {
        v9 = *(_QWORD *)(v7 + 16i64 * ((v6 + BYTE1(v5)) % v8) + 8);
        if( v9 >= 0 )
          break;
        v10 = (void *)(*(_QWORD *)(v7 + 16i64 * ((v6 + BYTE1(v5)) % v8)) >> 12);
        BugCheckParameter4 = (void *)BYTE4(v9);
        v12 = (unsigned __int16)v9;
        if( (unsigned int)BYTE4(v9) - 32 > 8 )
        {
          v14 = 0i64;
          v15 = 0;
          v16 = 0i64;
          while( 1 )
          {
            if( !v16 )
            {
              if( !KxTryToAcquireSpinLock((INT32 *)&HalpDmaAdapterListLock) )
              {
                if( v15 )
LABEL_28:
                  KxReleaseSpinLock(&HalpDmaAdapterListLock);
                KeBugCheckEx(0xE6u, (PVOID)0x26, v14, v10, BugCheckParameter4);
              }
              v16 = &HalpDmaAdapterList;
            }
            v16 = (__int64 *)*v16;
            if( v16 == &HalpDmaAdapterList )
            {
              v16 = 0i64;
              v17 = 0i64;
              v14 = 0i64;
            }
            else
            {
              v17 = v16[9];
              v14 = (void *)v16[8];
            }
            v15 = 1;
            if( !v14
              || v17
              && *(_DWORD *)v17 == 1
              && *(unsigned __int16 *)(v17 + 12) == v12
              && *(unsigned __int16 *)(v17 + 8) == *(_DWORD *)(a1 + 212) )
            {
              goto LABEL_28;
            }
          }
        }
        *(_QWORD *)(v7 + 16i64 * ((v6 + BYTE1(v5)) % v8) + 8) = v9;
        _InterlockedOr(v18, 0);
        ++v6;
      }
      while( v6 < v8 );
    }
    if( *(_BYTE *)(a1 + 268) )
      v5 &= ~0x80u;
    *(_DWORD *)(*(_QWORD *)(a1 + 8) + 52i64) = v5 | 1;
    _InterlockedOr(v18, 0);
  }
  return v1;
}

Referenced by:

No references.