HalpIvtProcessDrhdEntry
NTSTATUS __stdcall HalpIvtProcessDrhdEntry(UINT64 a1, UINT64 a2){
int ReservedDomainList;
char v5;
INT64 v6;
NTSTATUS Memory;
UINT64 v8;
_LARGE_INTEGER v9;
UINT8 v10;
size_t v11;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
char v15;
int v16;
unsigned __int64 v17;
_BYTE *NextDrhdDeviceScope;
int v19;
__int64 v20;
_DWORD *v21;
int v22;
unsigned int v23;
void *v24;
INT64 v25;
size_t v26;
bool v27;
UINT64 v28;
INT64 v29;
int v31;
_DWORD v32[3];
size_t Size;
int v34;
INT64 v35;
PVOID VirtualAddress;
_QWORD arg1[14];
__int128 v38;
__int64 v39[18];
__int64 v40[30];
char v42;
char v43;
size_t v44;
v38 = 0i64;
memset(v39, 0i64, 0x88u);
memset(v40, 0i64, 0xA8u);
ReservedDomainList = 0;
v35 = 0i64;
v5 = 0;
v44 = 0;
*(_QWORD *)&v32[1] = 0i64;
v43 = 0;
v42 = 0;
if( *(_WORD *)a2 )
return -1073741823;
if( *(_WORD *)(a2 + 2) < 0x10u )
return -1073741811;
if( !*(_QWORD *)(a2 + 8) )
return ReservedDomainList;
if( HalSocRequestApi(16i64, 0i64, 2i64, 0x10ui64, &v38) < 0
|| !((unsigned __int8(__fastcall *)(_QWORD, _QWORD, _QWORD, char *))v38)(0i64, 0i64, 0i64, &v42) )
{
v42 = 0;
}
Memory = ExtEnvAllocateMemory(v6, 0x18ui64, (INT64 *)&v32[1]);
v8 = *(_QWORD *)&v32[1];
ReservedDomainList = Memory;
if( Memory < 0 )
goto LABEL_62;
ReservedDomainList = DmrEnumerateRmrrDomains(a1, a2 + 4, *(INT64 *)&v32[1]);
if( ReservedDomainList < 0 )
goto LABEL_62;
memset(arg1, 0i64, 0x68u);
v9 = *(_LARGE_INTEGER *)(a2 + 8);
arg1[0] = 0x6800000001i64;
VirtualAddress = (PVOID)HalMapIoSpace(v9, 0x220ui64, MmNonCached, v10);
if( !VirtualAddress )
{
ReservedDomainList = -1073741670;
LABEL_62:
if( v8 )
{
DmrFreeRmrrTree(v8);
ExtEnvFreeMemory(v29, v8);
}
return ReservedDomainList;
}
ReservedDomainList = HalRegisterPermanentAddressUsage(v9, 0x220u);
if( ReservedDomainList >= 0 )
{
v11 = *(unsigned __int16 *)(a2 + 2) - 16;
arg1[1] = 0i64;
Size = v11;
LODWORD(arg1[2]) = v11 + 304;
arg1[7] = v39;
arg1[8] = v40;
v39[0] = (__int64)IvtConfigureSettings;
v39[1] = (__int64)IvtInitializeIommu;
v39[4] = (__int64)IvtCreateDevice;
v39[5] = (__int64)IvtDeleteDevice;
v40[13] = (__int64)IvtCheckForReservedRegion;
v40[0] = (__int64)IvtFindDevice;
v40[17] = (__int64)IvtEnumerateRmrrDevices;
HIDWORD(arg1[9]) = *(unsigned __int16 *)(a2 + 6);
LODWORD(arg1[9]) = 2;
LODWORD(arg1[12]) = 16;
HIDWORD(arg1[2]) = 4;
v12 = *((_QWORD *)VirtualAddress + 1) & 0xFFFFFFFFFFFFEEFFui64;
_BitScanReverse(&v11, (v12 >> 8) & 0x1F);
v44 = v11;
v13 = *((_QWORD *)VirtualAddress + 2);
v14 = 1i64 << (((unsigned __int8)(v13 >> 35) & 0x1Fu) + 1);
if( v14 > 0x100000 )
LODWORD(v14) = 0x100000;
v15 = *(_BYTE *)(a1 + 37) & 3;
LODWORD(arg1[11]) = v14;
if( v15 == 1 && (v13 & 0x18) == 24 )
{
v39[14] = (__int64)IvtUpdateRemappingTableEntry;
v16 = 68;
HIDWORD(arg1[2]) = 68;
v39[15] = (__int64)IvtInvalidateRemappingTableEntry;
v39[16] = (__int64)IvtUpdateRemappingDestination;
}
else
{
v16 = HIDWORD(arg1[2]);
}
if( v42 == 2
&& (v13 & 2) != 0
&& (v12 & 0x80u) == 0i64
&& (v13 & 0x40) != 0
&& ((v12 >> 8) & 0x1F) != 0
&& (v12 & 0x80000000000000i64) != 0
&& (v12 & 0x40000000000000i64) != 0
&& (v12 & 0x10) == 0 )
{
v32[0] = v44;
v39[9] = (__int64)IvtFlushDomainTb;
v39[10] = (__int64)xHalTimerWatchdogStop;
v39[11] = (__int64)xHalTimerWatchdogStop;
v39[7] = (__int64)IvtAttachDeviceDomain;
v39[8] = (__int64)IvtDetachDeviceDomain;
v40[18] = (__int64)IvtProcessReservedDomains;
_BitScanReverse64(&v17, (v12 >> 8) & 0x1F);
v16 |= (((_DWORD)v17 << 12) + 4096) | 0x100;
HIDWORD(arg1[2]) = v16;
}
if( (v13 & 1) != 0 )
{
v16 |= 0x800u;
HIDWORD(arg1[2]) = v16;
}
NextDrhdDeviceScope = (_BYTE *)DmrGetNextDrhdDeviceScope(a2, 0i64);
if( NextDrhdDeviceScope
&& *NextDrhdDeviceScope == 1
&& NextDrhdDeviceScope[1] == 8
&& !NextDrhdDeviceScope[5]
&& NextDrhdDeviceScope[6] == 2
&& !NextDrhdDeviceScope[7]
&& !*(_WORD *)(a2 + 6)
&& (v12 & 0x3F0000) < 0x2F0000 )
{
if( !byte_140C49BF2 )
{
v16 &= ~0x100u;
HIDWORD(arg1[2]) = v16;
}
v20 = 0x400000000i64;
if( v19 )
v20 = 0x800000000i64;
if( (v12 & v20) != 0 )
{
v5 = 1;
v43 = 1;
}
}
v31 = 0;
v21 = (_DWORD *)((unsigned __int64)&v31 & -(__int64)(v5 != 0));
v22 = 1 << (2 * (v12 & 7) + 4);
if( v21 )
*v21 = --v22;
v8 = *(_QWORD *)&v32[1];
v34 = v22 - 1;
v23 = v22 - 1 - **(_DWORD **)&v32[1];
v32[0] = **(_DWORD **)&v32[1];
HIDWORD(arg1[11]) = v23;
if( (v16 & 0x20) != 0 || (v16 & 0x100) != 0 )
{
v16 |= 0x12u;
v40[10] = (__int64)IvtEnableInterrupt;
v40[11] = (__int64)IvtDisableInterrupt;
v40[12] = (__int64)IvtHandleInterrupt;
v40[9] = (__int64)IvtSetMessageInterruptRouting;
HIDWORD(arg1[2]) = v16;
}
if( DmrValidateDeviceScope(a1, a2) < 0 && (v16 & 0x20) != 0 )
KeBugCheckEx(0x5Cu, (PVOID)0x500, (PVOID)3, 0i64, 0i64);
ReservedDomainList = ExtEnvRegisterIommu(arg1, v24);
if( ReservedDomainList >= 0 )
{
v25 = v35;
*(_QWORD *)v35 = *(_QWORD *)(a2 + 8);
*(_DWORD *)(v25 + 212) = *(unsigned __int16 *)(a2 + 6);
*(_QWORD *)(v25 + 176) = v12;
v26 = Size;
*(_QWORD *)(v25 + 184) = v13;
*(_QWORD *)(v25 + 232) = v25 + 304;
*(_DWORD *)(v25 + 216) = v26;
v27 = (arg1[2] & 0x2000000000i64) == 0;
*(_BYTE *)(v25 + 228) = *(_BYTE *)(a2 + 4) & 1;
*(_DWORD *)(v25 + 220) = v34;
*(_DWORD *)(v25 + 224) = v31;
*(_DWORD *)(v25 + 208) = v44;
*(_QWORD *)(v25 + 168) = 0i64;
*(_QWORD *)(v25 + 200) = v25 + 192;
*(_QWORD *)(v25 + 192) = v25 + 192;
if( !v27 )
*(_BYTE *)(v25 + 268) = 1;
if( (arg1[2] & 0x10000000000i64) != 0 )
*(_BYTE *)(v25 + 269) = 1;
if( v43 )
*(_BYTE *)(v25 + 270) = 1;
v28 = v32[0];
*(_QWORD *)(v25 + 288) = v8;
ReservedDomainList = HalpIvtAllocateReservedDomainList(v25, v23, v28);
if( ReservedDomainList >= 0 )
memmove(*(VOID **)(v25 + 232), (const VOID *)(a2 + 16), v26);
}
}
HalpUnmapVirtualAddress(VirtualAddress, 1i64, 0);
if( ReservedDomainList < 0 )
goto LABEL_62;
return ReservedDomainList;
}Referenced by:
HalpIvtProcessDmarTable