ExtEnvRegisterIommu

NTSTATUS __stdcall ExtEnvRegisterIommu(PVOID arg1, PVOID arg2){
  _QWORD *v2; 
  _QWORD *v3; 
  int v5; 
  NTSTATUS v6; 
  _QWORD *v7; 
  _QWORD *v8; 
  char v9; 
  WCHAR v10; 
  unsigned int v11; 
  unsigned __int16 Length; 
  PSTR MemoryInternal; 
  __int64 v14; 
  UNICODE_STRING *v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  unsigned int v19; 
  UINT8 *v20; 
  int v21; 
  __int64 *v22; 
  UINT64 Revision; 
  UINT64 Instance; 
  UINT64 Uid; 
  UINT64 SizeInWords; 
  struct _UNICODE_STRING DestinationString; 
  WCHAR SourceString[80]; 
  v3 = v2;
  DestinationString = 0i64;
  if( *(_DWORD *)arg1 != 1 )
    return -1073741811;
  if( *((_DWORD *)arg1 + 1) != 104 )
    return -1073741811;
  v5 = *((_DWORD *)arg1 + 5);
  if( (v5 & 0xFFFF8000) != 0 )
    return -1073741811;
  v6 = 0;
  if( !*((_DWORD *)arg1 + 18) )
    return -1073741811;
  v7 = (_QWORD *)*((_QWORD *)arg1 + 7);
  if( !v7[1] || (v5 & 2) != 0 && !*(_QWORD *)(*((_QWORD *)arg1 + 8) + 72i64) )
    return -1073741811;
  if( (v5 & 0x40) != 0 && (!v7[14] || !v7[15] || !v7[16]) )
    return -1073741811;
  if( (v5 & 0x20) != 0 )
  {
    v8 = (_QWORD *)*((_QWORD *)arg1 + 8);
    if( !v8[1] || !v8[2] || !v8[3] || !v8[4] || !v8[5] || !v8[7] || !v8[8] || !v8[10] || !v8[11] || !v8[12] )
      return -1073741811;
  }
  v9 = 0;
  if( !*((_DWORD *)arg1 + 4) && *((_QWORD *)arg1 + 1) )
    v9 = 1;
  LODWORD(SizeInWords) = 75;
  LODWORD(Uid) = *((_DWORD *)arg1 + 25);
  LOWORD(Instance) = 0;
  LOWORD(Revision) = 1;
  HalpExtBuildResourceIdString(
    0x5446534Dui64,
    0i64,
    0x4300ui64,
    *((unsigned __int16 *)arg1 + 36),
    Revision,
    Instance,
    Uid,
    SizeInWords,
    SourceString);
  RtlInitUnicodeString(&DestinationString, SourceString, v10);
  v11 = 536;
  if( !v9 )
    v11 = (*((_DWORD *)arg1 + 4) + 543) & 0xFFFFFFF8;
  Length = DestinationString.Length;
  MemoryInternal = HalpMmAllocateMemoryInternal((v11 + DestinationString.Length + 9) & 0xFFFFFFF8, MmCached);
  v14 = (__int64)MemoryInternal;
  if( !MemoryInternal )
    return -1073741670;
  memset((INT64)MemoryInternal, 0i64);
  v16 = (v14 + 543) & 0xFFFFFFFFFFFFFFF8ui64;
  if( v9 )
  {
    *(_QWORD *)(v14 + 16) = *((_QWORD *)arg1 + 1);
  }
  else
  {
    *(_QWORD *)(v14 + 16) = v16;
    v16 = (*((unsigned int *)arg1 + 4) + 7i64 + v16) & 0xFFFFFFFFFFFFFFF8ui64;
  }
  *(_QWORD *)(v14 + 520) = v16;
  *(_BYTE *)(v14 + 40) = 12;
  v17 = *((_QWORD *)arg1 + 7);
  *(_OWORD *)(v14 + 56) = *(_OWORD *)v17;
  *(_OWORD *)(v14 + 72) = *(_OWORD *)(v17 + 16);
  *(_OWORD *)(v14 + 88) = *(_OWORD *)(v17 + 32);
  *(_OWORD *)(v14 + 104) = *(_OWORD *)(v17 + 48);
  *(_OWORD *)(v14 + 120) = *(_OWORD *)(v17 + 64);
  *(_OWORD *)(v14 + 136) = *(_OWORD *)(v17 + 80);
  *(_OWORD *)(v14 + 152) = *(_OWORD *)(v17 + 96);
  *(_OWORD *)(v14 + 168) = *(_OWORD *)(v17 + 112);
  *(_QWORD *)(v14 + 184) = *(_QWORD *)(v17 + 128);
  v18 = *((_QWORD *)arg1 + 8);
  if( v18 )
  {
    *(_OWORD *)(v14 + 192) = *(_OWORD *)v18;
    *(_OWORD *)(v14 + 208) = *(_OWORD *)(v18 + 16);
    *(_OWORD *)(v14 + 224) = *(_OWORD *)(v18 + 32);
    *(_OWORD *)(v14 + 240) = *(_OWORD *)(v18 + 48);
    *(_OWORD *)(v14 + 256) = *(_OWORD *)(v18 + 64);
    *(_OWORD *)(v14 + 272) = *(_OWORD *)(v18 + 80);
    *(_OWORD *)(v14 + 288) = *(_OWORD *)(v18 + 96);
    *(_OWORD *)(v14 + 304) = *(_OWORD *)(v18 + 112);
    *(_OWORD *)(v14 + 320) = *(_OWORD *)(v18 + 128);
    *(_OWORD *)(v14 + 336) = *(_OWORD *)(v18 + 144);
    *(_QWORD *)(v14 + 352) = *(_QWORD *)(v18 + 160);
  }
  *(_DWORD *)(v14 + 24) = *((_DWORD *)arg1 + 4);
  *(_DWORD *)(v14 + 456) = *((_DWORD *)arg1 + 5);
  *(_DWORD *)(v14 + 44) = *((_DWORD *)arg1 + 10);
  *(_DWORD *)(v14 + 52) = *((_DWORD *)arg1 + 12);
  *(_DWORD *)(v14 + 48) = *((_DWORD *)arg1 + 11);
  *(_DWORD *)(v14 + 460) = *((_DWORD *)arg1 + 18);
  *(_DWORD *)(v14 + 464) = *((_DWORD *)arg1 + 19);
  *(_DWORD *)(v14 + 468) = *((_DWORD *)arg1 + 20);
  *(_DWORD *)(v14 + 472) = *((_DWORD *)arg1 + 21);
  *(_DWORD *)(v14 + 496) = *((_DWORD *)arg1 + 22);
  *(_DWORD *)(v14 + 424) = *((_DWORD *)arg1 + 23);
  *(_DWORD *)(v14 + 500) = *((_DWORD *)arg1 + 24);
  *(_QWORD *)(v14 + 376) = v14 + 368;
  *(_QWORD *)(v14 + 368) = v14 + 368;
  *(_DWORD *)(v14 + 404) = *(_DWORD *)(v14 + 500);
  *(_QWORD *)(v14 + 408) = *(_QWORD *)(v14 + 256);
  *(_QWORD *)(v14 + 416) = *(_QWORD *)(v14 + 248);
  *(_QWORD *)(v14 + 392) = 0i64;
  *(_QWORD *)(v14 + 384) = 0i64;
  *(_DWORD *)(v14 + 400) = 0;
  v19 = *((_DWORD *)arg1 + 4);
  if( v19 )
  {
    v20 = (UINT8 *)*((_QWORD *)arg1 + 1);
    if( v20 )
      memmove(*(UINT8 **)(v14 + 16), v20, v19);
  }
  v21 = *((_DWORD *)arg1 + 25);
  *(_WORD *)(v14 + 512) = 0;
  *(_WORD *)(v14 + 514) = Length + 2;
  *(_DWORD *)(v14 + 504) = v21;
  RtlCopyUnicodeString((UNICODE_STRING *)(v14 + 512), &DestinationString, v15);
  v22 = (__int64 *)qword_140C49B58;
  if( *(INT64 **)qword_140C49B58 != &HalpIommuList )
    __fastfail(3u);
  ++HalpIommuCount;
  *(_QWORD *)v14 = &HalpIommuList;
  *(_QWORD *)(v14 + 8) = v22;
  *v22 = v14;
  qword_140C49B58 = v14;
  if( v3 )
    *v3 = *(_QWORD *)(v14 + 16);
  return v6;
}

Referenced by:

HalpIommuProcessIvhdEntry
HalpIvtProcessDrhdEntry