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