HalpDmaNextContiguousPieceV3
__int64 __fastcall HalpDmaNextContiguousPieceV3(
__int64 a1,
__int64 a2,
__int64 a3,
__int64 a4,
char a5,
unsigned int a6){
char v6;
__int64 v7;
unsigned __int64 v8;
int v9;
unsigned __int64 v10;
bool v12;
unsigned int v13;
unsigned int v14;
__int64 v15;
unsigned int v16;
unsigned __int64 *v17;
__int64 *v18;
unsigned int v19;
__int64 *v20;
unsigned __int64 v21;
__int64 v22;
unsigned int v23;
int v24;
int AdapterCacheAlignment;
unsigned __int64 *v26;
unsigned int i;
_QWORD *v28;
__int64 v29;
__int64 v30;
unsigned __int64 *v32;
char v33;
unsigned int v34;
unsigned __int64 v36;
v6 = *(_BYTE *)(a1 + 145);
v7 = a3;
v9 = a4;
v36 = *(_QWORD *)(a1 + 136);
v8 = v36;
v10 = v36 >> 12;
v33 = v6;
v12 = !a5 && !*(_BYTE *)(a1 + 437);
v13 = a6;
v14 = 4096 - (a4 & 0xFFF);
v15 = (unsigned int)((unsigned __int64)(a4 - *(_QWORD *)(a2 + 32)) >> 12) + 6i64;
v34 = v14;
v16 = v14;
v17 = (unsigned __int64 *)(a2 + 8 * v15);
v18 = (__int64 *)v17;
v32 = v17;
if( *v17 > v10 )
goto LABEL_33;
if( v12 )
{
if( (((unsigned int)HalpDmaGetAdapterCacheAlignment(a1) - 1) & v9) == 0 )
{
v8 = v36;
goto LABEL_9;
}
LABEL_33:
v16 = 0;
goto LABEL_34;
}
LABEL_9:
if( v14 < v13 )
{
v19 = 4096;
while( 1 )
{
v20 = v18 + 1;
v21 = v18[1];
if( v21 > v10 )
break;
v22 = *v18;
if( *v18 + 1 != v21 )
break;
v23 = v13 - v16;
if( v13 - v16 > v19 )
v23 = v19;
if( v8 < v23 + (v21 << 12) - 1 && *(_DWORD *)(a1 + 512) != 2 )
{
LABEL_27:
v6 = v33;
break;
}
if( !*(_BYTE *)(a1 + 437) && !a5 )
{
v24 = HalpDmaGetAdapterCacheAlignment(a1) - 1;
if( (v24 & ((_DWORD)v21 << 12)) != 0 || (v24 & v23) != 0 )
goto LABEL_27;
v8 = v36;
}
v6 = v33;
if( ((v22 ^ v21) & 0xFFFFFFFFFFF00000ui64) == 0 && (v33 == 1 || ((v22 ^ v21) & 0xFFFFFFFFFFFFFFF0ui64) == 0) )
{
v16 += v19;
v18 = v20;
if( v16 < v13 )
continue;
}
break;
}
v14 = v34;
v17 = v32;
v7 = a3;
}
if( v16 > v13 )
{
v16 = v13;
if( v12 )
{
AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(a1);
if( ((AdapterCacheAlignment - 1) & v13) != 0 )
v16 &= 0xFFFFF000;
}
}
LABEL_34:
if( !*(_BYTE *)(a1 + 434) || !v13 || v16 )
return v16;
v26 = v17 + 1;
for( i = v14; i < v13; ++v26 )
{
if( *v26 <= v10 )
break;
i += 4096;
}
v28 = *(_QWORD **)(v7 + 56);
if( i > v13 )
i = v13;
if( v28 )
{
v29 = *v28 >> 12;
while( 1 )
{
v28 = (_QWORD *)v28[1];
if( v14 >= i )
break;
if( !v28 )
break;
v30 = *v28 >> 12;
if( v30 != v29 + 1
|| ((v29 ^ v30) & 0xFFFFFFFFFFF00000ui64) != 0
|| v6 != 1 && ((v29 ^ v30) & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
{
break;
}
v29 = *v28 >> 12;
v14 += 4096;
}
}
else
{
v14 = 0;
}
if( v14 <= i )
return v14;
return i;
}Referenced by:
HalpDmaNextContiguousPiece