HalpIommuInitDiscard
NTSTATUS __stdcall HalpIommuInitDiscard(INT64 a1){
bool v2;
_QWORD *v3;
NTSTATUS result;
INT64 v5;
int v6;
INT64 v7[2];
*(&CmpDummyThreadEvent + 514) = 0i64;
qword_140C49BA0._bf_0 = 0i64;
stru_140C49BA8._bf_0 = 0i64;
v2 = byte_140C4A318 == 0;
v3 = HalIommuDispatch;
*(&CmpDummyThreadEvent + 513) = (char *)&CmpDummyThreadEvent + 4096;
*(&CmpDummyThreadEvent + 512) = (char *)&CmpDummyThreadEvent + 4096;
stru_140C49BB0.BufferList.Blink = (_LIST_ENTRY *)&stru_140C49BB0;
stru_140C49BB0.BufferList.Flink = (_LIST_ENTRY *)&stru_140C49BB0;
qword_140C49C08 = &qword_140C49C00;
qword_140C49C00 = &qword_140C49C00;
*((_QWORD *)HalIommuDispatch + 1) = IommuGetConfiguration;
v3[2] = IommuGetLibraryContext;
v3[3] = IommuMapDevice;
v3[4] = IommuEnableDevicePasid;
v3[5] = IommuSetAddressSpace;
v3[6] = IommuDisableDevicePasid;
v3[7] = IommuUnmapDevice;
v3[9] = IommuFlushTb;
v3[10] = IommuFlushAllPasid;
v3[11] = IommuProcessPageRequestQueue;
v3[16] = IommuDevicePowerChange;
v3[17] = IommuBeginDeviceReset;
v3[18] = IommuFinalizeDeviceReset;
*(_OWORD *)v7 = 0i64;
byte_140C49B2D = 0;
byte_140C49B40 = 0;
byte_140C49B2C = 0;
if( !v2 )
{
byte_140C49B2E = ((unsigned int)EDX(__cpuid(1073741827, 0)) >> 24) & 1;
byte_140C49B2D = (EDX(__cpuid(1073741827, 0)) & 0x2000000) != 0;
HviGetHardwareFeatures((INT64)v7);
if( (v7[0] & 0x20) != 0 )
{
byte_140C49B2C = 1;
v3[1] = IommuHvGetConfiguration;
v3[5] = IommuHvSetAddressSpace;
v3[9] = IommuHvFlushTb;
v3[10] = IommuHvFlushAllPasid;
v3[16] = IommuHvDevicePowerChange;
}
}
byte_140C49BF2 = *(int *)(*(_QWORD *)(a1 + 240) + 132i64) < 0;
result = HalpIommuRegisterBuiltinPlugins();
v5 = qword_140C49B50;
if( (INT64 *)qword_140C49B50 != &qword_140C49B50 )
{
while( 1 )
{
v6 = *(_DWORD *)(v5 + 456);
v5 = *(_QWORD *)v5;
if( (v6 & 0x40) == 0 )
break;
if( (INT64 *)v5 == &qword_140C49B50 )
return result;
}
}
HalpInterruptX2ApicPolicy = 0;
return result;
}Referenced by:
HalpIommuInitSystem