HalFlushAdapterBuffersEx

__int64 __fastcall HalFlushAdapterBuffersEx(
        __int64 a1,
        __int64 a2,
        _QWORD *a3,
        unsigned __int64 a4,
        UINT64 a5,
        char a6){
  bool v7; 
  _QWORD *v8; 
  struct _MDL *v11; 
  unsigned int v12; 
  unsigned __int64 v13; 
  DMA_OPERATIONS *v15; 
  struct _MDL *Next; 
  unsigned int v17; 
  int v18; 
  int AdapterCacheAlignment; 
  __int64 v20; 
  unsigned __int64 v21; 
  char v22; 
  char v23; 
  PMDL v24; 
  struct _MDL *v25; 
  unsigned int v26; 
  unsigned int v27; 
  __int64 v28; 
  PMDL Mdl; 
  CHAR v30; 
  _QWORD *v31; 
  v7 = *(_DWORD *)(a1 + 512) == 2;
  v8 = a3;
  v30 = 0;
  Mdl = 0i64;
  v31 = 0i64;
  if( v7 )
  {
    v15 = (DMA_OPERATIONS *)a3[3];
    a3[5] = v15;
    HalpDmaFreeLa((PDMA_ADAPTER)a1, v15);
  }
  v11 = *(struct _MDL **)(a1 + 544);
  if( v11 )
  {
    do
    {
      Next = v11->Next;
      if( (v11->MdlFlags & 1) != 0 )
        MmUnmapLockedPages(v11->MappedSystemVa, v11);
      IoFreeMdl(v11);
      v11 = Next;
    }
    while( Next );
  }
  v12 = a5;
  *(_QWORD *)(a1 + 544) = 0i64;
  if( !v12 )
  {
    if( !*(_BYTE *)(a1 + 433) )
      HalpDmaControllerFlushChannel(*(_QWORD *)(a1 + 360), *(_DWORD *)(a1 + 372));
    return 0i64;
  }
  if( !a2 )
    return 3221225485i64;
  do
  {
    v13 = *(unsigned int *)(a2 + 40);
    if( a4 < v13 )
      break;
    a2 = *(_QWORD *)a2;
    a4 -= v13;
  }
  while( a2 );
  if( !a2 )
    return 3221225485i64;
  if( !*(_BYTE *)(a1 + 433) )
    HalpDmaControllerFlushChannel(*(_QWORD *)(a1 + 360), *(_DWORD *)(a1 + 372));
  if( !*(_BYTE *)(a1 + 432) )
    return 0i64;
  if( v8 )
  {
    v17 = *((_DWORD *)v8 + 4);
    if( *(_QWORD *)a2
      || (v18 = *(_DWORD *)(a2 + 44),
          AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(a1),
          ((AdapterCacheAlignment - 1) & (unsigned int)v20) != 0)
      && v21 >= (v20 & 0xFFFFFFFFFFFFF000ui64) )
    {
      v12 = v17;
    }
    else
    {
      v12 = (-AdapterCacheAlignment & (v21 + AdapterCacheAlignment - 1)) - v18 - a4;
      if( v12 > v17 )
        v12 = v17;
    }
  }
  HalpDmaCheckMdlAccessibility(a1, (INT64 *)a2, (unsigned int)a4, v12, &v30, &Mdl);
  v22 = v30;
  v23 = a6;
  if( v30 )
  {
    v24 = Mdl;
    if( !a6 )
      HalpDmaFlushDriverMdl(Mdl);
    if( v24 )
    {
      do
      {
        v25 = v24->Next;
        IoFreeMdl(v24);
        v24 = v25;
      }
      while( v25 );
    }
    if( !v8 )
      return 0i64;
    v22 = v30;
LABEL_35:
    v8[7] = v8;
    while( v12 )
    {
      v26 = v12;
      if( !a2 )
        break;
      v27 = v12;
      if( *(_DWORD *)(a2 + 40) - (int)a4 <= v12 )
        v27 = *(_DWORD *)(a2 + 40) - a4;
      v28 = a4 + *(_QWORD *)(a2 + 32) + *(unsigned int *)(a2 + 44);
      v12 -= v27;
      if( v12 && !*(_QWORD *)a2 )
      {
        v27 = v26;
        v12 = 0;
      }
      if( *(_BYTE *)(a1 + 434) )
        HalpDmaFlushScatterTransferV3(a1, a2, (__int64)v8, v28, v27, v23, v22, &v31);
      else
        HalpDmaFlushContiguousTransferV3(a1, a2, (__int64)v8, v28, v27, v23, v22, &v31);
      v8 = v31;
      a4 = 0i64;
      a2 = *(_QWORD *)a2;
      v22 = v30;
    }
    return 0i64;
  }
  if( v8 )
    goto LABEL_35;
  return 3221225473i64;
}

Referenced by:

HalPutScatterGatherListV3