HalJoinDmaDomain

NTSTATUS __stdcall HalJoinDmaDomain(_ADAPTER_OBJECT *ChildAdapter, VOID *DomainHandle){
  char v4; 
  char v5; 
  _EXT_IOMMU_TRANSLATION_TYPE TranslationType; 
  VOID *v7; 
  UINT8 v8; 
  int v9; 
  UINT64 v11; 
  INT64 *v12; 
  CHAR v13; 
  INT64 v14; 
  _LARGE_INTEGER BoundaryAddressMultiple; 

  v4 = 0;
  v5 = 0;
  if( HalpDmaGetAdapterVersion(ChildAdapter) == 3 && !ChildAdapter->DomainPointer )
  {
    if( (char *)DomainHandle - 1 <= (char *)0xFFFFFFFFFFFFFFFDi64 )
    {
      if( !HalpDmaIsDomainCompatible(ChildAdapter, DomainHandle) )
      {
        v9 = -1073741811;
        goto LABEL_21;
      }
      v9 = HalpDmaReferenceDomainObject((INT64)DomainHandle, v11, v12, v13);
      if( v9 < 0 )
        goto LABEL_21;
    }
    else
    {
      TranslationType = ChildAdapter->TranslationType;
      BoundaryAddressMultiple.QuadPart = (-(__int64)(ChildAdapter->AdapterObject.DmaCanCross64K != 0) & 0xFFFF0000i64)
                                       + 0x10000;
      LODWORD(v7) = HalpDmaAllocateDomain(
                      &ChildAdapter->AdapterObject.MaximumPhysicalAddress,
                      &BoundaryAddressMultiple,
                      TranslationType);
      DomainHandle = v7;
      if( !v7 )
      {
        v9 = -1073741670;
        goto LABEL_21;
      }
      v9 = 0;
    }
    ChildAdapter->DomainPointer = (_HALP_DMA_DOMAIN_OBJECT *)DomainHandle;
    if( *((_DWORD *)DomainHandle + 16) )
    {
      v9 = HalpIommuJoinDmaDomain((INT64 *)ChildAdapter->IommuDevice, *((_QWORD *)DomainHandle + 5));
      v5 = 1;
      if( v9 < 0 )
        goto LABEL_21;
      v4 = 1;
      v9 = HalpDomainLaAllocate(
             (INT64)DomainHandle,
             (PDUMPWRITER_FILL_HEADERS *)ChildAdapter->MaxTransferLength,
             v14,
             0i64,
             0i64,
             (INT64)&ChildAdapter->LowMemoryLogicalAddressBase);
      if( v9 < 0 )
        goto LABEL_20;
      v9 = HalpIommuDomainMapLogicalRange(
             *((_QWORD *)DomainHandle + 5),
             0i64,
             0i64,
             ChildAdapter->MaxTransferLength,
             ChildAdapter->LowMemoryLogicalAddressBase);
    }
    if( v9 >= 0 )
      return v9;
    if( v4 )
      HalpDomainLaDelete((INT64)DomainHandle, ChildAdapter->LowMemoryLogicalAddressBase);
    v5 = 1;
    if( !v4 )
    {
LABEL_21:
      ChildAdapter->DomainPointer = 0i64;
      if( v5 )
        HalpDmaDereferenceDomainObject(DomainHandle);
      return v9;
    }
LABEL_20:
    HalpIommuLeaveDmaDomain((_KDEVICE_QUEUE *)ChildAdapter->IommuDevice, *((_QWORD *)DomainHandle + 5), v8);
    v5 = 1;
    goto LABEL_21;
  }
  return -1073741811;
}

Referenced by:

HalpDmaAllocateChildAdapterV3