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