HalpApicRegisterIoUnit

NTSTATUS __stdcall HalpApicRegisterIoUnit(LARGE_INTEGER PhysicalAddress){
  int v1; 
  int v2; 
  int v3; 
  int v4; 
  int v6; 
  NTSTATUS v7; 
  INT64 result[25]; 
  int v9; 
  int v10; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  __int128 v17; 
  __int128 v18; 
  __int128 v19; 
  INT64 v20; 
  INT64 v21; 
  INT64 v22; 
  INT64 v23; 
  v3 = v2;
  LOBYTE(v22) = 0;
  v4 = v1;
  LOBYTE(v20) = 0;
  LOBYTE(v23) = 0;
  LOBYTE(v21) = 0;
  memset((INT64)result, 0i64);
  v6 = v12;
  v17 = 0i64;
  result[24] = (INT64)&v17;
  v18 = 0i64;
  result[0] = 0xE800000001i64;
  v19 = 0i64;
  v9 = 48;
  v10 = 2;
  v11 = v4;
  if( HalpApicX2Mode )
  {
    result[15] = (INT64)HalpApicConvertId;
    v14 = 16;
    v15 = 0xFFFF;
    if( !HalpApicGuestX2Mode )
      v6 = v12 | 0x100;
    if( HalpApicGetCpuInfo((INT64)&v22, (INT64)&v23, (INT64)&v20, (INT64)&v21) )
    {
      if( (_BYTE)v21 == 2 )
      {
        if( (_BYTE)v22 != 6 || (_BYTE)v20 != 47 )
          goto LABEL_3;
        v15 = 255;
      }
      if( (_BYTE)v21 == 1 )
      {
        HalpApicDirectedEndOfInterruptModeEnabled = 1;
        v6 |= 0x400u;
        result[22] = (INT64)HalpApicDirectedEndOfInterrupt;
      }
    }
  }
  else
  {
    v14 = 4;
    result[7] = (INT64)HalpApicSetLogicalId;
    v6 = v12 | 4;
    v15 = 15;
  }
LABEL_3:
  v16 = 96;
  result[1] = (INT64)HalpApicInitializeLocalUnit;
  v12 = v6 | 0xFB;
  result[18] = (INT64)HalpApicDeinitializeLocalUnit;
  v13 = 15;
  result[2] = (INT64)HalpApicInitializeIoUnit;
  *(LARGE_INTEGER *)&v17 = PhysicalAddress;
  result[3] = (INT64)HalpApicSetPriority;
  result[4] = (INT64)HalpApicGetLocalUnitError;
  result[5] = (INT64)HalpApicClearLocalUnitError;
  result[9] = (INT64)HalpApicWriteEndOfInterrupt;
  result[10] = HalpApicEndOfInterrupt;
  result[11] = (INT64)HalpApicSetLineState;
  result[12] = (INT64)HalpApicRequestInterrupt;
  result[13] = (INT64)HalpApicStartProcessor;
  result[14] = (INT64)HalpApicGenerateMessage;
  result[16] = (INT64)HalpApicSaveLocalInterrupts;
  result[17] = (INT64)HalpApicReplayLocalInterrupts;
  result[20] = (INT64)HalpApicQueryAndGetSource;
  DWORD2(v17) = v4;
  HIDWORD(v18) = v3;
  v7 = HalRegisterPermanentAddressUsage(PhysicalAddress, 0x400u);
  if( v7 >= 0 )
    return HalpInterruptRegisterController((__int64)result);
  return v7;
}

Referenced by:

HalpApicDiscover