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