HalpDmaNextContiguousPieceV2

NTSTATUS __stdcall HalpDmaNextContiguousPieceV2(
        _ADAPTER_OBJECT *ChildAdapter,
        _MDL *Mdl,
        _HALP_DMA_TRANSLATION_ENTRY *TranslationBase,
        VOID *CurrentVa,
        INT64 WriteToDevice,
        UINT64 Length){
  __int64 v8; 
  __int64 v9; 
  NTSTATUS AdapterCacheAlignment; 
  unsigned __int64 v11; 
  char v12; 
  char v13; 
  unsigned int v14; 
  unsigned int v15; 
  __int64 v16; 
  __int64 *v17; 
  unsigned __int64 *v18; 
  unsigned int i; 
  _HALP_DMA_TRANSLATION_ENTRY *NextMapping; 
  _HALP_DMA_TRANSLATION_ENTRY *Next; 
  unsigned __int64 v22; 
  __int64 *v23; 
  unsigned __int64 v24; 
  __int64 v25; 
  unsigned __int64 v26; 

  AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(ChildAdapter);
  if( v9 )
  {
    v12 = *(_BYTE *)(v9 + 145);
    v11 = *(_QWORD *)(v9 + 136) >> 12;
    if( !(_BYTE)WriteToDevice && !*(_BYTE *)(v9 + 437) )
    {
      v13 = 1;
      goto LABEL_4;
    }
  }
  else
  {
    v11 = 4095i64;
    v12 = 0;
  }
  v13 = 0;
LABEL_4:
  v14 = 4096 - ((unsigned __int16)CurrentVa & 0xFFF);
  v15 = v14;
  v16 = v8 + 8i64 * (unsigned int)(((unsigned __int64)CurrentVa - *(_QWORD *)(v8 + 32)) >> 12);
  v17 = (__int64 *)(v16 + 48);
  if( *(_QWORD *)(v16 + 48) > v11 || v13 && ((AdapterCacheAlignment - 1) & (unsigned int)CurrentVa) != 0 )
  {
    v15 = 0;
  }
  else
  {
    while( v15 < (unsigned int)Length )
    {
      v23 = v17 + 1;
      v24 = v17[1];
      if( v24 > v11 )
        break;
      v25 = *v17;
      if( v25 + 1 != v24
        || ((v25 ^ v24) & 0xFFFFFFFFFFF00000ui64) != 0
        || v12 != 1 && ((v25 ^ v24) & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
      {
        break;
      }
      v15 += 4096;
      v17 = v23;
    }
    if( v15 > (unsigned int)Length )
    {
      v15 = Length;
      if( v13 )
      {
        if( ((AdapterCacheAlignment - 1) & (unsigned int)Length) != 0 )
          v15 = Length & 0xFFFFF000;
      }
    }
  }
  if( !v9 || !*(_BYTE *)(v9 + 434) || !(_DWORD)Length || v15 )
    return v15;
  v18 = (unsigned __int64 *)(v16 + 56);
  for( i = v14; i < (unsigned int)Length; ++v18 )
  {
    if( *v18 <= v11 )
      break;
    i += 4096;
  }
  NextMapping = TranslationBase->NextMapping;
  if( i > (unsigned int)Length )
    i = Length;
  Next = NextMapping->Next;
  v22 = NextMapping->PhysicalAddress >> 12;
  while( v14 < i )
  {
    v26 = Next->PhysicalAddress >> 12;
    if( v26 != v22 + 1
      || ((v22 ^ v26) & 0xFFFFFFFFFFF00000ui64) != 0
      || v12 != 1 && ((v22 ^ v26) & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
    {
      break;
    }
    Next = Next->Next;
    v22 = v26;
    v14 += 4096;
  }
  if( v13 && v14 < 0x1000 && i < v14 << 12 && ((i - v14) & (AdapterCacheAlignment - 1)) != 0 )
    v14 = i;
  if( v14 <= i )
    return v14;
  return i;
}

Referenced by:

HalpDmaNextContiguousPiece