HalpDmaMapScatterTransferV3
void __fastcall HalpDmaMapScatterTransferV3(
__int64 a1,
__int64 a2,
__int64 a3,
__int64 a4,
unsigned int *a5,
char a6,
char a7,
__int64 *a8){
unsigned int ContiguousPiece;
unsigned int v13;
__int64 v14;
__int64 v15;
__int64 v16;
__int64 v17;
_QWORD *v18;
__int64 v19;
unsigned __int64 v20;
__int64 v21;
bool v22;
ContiguousPiece = HalpDmaNextContiguousPiece(a1, a2, a3, a4, a6, *a5);
v13 = ContiguousPiece;
*a5 = ContiguousPiece;
if( ContiguousPiece )
{
v14 = a4 & 0xFFF;
v15 = (unsigned int)((unsigned __int64)(a4 - *(_QWORD *)(a2 + 32)) >> 12);
v16 = v14 + (*(_QWORD *)(a2 + 8 * v15 + 48) << 12);
if( a3
&& ((v17 = ContiguousPiece, *(_QWORD *)(a1 + 136) < v16 + (unsigned __int64)ContiguousPiece - 1)
&& *(_DWORD *)(a1 + 512) != 2
|| !*(_BYTE *)(a1 + 437)
&& !a6
&& ((v15 = (unsigned int)HalpDmaGetAdapterCacheAlignment(a1) - 1, (v15 & v16) != 0)
|| ((unsigned int)v15 & v13) != 0)
|| *(_BYTE *)(a3 + 64)) )
{
v18 = *(_QWORD **)(a3 + 56);
*a8 = v14 + *v18;
if( a6 )
{
HalpDmaSyncMapBuffers(a1, a2, a4, v18, v13, a6, 0, a7);
}
else if( !*(_BYTE *)(a1 + 437) )
{
HalpDmaSyncMapBuffers(a1, a2, a4, v18, v13, 0, 1, a7);
}
v19 = *(_QWORD *)(a3 + 56);
v20 = (unsigned __int64)(v17 + v14 + 4095) >> 12;
if( (_DWORD)v20 )
{
v21 = (unsigned int)v20;
do
{
v19 = *(_QWORD *)(v19 + 8);
--v21;
}
while( v21 );
}
*(_QWORD *)(a3 + 56) = v19;
}
else
{
v22 = *(_BYTE *)(a1 + 437) == 0;
*a8 = v16;
if( v22 )
HalpDmaFlushBuffer(v15, a2, a4, v13, a6, a7);
}
}
}Referenced by:
HalpMapTransferV3