HalpDmaFlushScatterTransferV3

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

Referenced by:

HalFlushAdapterBuffersEx
IoFlushAdapterBuffersV3