IvtInitializeIdentityMappings

INT64 __fastcall IvtInitializeIdentityMappings(INT64 a1){
  int v2; 
  unsigned int v3; 
  LARGE_INTEGER v4; 
  PVOID v5; 
  unsigned int v6; 
  __int64 v7; 
  __int64 v8; 
  LARGE_INTEGER v9; 
  LARGE_INTEGER v10; 
  UINT64 *v11; 
  UINT64 *v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  v2 = *(_DWORD *)(a1 + 208);
  v3 = (*(_QWORD *)(a1 + 176) & 0x800000000i64) != 0 ? 30 : 21;
  v4.QuadPart = ((__int64(__fastcall *)(__int64, __int64))IvtPhysicalMemoryApi)(-1i64, 1i64);
  *(LARGE_INTEGER *)(a1 + 272) = v4;
  if( !v4.QuadPart )
    return 3221225473i64;
  v5 = HalMapIoSpace(v4, 0x1000ui64, MmCached);
  *(_QWORD *)(a1 + 280) = v5;
  memset((INT64)v5, 0i64);
  if( (v2 != 0 ? 48 : 39) - v3 > 9 )
  {
    v6 = 0;
    v7 = 0i64;
    while( 1 )
    {
      v8 = *(_QWORD *)(a1 + 280);
      v9.QuadPart = ((__int64(__fastcall *)(__int64, __int64))IvtPhysicalMemoryApi)(-1i64, 1i64);
      v10 = v9;
      if( !v9.QuadPart )
        return 3221225473i64;
      v11 = (UINT64 *)HalMapIoSpace(v9, 0x1000ui64, MmCached);
      v12 = v11;
      if( !v11 )
        return 3221225473i64;
      memset((INT64)v11, 0i64);
      IvtInitializeLargePagePte(v12, (unsigned __int64)v6 << ((unsigned __int8)v3 + 9), v3);
      v13 = 1i64;
      v14 = 2i64;
      do
      {
        v15 = v13++;
        v16 = *(_QWORD *)(v7 + v8) | v15;
        *(_QWORD *)(v7 + v8) = v16;
        --v14;
      }
      while( v14 );
      *(_QWORD *)(v7 + v8) = v16 ^ (v10.QuadPart ^ v16) & 0xFFFFFFFFFF000i64;
      if( (*(_BYTE *)(a1 + 184) & 1) == 0 )
        KeInvalidateRangeAllCachesNoIpi(v12, 0x1000ui64);
      ++v6;
      v7 += 8i64;
      if( v6 >= 0x200 )
        goto LABEL_13;
    }
  }
  IvtInitializeLargePagePte(*(UINT64 **)(a1 + 280), 0i64, v3);
LABEL_13:
  if( (*(_BYTE *)(a1 + 184) & 1) == 0 )
    KeInvalidateRangeAllCachesNoIpi(*(PVOID *)(a1 + 280), 0x1000ui64);
  return 0i64;
}

Referenced by:

IvtInitializeIommu