HalpDmaMapContiguousTransferV2

VOID __fastcall HalpDmaMapContiguousTransferV2(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
  unsigned int v8; 
  unsigned int ContiguousPiece; 
  INT64 v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  unsigned int *v15; 
  char v16; 
  _QWORD *v17; 
  v8 = *v15;
  ContiguousPiece = HalpDmaNextContiguousPiece(a1, a2, 0i64, a4, v16, *v15);
  v10 = a4 & 0xFFF;
  v11 = (unsigned int)((unsigned __int64)(a4 - *(_QWORD *)(a2 + 32)) >> 12);
  v12 = *(_QWORD *)(a2 + 8 * v11 + 48);
  if( ContiguousPiece == v8
    && *(_QWORD *)(a1 + 136) >= v10 + (*(_QWORD *)(a2 + 8 * v11 + 48) << 12) + (unsigned __int64)ContiguousPiece - 1
    && (v16
     || *(_BYTE *)(a1 + 437)
     || (v11 = (unsigned int)HalpDmaGetAdapterCacheAlignment(a1) - 1, (v11 & v14) == 0) && (v11 & v13) == 0) )
  {
    *v17 = v10 + (v12 << 12);
    HalpDmaFlushBuffer(v11, a2, a4, v8, v16, 0);
  }
  else
  {
    *v17 = v10 + *(_QWORD *)a3;
    if( v16 )
    {
      HalpDmaSyncMapBuffers(a1, a2, a4, (_QWORD *)a3, v8, v16, 0, 0);
    }
    else if( !*(_BYTE *)(a1 + 437) )
    {
      HalpDmaSyncMapBuffers(a1, a2, a4, (_QWORD *)a3, v8, 0, 1, 0);
    }
  }
}

Referenced by:

HalpMapTransferV2