HalFlushAdapterBuffersEx
__int64 __fastcall HalFlushAdapterBuffersEx(
__int64 a1,
__int64 a2,
_QWORD *a3,
unsigned __int64 a4,
UINT64 a5,
char a6){
bool v7;
_QWORD *v8;
struct _MDL *v11;
unsigned int v12;
unsigned __int64 v13;
DMA_OPERATIONS *v15;
struct _MDL *Next;
unsigned int v17;
int v18;
int AdapterCacheAlignment;
__int64 v20;
unsigned __int64 v21;
char v22;
char v23;
PMDL v24;
struct _MDL *v25;
unsigned int v26;
unsigned int v27;
__int64 v28;
PMDL Mdl;
CHAR v30;
_QWORD *v31;
v7 = *(_DWORD *)(a1 + 512) == 2;
v8 = a3;
v30 = 0;
Mdl = 0i64;
v31 = 0i64;
if( v7 )
{
v15 = (DMA_OPERATIONS *)a3[3];
a3[5] = v15;
HalpDmaFreeLa((PDMA_ADAPTER)a1, v15);
}
v11 = *(struct _MDL **)(a1 + 544);
if( v11 )
{
do
{
Next = v11->Next;
if( (v11->MdlFlags & 1) != 0 )
MmUnmapLockedPages(v11->MappedSystemVa, v11);
IoFreeMdl(v11);
v11 = Next;
}
while( Next );
}
v12 = a5;
*(_QWORD *)(a1 + 544) = 0i64;
if( !v12 )
{
if( !*(_BYTE *)(a1 + 433) )
HalpDmaControllerFlushChannel(*(_QWORD *)(a1 + 360), *(_DWORD *)(a1 + 372));
return 0i64;
}
if( !a2 )
return 3221225485i64;
do
{
v13 = *(unsigned int *)(a2 + 40);
if( a4 < v13 )
break;
a2 = *(_QWORD *)a2;
a4 -= v13;
}
while( a2 );
if( !a2 )
return 3221225485i64;
if( !*(_BYTE *)(a1 + 433) )
HalpDmaControllerFlushChannel(*(_QWORD *)(a1 + 360), *(_DWORD *)(a1 + 372));
if( !*(_BYTE *)(a1 + 432) )
return 0i64;
if( v8 )
{
v17 = *((_DWORD *)v8 + 4);
if( *(_QWORD *)a2
|| (v18 = *(_DWORD *)(a2 + 44),
AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(a1),
((AdapterCacheAlignment - 1) & (unsigned int)v20) != 0)
&& v21 >= (v20 & 0xFFFFFFFFFFFFF000ui64) )
{
v12 = v17;
}
else
{
v12 = (-AdapterCacheAlignment & (v21 + AdapterCacheAlignment - 1)) - v18 - a4;
if( v12 > v17 )
v12 = v17;
}
}
HalpDmaCheckMdlAccessibility(a1, (INT64 *)a2, (unsigned int)a4, v12, &v30, &Mdl);
v22 = v30;
v23 = a6;
if( v30 )
{
v24 = Mdl;
if( !a6 )
HalpDmaFlushDriverMdl(Mdl);
if( v24 )
{
do
{
v25 = v24->Next;
IoFreeMdl(v24);
v24 = v25;
}
while( v25 );
}
if( !v8 )
return 0i64;
v22 = v30;
LABEL_35:
v8[7] = v8;
while( v12 )
{
v26 = v12;
if( !a2 )
break;
v27 = v12;
if( *(_DWORD *)(a2 + 40) - (int)a4 <= v12 )
v27 = *(_DWORD *)(a2 + 40) - a4;
v28 = a4 + *(_QWORD *)(a2 + 32) + *(unsigned int *)(a2 + 44);
v12 -= v27;
if( v12 && !*(_QWORD *)a2 )
{
v27 = v26;
v12 = 0;
}
if( *(_BYTE *)(a1 + 434) )
HalpDmaFlushScatterTransferV3(a1, a2, (__int64)v8, v28, v27, v23, v22, &v31);
else
HalpDmaFlushContiguousTransferV3(a1, a2, (__int64)v8, v28, v27, v23, v22, &v31);
v8 = v31;
a4 = 0i64;
a2 = *(_QWORD *)a2;
v22 = v30;
}
return 0i64;
}
if( v8 )
goto LABEL_35;
return 3221225473i64;
}Referenced by:
HalPutScatterGatherListV3