HalpApicRegisterIoUnit

NTSTATUS __stdcall HalpApicRegisterIoUnit(_LARGE_INTEGER PhysicalAddress){
  int v1; 
  int v2; 
  int v3; 
  int v4; 
  int v6; 
  NTSTATUS result; 
  _UNICODE_STRING *v8; 
  VOID **v9; 
  _BYTE NewController[232]; 
  __int128 v11; 
  __int128 v12; 
  __int128 v13; 
  INT64 v14; 
  INT64 v15; 
  INT64 v16; 
  INT64 v17; 

  v3 = v2;
  LOBYTE(v16) = 0;
  v4 = v1;
  LOBYTE(v14) = 0;
  LOBYTE(v17) = 0;
  LOBYTE(v15) = 0;
  memset(NewController, 0i64, sizeof(NewController));
  *(_DWORD *)&NewController[4] = 232;
  v6 = *(_DWORD *)&NewController[212];
  v11 = 0i64;
  *(_QWORD *)&NewController[192] = &v11;
  v12 = 0i64;
  *(_DWORD *)NewController = 1;
  v13 = 0i64;
  *(_DWORD *)&NewController[200] = 48;
  *(_DWORD *)&NewController[204] = 2;
  *(_DWORD *)&NewController[208] = v4;
  if( *(&stru_140CF2E80 + 6617) )
  {
    *(_QWORD *)&NewController[120] = HalpApicConvertId;
    *(_DWORD *)&NewController[220] = 16;
    *(_DWORD *)&NewController[224] = 0xFFFF;
    if( !*(&stru_140CF2E80 + 7328) )
      v6 = *(_DWORD *)&NewController[212] | 0x100;
    if( HalpApicGetCpuInfo((INT64)&v16, (INT64)&v17, (INT64)&v14, (INT64)&v15) )
    {
      if( (_BYTE)v15 == 2 )
      {
        if( (_BYTE)v16 != 6 || (_BYTE)v14 != 47 )
          goto LABEL_3;
        *(_DWORD *)&NewController[224] = 255;
      }
      if( (_BYTE)v15 == 1 )
      {
        *(&CmpDummyThreadEvent + 3888) = 1;
        v6 |= 0x400u;
        *(_QWORD *)&NewController[176] = HalpApicDirectedEndOfInterrupt;
      }
    }
  }
  else
  {
    *(_DWORD *)&NewController[220] = 4;
    *(_QWORD *)&NewController[56] = HalpApicSetLogicalId;
    v6 = *(_DWORD *)&NewController[212] | 4;
    *(_DWORD *)&NewController[224] = 15;
  }
LABEL_3:
  *(_DWORD *)&NewController[228] = 96;
  *(_QWORD *)&NewController[8] = HalpApicInitializeLocalUnit;
  *(_DWORD *)&NewController[212] = v6 | 0xFB;
  *(_QWORD *)&NewController[144] = HalpApicDeinitializeLocalUnit;
  *(_DWORD *)&NewController[216] = 15;
  *(_QWORD *)&NewController[16] = HalpApicInitializeIoUnit;
  *(_LARGE_INTEGER *)&v11 = PhysicalAddress;
  *(_QWORD *)&NewController[24] = HalpApicSetPriority;
  *(_QWORD *)&NewController[32] = HalpApicGetLocalUnitError;
  *(_QWORD *)&NewController[40] = HalpApicClearLocalUnitError;
  *(_QWORD *)&NewController[72] = HalpApicWriteEndOfInterrupt;
  *(_QWORD *)&NewController[80] = qword_140C50790;
  *(_QWORD *)&NewController[88] = HalpApicSetLineState;
  *(_QWORD *)&NewController[96] = HalpApicRequestInterrupt;
  *(_QWORD *)&NewController[104] = HalpApicStartProcessor;
  *(_QWORD *)&NewController[112] = HalpApicGenerateMessage;
  *(_QWORD *)&NewController[128] = HalpApicSaveLocalInterrupts;
  *(_QWORD *)&NewController[136] = HalpApicReplayLocalInterrupts;
  *(_QWORD *)&NewController[160] = HalpApicQueryAndGetSource;
  DWORD2(v11) = v4;
  HIDWORD(v12) = v3;
  result = HalRegisterPermanentAddressUsage(PhysicalAddress, 0x400u);
  if( result >= 0 )
    return HalpInterruptRegisterController((_INTERRUPT_INITIALIZATION_BLOCK *)NewController, v8, v9);
  return result;
}

Referenced by:

HalpApicDiscover