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