IvtInitializeIdentityMappings

NTSTATUS __stdcall IvtInitializeIdentityMappings(INT64 a1){
  int v2; 
  unsigned int v3; 
  _LARGE_INTEGER v4; 
  UINT8 v5; 
  VOID *v6; 
  unsigned int v7; 
  __int64 v8; 
  __int64 v9; 
  _LARGE_INTEGER v10; 
  UINT8 v11; 
  _LARGE_INTEGER v12; 
  UINT64 *v13; 
  UINT64 *v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 

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

Referenced by:

IvtInitializeIommu