HalpInitializeInterrupts
NTSTATUS __stdcall HalpInitializeInterrupts(_LOADER_PARAMETER_BLOCK *LoaderBlock){
DOUBLE v1;
NTSTATUS v3;
PSTR MemoryInternal;
unsigned int v5;
PSTR v6;
PSTR v7;
PSTR v8;
INT64 v9;
INT64 v10;
INT64 v11;
INT64 v12;
INT64 v13;
INT64 v14;
INT64 v15;
INT64 v16;
ULONG_PTR *i;
ULONG_PTR v18;
int v19;
_DWORD *v20;
unsigned int v21;
int v22;
ULONG_PTR v24;
v24 = 0i64;
HalpInterruptOverridesLock = 0i64;
HalpInterruptLocalUnitErrorLock = 0i64;
qword_140C49608 = (__int64)&HalpInterruptOverrides;
HalpInterruptOverrides = (__int64)&HalpInterruptOverrides;
HalpInterruptPhysicalTargets = 1310721;
memset((INT64)&dword_140C4B7A4, 0i64);
v3 = HalpInterruptParseAcpiTables(LoaderBlock, 0i64);
if( v3 < 0 )
goto LABEL_32;
HalpInterruptMaxProcessors = HalQueryMaximumProcessorCount();
MemoryInternal = HalpMmAllocateMemoryInternal((unsigned int)(24 * HalpInterruptMaxProcessors), MmCached);
HalpInterruptTargets = (__int64)MemoryInternal;
if( !MemoryInternal )
goto LABEL_31;
memset((INT64)MemoryInternal, 0i64);
v5 = HalpInterruptMaxProcessors << 6;
v6 = HalpMmAllocateMemoryInternal((unsigned int)(HalpInterruptMaxProcessors << 6), MmCached);
HalpInterruptProcessorState = (ULONG_PTR)v6;
if( !v6
|| (memset((INT64)v6, 0i64),
v7 = HalpMmAllocateMemoryInternal(v5, MmCached),
(HalpInterruptDynamicProcessorState = (__int64)v7) == 0)
|| (memset((INT64)v7, 0i64),
v8 = HalpMmAllocateMemoryInternal((unsigned int)(8 * HalpInterruptMaxProcessors), MmCached),
(HalpInterruptProcessorPcr = (__int64)v8) == 0) )
{
LABEL_31:
v3 = -1073741801;
goto LABEL_32;
}
memset((INT64)v8, 0i64);
*(_QWORD *)HalpInterruptProcessorPcr = KeGetPcr();
v3 = HalpApicDiscover();
if( v3 >= 0 )
v3 = HalpPicDiscover();
if( v3 < 0 )
{
HalpInterruptLastProblem = 3;
goto LABEL_29;
}
HalpInterruptSetIdtEntry(0x35ui64, HalpInterruptDeferredErrorService, 5, v9, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xE3ui64, HalpInterruptDeferredRecoveryService, 14, v10, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0x36ui64, HalpInterruptDeferredErrorService, 5, v11, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xDFui64, HalpInterruptSpuriousService, 15, v12, (UINT64 *)0xFFFFFFFFFFFFFFFEi64);
HalpInterruptSetIdtEntry(0xD8ui64, HalpInterruptStubService, 15, v13, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xE2ui64, HalpInterruptLocalErrorService, 15, v14, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xD7ui64, HalpInterruptRebootService, 15, v15, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xFEui64, HalpPerfInterrupt, 15, v16, (UINT64 *)0xFFFFFFFFFFFFFFFDi64);
byte_140D57962 = 17;
byte_140D57D6A = 15;
dword_140D57D6B = 2;
byte_140D57A3F = 17;
byte_140D581BB = 15;
dword_140D581BC = 223;
v3 = HalpInterruptSelectController((__int64)&v24, v1);
if( v3 < 0 )
goto LABEL_32;
for( i = (ULONG_PTR *)HalpRegisteredInterruptControllers; i != &HalpRegisteredInterruptControllers; i = (ULONG_PTR *)*i )
{
v3 = HalpInterruptInitializeController(i, v1);
if( v3 < 0 )
goto LABEL_32;
}
v3 = HalpInterruptParseAcpiTables(LoaderBlock, 1ui64);
if( v3 < 0 )
goto LABEL_32;
v18 = v24;
HalpHwToSwIrqlMap = (__int128)_mm_load_si128((const __m128i *)&_xmm_ffffffffffffffffffffffffffffffff);
LOWORD(HalpHwToSwIrqlMap) = 256;
v19 = *(_DWORD *)(v24 + 220);
*(_WORD *)((char *)&HalpHwToSwIrqlMap + 13) = 3597;
BYTE12(HalpHwToSwIrqlMap) = 12;
HIBYTE(HalpHwToSwIrqlMap) = 15;
BYTE2(HalpHwToSwIrqlMap) = 2;
if( (v19 & 1) == 0 )
{
v20 = (_DWORD *)HalpInterruptTargets;
LODWORD(HalpInterruptProcessorCount) = 1;
*(_DWORD *)(HalpInterruptTargets + 8) = 0;
*v20 = 4;
v19 = *(_DWORD *)(v18 + 220);
}
if( !(_DWORD)HalpInterruptProcessorCount )
LODWORD(HalpInterruptProcessorCount) = 1;
if( (v19 & 4) == 0 )
HalpInterruptLogicalFlatLimit = 0;
HalpInterruptController = v18;
v3 = HalpInterruptInitializeIpis();
if( v3 < 0 )
LABEL_32:
KeBugCheckEx(0x5Cu, 0x200ui64, 0x5250631ui64, HalpInterruptLastProblem, v3);
if( (*(_DWORD *)(HalpInterruptController + 220) & 0x100) != 0 )
{
if( *((_BYTE *)KeGetCurrentPrcb() + 141) == 1 )
{
v22 = 0x200000;
}
else
{
v21 = 240 * HalQueryMaximumProcessorCount();
v22 = 0x10000;
if( v21 <= 0x10000 )
{
_BitScanReverse(&v21, 2 * v21 - 1);
v22 = 1 << v21;
}
}
HalpIrtTotalEntries = v22;
}
LABEL_29:
if( v3 < 0 )
goto LABEL_32;
return v3;
}Referenced by:
HalpInterruptInitDiscard