HalpDmaCommitScatterMapBuffers

_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaCommitScatterMapBuffers(
        _HALP_DMA_ADAPTER_OBJECT *Adapter,
        VOID *VirtualAddress,
        UINT64 PhysicalAddress,
        UINT64 PageCount,
        _MDL *Mdl){
  _MDL *v8; 
  unsigned __int64 v9; 
  _HALP_DMA_TRANSLATION_ENTRY *result; 
  _HALP_DMA_TRANSLATION_ENTRY *v11; 
  unsigned __int8 IsMasterAdapter; 
  _HALP_DMA_TRANSLATION_ENTRY *v13; 
  __int64 v14; 
  UINT64 v15; 
  _MDL *Next; 
  unsigned __int64 v17; 
  _HALP_DMA_TRANSLATION_ENTRY *v18; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  if( Mdl )
  {
    v8 = Mdl + 1;
    v9 = (((LODWORD(Mdl->StartVa) + Mdl->ByteOffset) & 0xFFF) + (unsigned __int64)Mdl->ByteCount + 4095) >> 12;
  }
  else
  {
    LODWORD(v9) = PageCount;
    v8 = 0i64;
  }
  result = HalpDmaGetTranslationEntries(Adapter, HalpDmaNonContiguousMapBuffer, (unsigned int)v9);
  v11 = result;
  if( result )
  {
    IsMasterAdapter = Adapter->IsMasterAdapter;
    v13 = result;
    if( (_DWORD)v9 )
    {
      v14 = (unsigned int)v9;
      do
      {
        v15 = PhysicalAddress;
        if( Mdl )
        {
          Next = v8->Next;
          v8 = (_MDL *)((char *)v8 + 8);
          v15 = (_QWORD)Next << 12;
        }
        else
        {
          PhysicalAddress += 4096i64;
        }
        v13->PhysicalAddress = v15;
        if( VirtualAddress )
        {
          v17 = (unsigned __int64)VirtualAddress | (__int64)v13->u.VirtualAddress & 0xFFF;
          VirtualAddress = (char *)VirtualAddress + 4096;
        }
        else
        {
          v17 = (unsigned __int64)v13->u.VirtualAddress;
        }
        v13->u.VirtualAddress = (void *)((4i64 * (IsMasterAdapter & 1)) | v17 & 0xFFFFFFFFFFFFFFFAui64 | IsMasterAdapter & 1 | 0xA);
        v13 = v13->Next;
        --v14;
      }
      while( v14 );
    }
    KeAcquireInStackQueuedSpinLock(&Adapter->SpinLock, &LockHandle);
    v18 = HalpDmaPrependTranslations(v11, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v9);
    Adapter->NumberOfFreeScatterBuffers += v9;
    Adapter->ScatterBufferListHead = v18;
    if( IsMasterAdapter )
      LODWORD(Adapter[1].ContiguousTranslationEnd.Buffer) += v9;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    return v11;
  }
  return result;
}

Referenced by:

HalpDmaAllocateLocalScatterPool
HalpDmaGrowScatterMapBuffers