HalpDmaAllocateChildAdapterV3

char *__fastcall HalpDmaAllocateChildAdapterV3(
        unsigned int a1,
        int a2,
        unsigned int a3,
        char a4,
        char a5,
        char a6,
        char a7,
        int a8,
        __int64 a9,
        int a10,
        _DEVICE_OBJECT *a11,
        _DWORD *a12){
  INT64 *v12; 
  _DWORD *v13; 
  int SecurityPolicy; 
  int v15; 
  unsigned int v16; 
  _DEVICE_OBJECT *v17; 
  int v18; 
  __int64 v19; 
  __int64 *v20; 
  unsigned __int64 v21; 
  int LocalScatterPool; 
  int v24; 
  __int64 v25; 
  int v26; 
  INT64 *AdapterByDeviceId; 
  char v28; 
  INT64 v29; 
  void *v30; 
  int Device; 
  char v32; 
  __int64 v33; 
  UINT64 v34; 
  __int16 v35; 
  PVOID Object; 
  HANDLE Handle; 
  __int64 v38[4]; 
  __int128 v39; 
  INTERFACE result[2]; 
  unsigned int(__fastcall *v41)(void *, _DEVICE_OBJECT *, __int64, _DEVICE_OBJECT **); 
  v38[0] = 48i64;
  Handle = 0i64;
  v38[3] = 528i64;
  v12 = 0i64;
  v35 = 0;
  v13 = 0i64;
  Object = 0i64;
  memset((INT64)result, 0i64);
  SecurityPolicy = HalpIommuGetSecurityPolicy();
  v38[1] = 0i64;
  v15 = 640;
  v38[2] = 0i64;
  v16 = 0;
  v39 = 0i64;
  if( !a5 )
  {
    v16 = 6 * (a8 + 1);
    v15 = v16 * 4 + 640;
  }
  v17 = a11;
  v18 = a10;
  if( a11 || !a10 || SecurityPolicy != 1 )
  {
    a11 = 0i64;
    if( v17 && a10 )
    {
      if( HalpDmaGetIommuInterface(v17, result) < 0 )
      {
        if( SecurityPolicy == 1 )
          return(char *)v13;
      }
      else
      {
        HIBYTE(v35) = 1;
        if( v41(result[0].Context, 0i64, 0i64, &a11) == -1073741789 && a11 )
        {
          v15 += (int)a11;
        }
        else
        {
          if( SecurityPolicy == 1 )
            goto LABEL_27;
          a11 = 0i64;
        }
      }
    }
    if( (int)ObCreateObjectEx(0, HalpDmaAdapterObjectType, (__int64)v38, 0, v33, v15, 0, 0, &Object, 0i64) < 0 )
      goto LABEL_25;
    v13 = Object;
    memset((INT64)Object, 0i64);
    if( ObReferenceObjectByPointer(v13, 0x20000u, HalpDmaAdapterObjectType, 0) < 0 )
      goto LABEL_25;
    LODWORD(v34) = 0;
    if( ObInsertObjectEx(v13, 0i64, 0x20000ui64, 0i64, v34, 0i64, &Handle) < 0 )
      goto LABEL_25;
    ZwClose(Handle);
    v19 = 0i64;
    *((_QWORD *)v13 + 1) = &HalpDmaOperationsV3;
    v20 = MasterAdapter24V3;
    *((_BYTE *)v13 + 145) = a6;
    *v13 = 41943041;
    if( a3 >= 0x20 )
      v20 = MasterAdapterV3;
    *((_QWORD *)v13 + 15) = 0i64;
    *((_QWORD *)v13 + 16) = 0i64;
    *((_BYTE *)v13 + 144) = 0;
    *((_QWORD *)v13 + 19) = v20;
    if( a3 < 0x40 )
      v21 = (1i64 << a3) - 1;
    else
      v21 = -1i64;
    *((_QWORD *)v13 + 17) = v21;
    if( v21 < v20[17] )
    {
LABEL_24:
      HalPutDmaAdapter((PADAPTER_OBJECT)v13);
LABEL_25:
      v13 = 0i64;
      goto LABEL_26;
    }
    *((_QWORD *)v13 + 39) = 0i64;
    *((_BYTE *)v13 + 338) = 0;
    *((_QWORD *)v13 + 24) = v13 + 46;
    *((_QWORD *)v13 + 23) = v13 + 46;
    *((_QWORD *)v13 + 22) = 0i64;
    *((_BYTE *)v13 + 216) = 0;
    v13[56] = a1;
    *((_BYTE *)v13 + 434) = a4;
    *((_BYTE *)v13 + 437) = a7;
    *((_QWORD *)v13 + 56) = a9;
    *((_BYTE *)v13 + 433) = a5;
    v13[94] = -1;
    v13[110] = a3;
    v13[155] = v16 * 4;
    v13[37] = 3;
    v13[154] = 0;
    *((_QWORD *)v13 + 70) = 0i64;
    *((_QWORD *)v13 + 72) = v13 + 142;
    *((_QWORD *)v13 + 71) = v13 + 142;
    *((_BYTE *)v13 + 584) = 0;
    v13[152] = 0;
    *((_QWORD *)v13 + 61) = IoFreeAdapterChannelV3Passive;
    *((_QWORD *)v13 + 62) = v13;
    *((_QWORD *)v13 + 59) = 0i64;
    if( a1 )
    {
      if( a4 )
        LocalScatterPool = HalpDmaAllocateLocalScatterPool((PHYSICAL_ADDRESS *)v13, a1);
      else
        LocalScatterPool = HalpDmaAllocateLocalContiguousPool((__int64)v13, a1);
      v19 = 0i64;
      if( LocalScatterPool < 0 )
        goto LABEL_24;
      v24 = v13[56];
      *((_BYTE *)v13 + 337) = 0;
    }
    else
    {
      v13[56] = 0;
      v24 = 0;
      *((_BYTE *)v13 + 337) = 1;
    }
    *a12 = v24;
    v13[61] = a2;
    v13[128] = 0;
    *((_QWORD *)v13 + 65) = v17;
    if( a11 && HIBYTE(v35) )
    {
      v25 = (__int64)&v13[v16 + 160];
      *((_QWORD *)v13 + 66) = v25;
      v26 = v41(result[0].Context, a11, v25, 0i64);
      v19 = 0i64;
      if( v26 >= 0 )
      {
        AdapterByDeviceId = HalpDmaFindAdapterByDeviceId(*((_QWORD *)v13 + 66));
        v19 = 0i64;
        v12 = AdapterByDeviceId;
        if( AdapterByDeviceId )
        {
          if( (_DEVICE_OBJECT *)AdapterByDeviceId[65] != v17 )
          {
            ExAcquirePushLockExclusiveEx((UINT64)(AdapterByDeviceId + 39), 0i64);
            LOBYTE(v35) = 1;
          }
          HalPutDmaAdapter((PADAPTER_OBJECT)v12);
          v19 = 0i64;
        }
        if( a10 == 2 )
        {
          v28 = ((__int64(__fastcall *)(_QWORD, _QWORD))off_140C00A38[0])(*((_QWORD *)v13 + 66), 0i64);
          v19 = 0i64;
          if( v28 )
            goto LABEL_52;
          v18 = 0;
        }
      }
      else
      {
        *((_QWORD *)v13 + 66) = 0i64;
        if( SecurityPolicy == 1 )
          goto LABEL_61;
      }
    }
    if( !v18 )
    {
LABEL_56:
      *((_QWORD *)v13 + 63) = v19;
      if( (int)HalJoinDmaDomain((__int64)v13, -1i64) >= 0
        || SecurityPolicy != 1 && v13[128] && (v13[128] = 0, (int)HalJoinDmaDomain((__int64)v13, -1i64) >= 0) )
      {
        v32 = v35;
        if( v12 )
          *((_BYTE *)v12 + 338) = v35;
        *(_QWORD *)(*((_QWORD *)v13 + 63) + 72i64) = v13;
        goto LABEL_67;
      }
      HalpIommuDeleteDevice((UINT64 *)v13 + 67);
LABEL_61:
      HalPutDmaAdapter((PADAPTER_OBJECT)v13);
      v32 = v35;
      v13 = 0i64;
      Object = 0i64;
LABEL_67:
      if( v32 )
      {
        if( (_InterlockedExchangeAdd64(v12 + 39, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock(v12 + 39);
        KeAbPostRelease(v12 + 39);
        v13 = Object;
      }
LABEL_26:
      if( !HIBYTE(v35) )
      {
LABEL_28:
        if( v13 && HalpDmaIsThinApiCapable((INT64)v13) )
          *((_QWORD *)v13 + 1) = &HalpDmaOperationsThin;
        return(char *)v13;
      }
LABEL_27:
      result[0].InterfaceDereference(result[0].Context);
      goto LABEL_28;
    }
LABEL_52:
    v29 = *((_QWORD *)v13 + 66);
    if( v29 && !HalpIommuCheckExceptionList(v29) )
    {
      Device = HalpIommuCreateDevice(v30);
      v19 = 0i64;
      if( Device < 0 )
      {
        if( SecurityPolicy == 1 )
          goto LABEL_61;
      }
      else
      {
        v13[128] = v18;
      }
    }
    goto LABEL_56;
  }
  return(char *)v13;
}

Referenced by:

HalGetAdapterV3