ExtEnvSetVpptTarget

NTSTATUS __stdcall ExtEnvSetVpptTarget(INT64 a1, UINT64 a2){
  __int64 v2; 
  unsigned int v3; 
  unsigned int *v4; 
  unsigned __int32 v5; 
  unsigned int v6; 
  NTSTATUS v7; 
  unsigned int v8; 
  NTSTATUS v9; 
  NTSTATUS result; 
  UINT64 Gsi; 
  _INTERRUPT_LINE Line; 
  _GROUP_AFFINITY TargetProcessors; 
  _INTERRUPT_VECTOR_DATA VectorData; 

  LODWORD(Gsi) = 0;
  Line = 0i64;
  v2 = (unsigned int)a2;
  memset(&VectorData, 0i64, sizeof(VectorData));
  v3 = KiProcessorIndexToNumberMappingTable[v2];
  v4 = (unsigned int *)HalpAlwaysOnTimer;
  *(_QWORD *)&TargetProcessors.Group = (unsigned __int16)(v3 >> 6);
  TargetProcessors.Mask = 1i64 << (v3 & 0x3F);
  if( HalpAlwaysOnTimer && *((_DWORD *)HalpAlwaysOnTimer + 57) == 12 )
  {
    VectorData.Vector = 211;
    v5 = VectorData.IntRemapInfo._bf_0 & 0xC0000000 | 4;
  }
  else
  {
    v4 = (unsigned int *)HalpClockTimer;
    if( *((_DWORD *)HalpClockTimer + 57) != 12 )
      KeBugCheckEx(0x5Cu, (PVOID)0x114, 0i64, (PVOID)0xFFFFFFFFC00000BBi64, 0i64);
    v5 = VectorData.IntRemapInfo._bf_0 & 0xC0000000;
    VectorData.Vector = 209;
  }
  VectorData.Irql = 13;
  VectorData.IntRemapInfo._bf_0 = v5 | 0x40000000;
  VectorData.Polarity = v4[23];
  VectorData.Mode = v4[24];
  v6 = v4[56];
  VectorData.TargetProcessors = TargetProcessors;
  if( (v6 & 0x200) != 0 )
  {
    v7 = HalpInterruptGsiToLine(v4[22], &Line);
    if( v7 < 0 )
      KeBugCheckEx(0x5Cu, (PVOID)0x114, v4, (PVOID)v7, (PVOID)1);
  }
  else
  {
    if( (v6 & 0x100) == 0 )
      KeBugCheckEx(0x5Cu, (PVOID)0x114, v4, (PVOID)0xFFFFFFFFC00000BBi64, (PVOID)2);
    v8 = v4[21];
    if( v8 >= 8 )
    {
      Line.UnitId = 45057;
      v8 -= 8;
    }
    else
    {
      Line.UnitId = 45056;
    }
    Line.Line = v8;
  }
  HalpInterruptApplyOverrides(&Line, &VectorData.Polarity, &VectorData.Mode);
  v9 = HalpInterruptLineToGsi(&Line, &Gsi);
  if( v9 < 0 )
    KeBugCheckEx(0x5Cu, (PVOID)0x114, v4, (PVOID)v9, (PVOID)3);
  VectorData.Type = InterruptTypeControllerInput;
  VectorData.ControllerInput.Gsiv = Gsi;
  result = HalpInterruptSetDestination(&VectorData, &TargetProcessors, &Gsi);
  if( result < 0 )
    KeBugCheckEx(0x5Cu, (PVOID)0x114, v4, (PVOID)result, (PVOID)4);
  return result;
}

Referenced by:

HalpVpptUpdatePhysicalTimer