HalpApicRegisterIoUnit
NTSTATUS __stdcall HalpApicRegisterIoUnit(_LARGE_INTEGER PhysicalAddress){
int v1;
int v2;
int v3;
int v4;
int v6;
NTSTATUS result;
_UNICODE_STRING *v8;
VOID **v9;
_BYTE NewController[232];
__int128 v11;
__int128 v12;
__int128 v13;
INT64 v14;
INT64 v15;
INT64 v16;
INT64 v17;
v3 = v2;
LOBYTE(v16) = 0;
v4 = v1;
LOBYTE(v14) = 0;
LOBYTE(v17) = 0;
LOBYTE(v15) = 0;
memset(NewController, 0i64, sizeof(NewController));
*(_DWORD *)&NewController[4] = 232;
v6 = *(_DWORD *)&NewController[212];
v11 = 0i64;
*(_QWORD *)&NewController[192] = &v11;
v12 = 0i64;
*(_DWORD *)NewController = 1;
v13 = 0i64;
*(_DWORD *)&NewController[200] = 48;
*(_DWORD *)&NewController[204] = 2;
*(_DWORD *)&NewController[208] = v4;
if( *(&stru_140CF2E80 + 6617) )
{
*(_QWORD *)&NewController[120] = HalpApicConvertId;
*(_DWORD *)&NewController[220] = 16;
*(_DWORD *)&NewController[224] = 0xFFFF;
if( !*(&stru_140CF2E80 + 7328) )
v6 = *(_DWORD *)&NewController[212] | 0x100;
if( HalpApicGetCpuInfo((INT64)&v16, (INT64)&v17, (INT64)&v14, (INT64)&v15) )
{
if( (_BYTE)v15 == 2 )
{
if( (_BYTE)v16 != 6 || (_BYTE)v14 != 47 )
goto LABEL_3;
*(_DWORD *)&NewController[224] = 255;
}
if( (_BYTE)v15 == 1 )
{
*(&CmpDummyThreadEvent + 3888) = 1;
v6 |= 0x400u;
*(_QWORD *)&NewController[176] = HalpApicDirectedEndOfInterrupt;
}
}
}
else
{
*(_DWORD *)&NewController[220] = 4;
*(_QWORD *)&NewController[56] = HalpApicSetLogicalId;
v6 = *(_DWORD *)&NewController[212] | 4;
*(_DWORD *)&NewController[224] = 15;
}
LABEL_3:
*(_DWORD *)&NewController[228] = 96;
*(_QWORD *)&NewController[8] = HalpApicInitializeLocalUnit;
*(_DWORD *)&NewController[212] = v6 | 0xFB;
*(_QWORD *)&NewController[144] = HalpApicDeinitializeLocalUnit;
*(_DWORD *)&NewController[216] = 15;
*(_QWORD *)&NewController[16] = HalpApicInitializeIoUnit;
*(_LARGE_INTEGER *)&v11 = PhysicalAddress;
*(_QWORD *)&NewController[24] = HalpApicSetPriority;
*(_QWORD *)&NewController[32] = HalpApicGetLocalUnitError;
*(_QWORD *)&NewController[40] = HalpApicClearLocalUnitError;
*(_QWORD *)&NewController[72] = HalpApicWriteEndOfInterrupt;
*(_QWORD *)&NewController[80] = qword_140C50790;
*(_QWORD *)&NewController[88] = HalpApicSetLineState;
*(_QWORD *)&NewController[96] = HalpApicRequestInterrupt;
*(_QWORD *)&NewController[104] = HalpApicStartProcessor;
*(_QWORD *)&NewController[112] = HalpApicGenerateMessage;
*(_QWORD *)&NewController[128] = HalpApicSaveLocalInterrupts;
*(_QWORD *)&NewController[136] = HalpApicReplayLocalInterrupts;
*(_QWORD *)&NewController[160] = HalpApicQueryAndGetSource;
DWORD2(v11) = v4;
HIDWORD(v12) = v3;
result = HalRegisterPermanentAddressUsage(PhysicalAddress, 0x400u);
if( result >= 0 )
return HalpInterruptRegisterController((_INTERRUPT_INITIALIZATION_BLOCK *)NewController, v8, v9);
return result;
}Referenced by:
HalpApicDiscover