HalpDmaCommitContiguousMapBuffers

_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaCommitContiguousMapBuffers(
        _HALP_DMA_ADAPTER_OBJECT *Adapter,
        VOID *VirtualAddress,
        UINT64 PhysicalAddress,
        UINT64 NumberOfPages){
  __int64 v4; 
  _HALP_DMA_TRANSLATION_BUFFER *ContiguousTranslations; 
  UINT64 v8; 
  _HALP_DMA_TRANSLATION_ENTRY *result; 
  _HALP_DMA_TRANSLATION_ENTRY *v10; 
  _HALP_DMA_TRANSLATION_BUFFER *v11; 
  _HALP_DMA_TRANSLATION_ENTRY *v12; 
  unsigned __int8 IsMasterAdapter; 
  _HALP_DMA_TRANSLATION_ENTRY *v14; 
  UINT32 v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  bool v20; 
  _HALP_DMA_TRANSLATION_BUFFER *Next; 
  unsigned __int8 DmaCanCross64K; 
  _DWORD StartingIndex[3]; 
  __int64 v24; 
  _HALP_DMA_TRANSLATION_ENTRY *v25; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  char v27; 
  int v29; 

  v29 = NumberOfPages;
  v4 = (unsigned int)NumberOfPages;
  memset(&LockHandle, 0, sizeof(LockHandle));
  ContiguousTranslations = Adapter->ContiguousTranslations;
  *(_QWORD *)&StartingIndex[1] = 0i64;
  v8 = (unsigned int)NumberOfPages;
  if( ContiguousTranslations
    && (Adapter->ContiguousTranslationEnd.Buffer != ContiguousTranslations || Adapter->ContiguousTranslationEnd.Offset) )
  {
    v8 = (unsigned int)(NumberOfPages + 1);
    v27 = 1;
  }
  else
  {
    v27 = 0;
  }
  if( !Adapter->DmaCanCross64K )
    v8 = (unsigned int)((((unsigned __int64)(unsigned int)NumberOfPages << 12) + PhysicalAddress - 1) >> 16)
       - (unsigned int)(PhysicalAddress >> 16)
       + (unsigned int)v8;
  result = HalpDmaGetTranslationEntries(Adapter, HalpDmaContiguousMapBuffer, v8);
  v25 = result;
  v10 = result;
  if( result )
  {
    StartingIndex[0] = HalpDmaTranslationEntryToIndex(
                         Adapter,
                         result,
                         (_HALP_DMA_TRANSLATION_BUFFER **)&StartingIndex[1]);
    if( (unsigned int)(((__int64)v10 - *(_QWORD *)(*(_QWORD *)&StartingIndex[1] + 16i64)) / 72) )
    {
      v12 = v10 - 1;
    }
    else
    {
      v11 = Adapter->ContiguousTranslations;
      if( v11 == *(_HALP_DMA_TRANSLATION_BUFFER **)&StartingIndex[1] )
      {
        v12 = 0i64;
      }
      else
      {
        if( v11 )
        {
          do
          {
            Next = v11->Next;
            if( v11->Next == *(_HALP_DMA_TRANSLATION_BUFFER **)&StartingIndex[1] )
              break;
            v11 = v11->Next;
          }
          while( Next );
        }
        v12 = &v11->Entries[v11->EntryCount - 1];
      }
    }
    IsMasterAdapter = Adapter->IsMasterAdapter;
    v14 = v10;
    DmaCanCross64K = Adapter->DmaCanCross64K;
    KeAcquireInStackQueuedSpinLock(&Adapter->SpinLock, &LockHandle);
    if( (_DWORD)v4 )
    {
      v15 = StartingIndex[0];
      v16 = IsMasterAdapter & 1;
      v24 = v4;
      v17 = (unsigned __int64)VirtualAddress;
      v18 = 4 * v16;
      do
      {
        if( v12 )
        {
          if( v12->PhysicalAddress + 4096 != PhysicalAddress
            || !DmaCanCross64K && ((PhysicalAddress ^ v12->PhysicalAddress) & 0xFFFFFFFFFFFF0000ui64) != 0 )
          {
            v14 = v14->Next;
            ++v15;
          }
          v18 = 4 * v16;
        }
        v14->PhysicalAddress = PhysicalAddress;
        if( v17 )
        {
          v19 = v17 | (__int64)v14->u.VirtualAddress & 0xFFF;
          v17 += 4096i64;
        }
        else
        {
          v19 = (unsigned __int64)v14->u.VirtualAddress;
        }
        v14->u.VirtualAddress = (void *)(v19 & 0xFFFFFFFFFFFFFFF0ui64 | IsMasterAdapter & 1 | v18 & 0xFFFFFFFFFFFFFFF7ui64);
        RtlClearBits(Adapter->ContiguousMapRegisters, v15, 1u);
        PhysicalAddress += 4096i64;
        v18 = 4 * v16;
        ++v15;
        v12 = v14;
        v20 = v24-- == 1;
        v14 = v14->Next;
      }
      while( !v20 );
      LODWORD(v4) = v29;
      v10 = v25;
    }
    if( v27 && v14 )
    {
      --Adapter->ContiguousTranslationEnd.Offset;
      memset(v14, 0i64, sizeof(_HALP_DMA_TRANSLATION_ENTRY));
    }
    if( IsMasterAdapter )
      LODWORD(Adapter[1].ScatterTranslations) += v4;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    return v10;
  }
  return result;
}

Referenced by:

HalpDmaAllocateLocalContiguousPool
HalpDmaAllocateMapRegisters
HalpDmaGrowContiguousMapBuffers
HalpDmaInitializeMasterAdapter