HalpDmaMapScatterTransferV3

void __fastcall HalpDmaMapScatterTransferV3(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        __int64 a4,
        unsigned int *a5,
        char a6,
        char a7,
        __int64 *a8){
  unsigned int ContiguousPiece; 
  unsigned int v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  _QWORD *v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  bool v22; 
  ContiguousPiece = HalpDmaNextContiguousPiece(a1, a2, a3, a4, a6, *a5);
  v13 = ContiguousPiece;
  *a5 = ContiguousPiece;
  if( ContiguousPiece )
  {
    v14 = a4 & 0xFFF;
    v15 = (unsigned int)((unsigned __int64)(a4 - *(_QWORD *)(a2 + 32)) >> 12);
    v16 = v14 + (*(_QWORD *)(a2 + 8 * v15 + 48) << 12);
    if( a3
      && ((v17 = ContiguousPiece, *(_QWORD *)(a1 + 136) < v16 + (unsigned __int64)ContiguousPiece - 1)
       && *(_DWORD *)(a1 + 512) != 2
       || !*(_BYTE *)(a1 + 437)
       && !a6
       && ((v15 = (unsigned int)HalpDmaGetAdapterCacheAlignment(a1) - 1, (v15 & v16) != 0)
        || ((unsigned int)v15 & v13) != 0)
       || *(_BYTE *)(a3 + 64)) )
    {
      v18 = *(_QWORD **)(a3 + 56);
      *a8 = v14 + *v18;
      if( a6 )
      {
        HalpDmaSyncMapBuffers(a1, a2, a4, v18, v13, a6, 0, a7);
      }
      else if( !*(_BYTE *)(a1 + 437) )
      {
        HalpDmaSyncMapBuffers(a1, a2, a4, v18, v13, 0, 1, a7);
      }
      v19 = *(_QWORD *)(a3 + 56);
      v20 = (unsigned __int64)(v17 + v14 + 4095) >> 12;
      if( (_DWORD)v20 )
      {
        v21 = (unsigned int)v20;
        do
        {
          v19 = *(_QWORD *)(v19 + 8);
          --v21;
        }
        while( v21 );
      }
      *(_QWORD *)(a3 + 56) = v19;
    }
    else
    {
      v22 = *(_BYTE *)(a1 + 437) == 0;
      *a8 = v16;
      if( v22 )
        HalpDmaFlushBuffer(v15, a2, a4, v13, a6, a7);
    }
  }
}

Referenced by:

HalpMapTransferV3