ExtEnvRegisterIommu

NTSTATUS __stdcall ExtEnvRegisterIommu(PVOID arg1, PVOID arg2){
  _QWORD *v2; 
  _QWORD *v3; 
  int v5; 
  NTSTATUS v6; 
  _QWORD *v7; 
  _QWORD *v8; 
  char v9; 
  unsigned int v10; 
  unsigned __int16 Length; 
  unsigned int v12; 
  PSTR MemoryInternal; 
  PSTR v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  size_t v18; 
  const VOID *v19; 
  int v20; 
  PSTR *v21; 
  UINT64 Revision; 
  UINT64 Instance; 
  UINT64 Uid; 
  UINT64 ResourceIdLength; 
  _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(ResourceIdLength) = 75;
  LODWORD(Uid) = *((_DWORD *)arg1 + 25);
  LOWORD(Instance) = 0;
  LOWORD(Revision) = 1;
  HalpExtBuildResourceIdString(
    0x5446534Dui64,
    0i64,
    0x4300ui64,
    *((unsigned __int16 *)arg1 + 36),
    Revision,
    Instance,
    Uid,
    ResourceIdLength,
    SourceString);
  RtlInitUnicodeString(&DestinationString, SourceString);
  v10 = 536;
  if( !v9 )
    v10 = (*((_DWORD *)arg1 + 4) + 543) & 0xFFFFFFF8;
  Length = DestinationString.Length;
  v12 = (v10 + DestinationString.Length + 9) & 0xFFFFFFF8;
  MemoryInternal = HalpMmAllocateMemoryInternal(v12, MmCached);
  v14 = MemoryInternal;
  if( !MemoryInternal )
    return -1073741670;
  memset(MemoryInternal, 0i64, v12);
  v15 = (unsigned __int64)(v14 + 543) & 0xFFFFFFFFFFFFFFF8ui64;
  if( v9 )
  {
    *((_QWORD *)v14 + 2) = *((_QWORD *)arg1 + 1);
  }
  else
  {
    *((_QWORD *)v14 + 2) = v15;
    v15 = (*((unsigned int *)arg1 + 4) + 7i64 + v15) & 0xFFFFFFFFFFFFFFF8ui64;
  }
  *((_QWORD *)v14 + 65) = v15;
  v14[40] = 12;
  v16 = *((_QWORD *)arg1 + 7);
  *(_OWORD *)(v14 + 56) = *(_OWORD *)v16;
  *(_OWORD *)(v14 + 72) = *(_OWORD *)(v16 + 16);
  *(_OWORD *)(v14 + 88) = *(_OWORD *)(v16 + 32);
  *(_OWORD *)(v14 + 104) = *(_OWORD *)(v16 + 48);
  *(_OWORD *)(v14 + 120) = *(_OWORD *)(v16 + 64);
  *(_OWORD *)(v14 + 136) = *(_OWORD *)(v16 + 80);
  *(_OWORD *)(v14 + 152) = *(_OWORD *)(v16 + 96);
  *(_OWORD *)(v14 + 168) = *(_OWORD *)(v16 + 112);
  *((_QWORD *)v14 + 23) = *(_QWORD *)(v16 + 128);
  v17 = *((_QWORD *)arg1 + 8);
  if( v17 )
  {
    *((_OWORD *)v14 + 12) = *(_OWORD *)v17;
    *((_OWORD *)v14 + 13) = *(_OWORD *)(v17 + 16);
    *((_OWORD *)v14 + 14) = *(_OWORD *)(v17 + 32);
    *((_OWORD *)v14 + 15) = *(_OWORD *)(v17 + 48);
    *((_OWORD *)v14 + 16) = *(_OWORD *)(v17 + 64);
    *((_OWORD *)v14 + 17) = *(_OWORD *)(v17 + 80);
    *((_OWORD *)v14 + 18) = *(_OWORD *)(v17 + 96);
    *((_OWORD *)v14 + 19) = *(_OWORD *)(v17 + 112);
    *((_OWORD *)v14 + 20) = *(_OWORD *)(v17 + 128);
    *((_OWORD *)v14 + 21) = *(_OWORD *)(v17 + 144);
    *((_QWORD *)v14 + 44) = *(_QWORD *)(v17 + 160);
  }
  *((_DWORD *)v14 + 6) = *((_DWORD *)arg1 + 4);
  *((_DWORD *)v14 + 114) = *((_DWORD *)arg1 + 5);
  *((_DWORD *)v14 + 11) = *((_DWORD *)arg1 + 10);
  *((_DWORD *)v14 + 13) = *((_DWORD *)arg1 + 12);
  *((_DWORD *)v14 + 12) = *((_DWORD *)arg1 + 11);
  *((_DWORD *)v14 + 115) = *((_DWORD *)arg1 + 18);
  *((_DWORD *)v14 + 116) = *((_DWORD *)arg1 + 19);
  *((_DWORD *)v14 + 117) = *((_DWORD *)arg1 + 20);
  *((_DWORD *)v14 + 118) = *((_DWORD *)arg1 + 21);
  *((_DWORD *)v14 + 124) = *((_DWORD *)arg1 + 22);
  *((_DWORD *)v14 + 106) = *((_DWORD *)arg1 + 23);
  *((_DWORD *)v14 + 125) = *((_DWORD *)arg1 + 24);
  *((_QWORD *)v14 + 47) = v14 + 368;
  *((_QWORD *)v14 + 46) = v14 + 368;
  *((_DWORD *)v14 + 101) = *((_DWORD *)v14 + 125);
  *((_QWORD *)v14 + 51) = *((_QWORD *)v14 + 32);
  *((_QWORD *)v14 + 52) = *((_QWORD *)v14 + 31);
  *((_QWORD *)v14 + 49) = 0i64;
  *((_QWORD *)v14 + 48) = 0i64;
  *((_DWORD *)v14 + 100) = 0;
  v18 = *((_DWORD *)arg1 + 4);
  if( v18 )
  {
    v19 = (const VOID *)*((_QWORD *)arg1 + 1);
    if( v19 )
      memmove(*((VOID **)v14 + 2), v19, v18);
  }
  v20 = *((_DWORD *)arg1 + 25);
  *((_WORD *)v14 + 256) = 0;
  *((_WORD *)v14 + 257) = Length + 2;
  *((_DWORD *)v14 + 126) = v20;
  RtlCopyUnicodeString((PUNICODE_STRING)v14 + 32, &DestinationString);
  v21 = (PSTR *)qword_140C49B58;
  if( (INT64 *)*qword_140C49B58 != &qword_140C49B50 )
    __fastfail(3u);
  ++dword_140C49B24;
  *(_QWORD *)v14 = &qword_140C49B50;
  *((_QWORD *)v14 + 1) = v21;
  *v21 = v14;
  qword_140C49B58 = v14;
  if( v3 )
    *v3 = *((_QWORD *)v14 + 2);
  return v6;
}

Referenced by:

HalpIommuProcessIvhdEntry
HalpIvtProcessDrhdEntry