HalpInitializeInterrupts
NTSTATUS __stdcall HalpInitializeInterrupts(_LOADER_PARAMETER_BLOCK *LoaderBlock){
int v2;
size_t v3;
PSTR MemoryInternal;
size_t v5;
PSTR v6;
PSTR v7;
size_t v8;
UINT64 *v9;
INT64 v10;
INT64 v11;
INT64 v12;
INT64 v13;
INT64 v14;
INT64 v15;
INT64 v16;
INT64 v17;
_REGISTERED_INTERRUPT_CONTROLLER *i;
_REGISTERED_INTERRUPT_CONTROLLER *v19;
unsigned int Capabilities;
_DWORD *v21;
unsigned int v22;
int v23;
_REGISTERED_INTERRUPT_CONTROLLER *PrimaryController;
PrimaryController = 0i64;
*(&CmpDummyThreadEvent + 891) = 0i64;
*(&CmpDummyThreadEvent + 845) = 0i64;
*(&CmpDummyThreadEvent + 889) = (char *)&CmpDummyThreadEvent + 7104;
*(&CmpDummyThreadEvent + 888) = (char *)&CmpDummyThreadEvent + 7104;
*(_DWORD *)&dword_140C4B7A0.Count = 1310721;
memset(&unk_140C4B7A4, 0i64, 0xA4u);
v2 = HalpInterruptParseAcpiTables(LoaderBlock, 0i64);
if( v2 < 0 )
goto LABEL_32;
HIDWORD(qword_140C50640) = HalQueryMaximumProcessorCount();
v3 = 24 * HIDWORD(qword_140C50640);
MemoryInternal = HalpMmAllocateMemoryInternal((unsigned int)(24 * HIDWORD(qword_140C50640)), MmCached);
qword_140C50630 = (__int64)MemoryInternal;
if( !MemoryInternal )
goto LABEL_31;
memset(MemoryInternal, 0i64, v3);
v5 = HIDWORD(qword_140C50640) << 6;
v6 = HalpMmAllocateMemoryInternal((unsigned int)(HIDWORD(qword_140C50640) << 6), MmCached);
HalpInterruptProcessorState = v6;
if( !v6
|| (memset(v6, 0i64, v5),
v7 = HalpMmAllocateMemoryInternal(v5, MmCached),
(HalpInterruptDynamicProcessorState = (__int64)v7) == 0)
|| (memset(v7, 0i64, v5),
v8 = 8 * HIDWORD(qword_140C50640),
v9 = (UINT64 *)HalpMmAllocateMemoryInternal((unsigned int)(8 * HIDWORD(qword_140C50640)), MmCached),
(qword_140C49C38 = v9) == 0i64) )
{
LABEL_31:
v2 = -1073741801;
goto LABEL_32;
}
memset(v9, 0i64, v8);
*qword_140C49C38 = (UINT64)KeGetPcr();
v2 = HalpApicDiscover();
if( v2 >= 0 )
v2 = HalpPicDiscover();
if( v2 < 0 )
{
*(&CmpDummyThreadEvent + 1789) = 3;
goto LABEL_29;
}
HalpInterruptSetIdtEntry(0x35ui64, HalpInterruptDeferredErrorService, 5, v10, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xE3ui64, HalpInterruptDeferredRecoveryService, 14, v11, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0x36ui64, HalpInterruptDeferredErrorService, 5, v12, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xDFui64, HalpInterruptSpuriousService, 15, v13, (UINT64 *)0xFFFFFFFFFFFFFFFEi64);
HalpInterruptSetIdtEntry(0xD8ui64, HalpInterruptStubService, 15, v14, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xE2ui64, HalpInterruptLocalErrorService, 15, v15, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xD7ui64, HalpInterruptRebootService, 15, v16, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
HalpInterruptSetIdtEntry(0xFEui64, HalpPerfInterrupt, 15, v17, (UINT64 *)0xFFFFFFFFFFFFFFFDi64);
byte_140D57962 = 17;
byte_140D57D6A = 15;
dword_140D57D6B = 2;
byte_140D57A3F = 17;
byte_140D581BB = 15;
dword_140D581BC = 223;
v2 = HalpInterruptSelectController(&PrimaryController);
if( v2 < 0 )
goto LABEL_32;
for( i = (_REGISTERED_INTERRUPT_CONTROLLER *)qword_140C4B850;
i != (_REGISTERED_INTERRUPT_CONTROLLER *)&qword_140C4B850;
i = (_REGISTERED_INTERRUPT_CONTROLLER *)i->ListEntry.Flink )
{
v2 = HalpInterruptInitializeController(i);
if( v2 < 0 )
goto LABEL_32;
}
v2 = HalpInterruptParseAcpiTables(LoaderBlock, 1ui64);
if( v2 < 0 )
goto LABEL_32;
v19 = PrimaryController;
*(&CmpDummyThreadEvent + 440) = _mm_load_si128((const __m128i *)&_xmm_ffffffffffffffffffffffffffffffff);
*(&CmpDummyThreadEvent + 3520) = 256;
Capabilities = PrimaryController->Capabilities;
*(_WORD *)((char *)&CmpDummyThreadEvent + 7053) = 3597;
*(&CmpDummyThreadEvent + 7052) = 12;
*(&CmpDummyThreadEvent + 7055) = 15;
*(&CmpDummyThreadEvent + 7042) = 2;
if( (Capabilities & 1) == 0 )
{
v21 = (_DWORD *)qword_140C50630;
LODWORD(qword_140C50640) = 1;
*(_DWORD *)(qword_140C50630 + 8) = 0;
*v21 = 4;
Capabilities = v19->Capabilities;
}
if( !(_DWORD)qword_140C50640 )
LODWORD(qword_140C50640) = 1;
if( (Capabilities & 4) == 0 )
HalpInterruptLogicalFlatLimit = 0;
Controller = (INT64)v19;
v2 = HalpInterruptInitializeIpis();
if( v2 < 0 )
LABEL_32:
KeBugCheckEx(0x5Cu, (PVOID)0x200, (PVOID)0x5250631, (PVOID)*(&CmpDummyThreadEvent + 1789), (PVOID)v2);
if( (*(_DWORD *)(Controller + 220) & 0x100) != 0 )
{
if( KeGetCurrentPrcb()->CpuVendor == 1 )
{
v23 = 0x200000;
}
else
{
v22 = 240 * HalQueryMaximumProcessorCount();
v23 = 0x10000;
if( v22 <= 0x10000 )
{
_BitScanReverse(&v22, 2 * v22 - 1);
v23 = 1 << v22;
}
}
*(&CmpDummyThreadEvent + 1958) = v23;
}
LABEL_29:
if( v2 < 0 )
goto LABEL_32;
return v2;
}Referenced by:
HalpInterruptInitDiscard