HalpDmaAllocateMapRegistersAtHighLevel

_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateMapRegistersAtHighLevel(
        _HALP_DMA_TRANSLATION_ENTRY *ChildAdapter,
        UINT64 *MapRegisterCount){
  char v2; 
  char v3; 
  unsigned int v4; 
  _HALP_DMA_ADAPTER_OBJECT *Next; 
  int v8; 
  _HALP_DMA_TRANSLATION_ENTRY *v9; 
  bool v10; 
  _HALP_DMA_TRANSLATION_ENTRY *result; 
  _HALP_DMA_TRANSLATION_ENTRY *v12; 
  _HALP_DMA_TRANSLATION_ENTRY *v13; 
  _ADAPTER_OBJECT *v14; 
  UINT64 v15; 
  _HALP_DMA_TRANSLATION_ENTRY *v16; 
  _HALP_DMA_TRANSLATION_ENTRY *v17; 
  _HALP_DMA_TRANSLATION_BUFFER_POSITION *p_LogicalMappedLength; 
  _ADAPTER_OBJECT *p_ScatterHint; 
  _HALP_DMA_TRANSLATION_ENTRY *v20; 
  _ADAPTER_OBJECT *v21; 
  _HALP_DMA_TRANSLATION_ENTRY *v22; 
  _HALP_DMA_TRANSLATION_ENTRY *v23; 
  struct {_HALP_DMA_TRANSLATION_BUFFER_POSITION ContiguousHint;_HALP_DMA_TRANSLATION_BUFFER_POSITION ScatterHint;} *p_CrashDump; 
  _HALP_DMA_TRANSLATION_ENTRY *v25; 
  INT64 ContiguousAllocation; 
  INT64 ContiguousAllocationa; 
  UINT64 v28; 
  UINT64 PagesAllocated; 

  v2 = BYTE2(ChildAdapter[6].PhysicalAddress);
  v3 = 0;
  v4 = *(_DWORD *)MapRegisterCount;
  Next = (_HALP_DMA_ADAPTER_OBJECT *)ChildAdapter[2].Next;
  LODWORD(v28) = 0;
  v8 = 0;
  LODWORD(PagesAllocated) = 0;
  v9 = 0i64;
  if( v2 )
  {
    if( ChildAdapter[1].LogicalMappedLength )
      goto LABEL_32;
    v10 = LODWORD(ChildAdapter[1].NextLogicalAddress) == 0;
  }
  else
  {
    if( *(_QWORD *)&ChildAdapter[1].MappedLength )
      goto LABEL_32;
    v10 = LODWORD(ChildAdapter[1].LogicalAddress) == 0;
  }
  if( v10 )
  {
    if( !BYTE1(ChildAdapter[4].u.VirtualAddress) )
    {
      if( v2 )
      {
        result = HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevel(
                   (_ADAPTER_OBJECT *)ChildAdapter,
                   (_HALP_DMA_ADAPTER_OBJECT *)ChildAdapter,
                   v4,
                   &PagesAllocated);
        v8 = PagesAllocated;
        v9 = result;
        if( (_DWORD)PagesAllocated == v4 )
          return result;
      }
      else
      {
        LODWORD(result) = HalpDmaAllocateContiguousPagesFromContiguousPoolAtHighLevel((INT64)ChildAdapter);
        v9 = result;
        if( result )
          return result;
      }
    }
    if( BYTE2(ChildAdapter[6].PhysicalAddress) )
    {
      v12 = HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevel((_ADAPTER_OBJECT *)ChildAdapter, Next, v4 - v8, &v28);
      if( v12 )
      {
        v13 = HalpDmaPrependTranslations(v12, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v28);
        v8 += v28;
        v9 = v13;
        LODWORD(PagesAllocated) = v8;
      }
      if( v8 == v4 )
        return v9;
      if( HalpDmaGetAdapterVersion((_ADAPTER_OBJECT *)ChildAdapter) == 2 )
        v16 = HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2(v14, Next, v15, &v28);
      else
        v16 = HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV3(v14, Next, v15, &v28);
      if( v16 )
      {
        v17 = HalpDmaPrependTranslations(v16, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v28);
        v8 += v28;
        v9 = v17;
        LODWORD(PagesAllocated) = v8;
      }
      if( v8 == v4 )
        return v9;
    }
    else
    {
      LODWORD(result) = HalpDmaAllocateContiguousPagesFromContiguousPoolAtHighLevel((INT64)ChildAdapter);
      v9 = result;
      if( result )
        return result;
    }
    if( byte_140C4A108 )
    {
      if( BYTE2(ChildAdapter[6].PhysicalAddress) )
      {
        *(_DWORD *)MapRegisterCount = PagesAllocated;
      }
      else if( !v9 )
      {
        *(_DWORD *)MapRegisterCount = 0;
      }
      return v9;
    }
    v8 = PagesAllocated;
  }
LABEL_32:
  if( BYTE2(ChildAdapter[6].PhysicalAddress) )
  {
    p_LogicalMappedLength = (_HALP_DMA_TRANSLATION_BUFFER_POSITION *)&ChildAdapter[1].LogicalMappedLength;
    p_ScatterHint = (_ADAPTER_OBJECT *)&Next->CrashDump.ScatterHint;
    while( 1 )
    {
      if( BYTE1(ChildAdapter[4].u.VirtualAddress) )
      {
        v9 = 0i64;
      }
      else
      {
        LOBYTE(ContiguousAllocation) = 0;
        result = HalpDmaForceAllocation(
                   (_ADAPTER_OBJECT *)&PagesAllocated,
                   (_HALP_DMA_TRANSLATION_BUFFER *)ChildAdapter->u.VirtualAddress,
                   p_LogicalMappedLength,
                   v4,
                   ContiguousAllocation,
                   &PagesAllocated);
        v8 = PagesAllocated;
        v9 = result;
        if( (_DWORD)PagesAllocated == v4 )
          return result;
        p_ScatterHint = (_ADAPTER_OBJECT *)&Next->CrashDump.ScatterHint;
      }
      LOBYTE(ContiguousAllocation) = 0;
      v20 = HalpDmaForceAllocation(
              p_ScatterHint,
              Next->ScatterTranslations,
              (_HALP_DMA_TRANSLATION_BUFFER_POSITION *)p_ScatterHint,
              v4 - v8,
              ContiguousAllocation,
              &v28);
      if( v20 )
      {
        v22 = HalpDmaPrependTranslations(v20, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v28);
        v8 += v28;
        v9 = v22;
        LODWORD(PagesAllocated) = v8;
      }
      if( v8 == v4 )
        return v9;
      LOBYTE(ContiguousAllocationa) = 0;
      v23 = HalpDmaForceAllocation(
              v21,
              Next->ContiguousTranslations,
              &Next->CrashDump.ContiguousHint,
              v4 - v8,
              ContiguousAllocationa,
              &v28);
      if( v23 )
      {
        v25 = HalpDmaPrependTranslations(v23, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v28);
        v8 += v28;
        p_CrashDump = &Next->CrashDump;
        LODWORD(PagesAllocated) = v8;
        v9 = v25;
      }
      if( v8 == v4 )
        return v9;
      if( v3 )
        goto LABEL_50;
      LODWORD(ChildAdapter[1].NextLogicalAddress) = 0;
      p_LogicalMappedLength = (_HALP_DMA_TRANSLATION_BUFFER_POSITION *)&ChildAdapter[1].LogicalMappedLength;
      ChildAdapter[1].LogicalMappedLength = 0i64;
      p_ScatterHint = (_ADAPTER_OBJECT *)&Next->CrashDump.ScatterHint;
      Next->CrashDump.ScatterHint.Buffer = 0i64;
      v3 = 1;
      Next->CrashDump.ScatterHint.Offset = 0;
      p_CrashDump->ContiguousHint.Buffer = 0i64;
      Next->CrashDump.ContiguousHint.Offset = 0;
    }
  }
  if( BYTE1(ChildAdapter[4].u.VirtualAddress)
    || (LOBYTE(ContiguousAllocation) = 1,
        (result = HalpDmaForceAllocation(
                    (_ADAPTER_OBJECT *)ChildAdapter,
                    (_HALP_DMA_TRANSLATION_BUFFER *)ChildAdapter->NextLogicalAddress,
                    (_HALP_DMA_TRANSLATION_BUFFER_POSITION *)&ChildAdapter[1].MappedLength,
                    v4,
                    ContiguousAllocation,
                    0i64)) == 0i64) )
  {
    LOBYTE(ContiguousAllocation) = 1;
    result = HalpDmaForceAllocation(
               (_ADAPTER_OBJECT *)ChildAdapter,
               Next->ContiguousTranslations,
               &Next->CrashDump.ContiguousHint,
               v4,
               ContiguousAllocation,
               0i64);
    if( !result )
    {
LABEL_50:
      *(_DWORD *)MapRegisterCount = 0;
      return 0i64;
    }
  }
  return result;
}

Referenced by:

HalAllocateCrashDumpRegisters
HalDmaAllocateCrashDumpRegistersEx