HalpIommuConstructReservedPageTable

NTSTATUS __stdcall HalpIommuConstructReservedPageTable(INT64 a1, _LARGE_INTEGER *a2, UINT64 a3){
  unsigned int v3; 
  int PageTableType; 
  INT64 v7; 
  _LARGE_INTEGER *v8; 
  __int64 i; 
  _LARGE_INTEGER v10; 
  _LARGE_INTEGER v11; 
  INT64 v12; 
  INT64 v14; 
  INT64 v15; 

  LODWORD(v15) = 0;
  v3 = a3;
  if( byte_140C49B2C || !a2[3].anonymous_0.LowPart )
    return -1073741811;
  PageTableType = HalpIommuGetPageTableType(&v15);
  if( PageTableType >= 0 )
  {
    v8 = a2 + 1;
    PageTableType = HalpIommuCreateDmarPageTable((unsigned int)v15, v3, v3, v7, v14, a1, (INT64 *)&a2[1]);
    if( PageTableType >= 0 )
    {
      PageTableType = HalpIommuGetDmarptRootAddress(v8->QuadPart, v3, a2 + 2);
      if( PageTableType >= 0 )
      {
        for( i = 0i64; (unsigned int)i < a2[3].anonymous_0.LowPart; i = (unsigned int)(i + 1) )
        {
          if( !LOBYTE(a2[3 * i + 6].anonymous_0.LowPart) )
          {
            if( (a2[3 * i + 4].anonymous_0.LowPart & 0xFFF) != 0 )
              return -1073741811;
            v10 = a2[3 * i + 5];
            v11 = a2[3 * i + 4];
            if( v10.QuadPart <= v11.QuadPart )
              return -1073741811;
            v12 = v10.QuadPart - v11.QuadPart + 1;
            if( (v12 & 0xFFF) != 0 )
              return -1073741811;
            PageTableType = HalpIommuMapLogicalRange(a1, v8->QuadPart, 3ui64, a2[3 * i + 4].QuadPart, v12, v11.QuadPart);
            if( PageTableType < 0 )
              return PageTableType;
          }
        }
      }
    }
  }
  return PageTableType;
}

Referenced by:

HalpIommuConstructReservedPageTables