HalpFlushMapBuffers
void __fastcall HalpFlushMapBuffers(__int64 a1, __int64 a2, __int64 a3, unsigned int a4, char a5, char a6){
int AdapterCacheAlignment;
__int64 v9;
__int16 v10;
unsigned int v11;
unsigned __int64 v12;
UINT64 v13;
unsigned int v14;
__int64 v15;
char v16;
unsigned __int8 CurrentIrql;
unsigned __int8 v18;
unsigned int v19;
unsigned __int64 v20;
unsigned __int64 v21;
unsigned int v22;
unsigned __int8 v23;
__int64 v24;
unsigned int v25;
unsigned __int64 v26;
unsigned int v27;
unsigned int v28;
unsigned __int8 v29;
__int64 v30;
unsigned int v31;
int v33;
AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(a1);
v11 = v10 & 0xFFF;
v33 = AdapterCacheAlignment;
v12 = 0i64;
v13 = a4;
v14 = v11;
v15 = v9;
v16 = 1;
CurrentIrql = KeGetCurrentIrql();
v18 = CurrentIrql;
if( a4 )
{
while( 1 )
{
v19 = v13;
if( (unsigned int)v13 >= 4096 - v14 )
v19 = 4096 - v14;
v20 = *(_QWORD *)(v15 + 48) & 0xFFFFFFFFFFFFF000ui64;
if( v12 )
{
if( v20 != v12 + 4096 )
break;
}
v15 = *(_QWORD *)(v15 + 8);
v12 = v20;
v14 = 0;
v13 = (unsigned int)v13 - v19;
if( !(_DWORD)v13 )
goto LABEL_9;
}
v16 = 0;
LABEL_9:
v9 = a3;
}
if( v16 )
{
v21 = (*(_QWORD *)(v9 + 48) & 0xFFFFFFFFFFFFF000ui64) + v11;
if( !a5 && !*(_BYTE *)(a1 + 437) )
{
v13 = (unsigned int)~(AdapterCacheAlignment - 1);
v22 = v21 - (v13 & v21);
v21 -= v22;
a4 = v13 & (AdapterCacheAlignment + v22 + a4 - 1);
}
if( CurrentIrql <= 2u )
{
KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 304), v13);
v18 = v23;
}
v24 = *(_QWORD *)(a1 + 296);
*(_QWORD *)v24 = 0i64;
*(_WORD *)(v24 + 10) = 0;
*(_QWORD *)(v24 + 32) = v21 & 0xFFFFFFFFFFFFF000ui64;
*(_WORD *)(v24 + 8) = 8 * ((((v21 & 0xFFF) + 4095 + a4) >> 12) + 6);
*(_DWORD *)(v24 + 44) = v21 & 0xFFF;
*(_DWORD *)(v24 + 40) = a4;
MmBuildMdlForNonPagedPool(*(_MDL **)(a1 + 296));
if( !a6 )
KeFlushIoBuffers(*(_MDL **)(a1 + 296), a5 == 0, 1u);
if( CurrentIrql <= 2u )
{
KxReleaseSpinLock((UINT64 *)(a1 + 304));
__writecr8(v18);
}
}
else
{
for( ; a4; a4 -= v31 )
{
v25 = a4;
if( a4 >= 4096 - v11 )
v25 = 4096 - v11;
v31 = v25;
v26 = (*(_QWORD *)(v9 + 48) & 0xFFFFFFFFFFFFF000ui64) + v11;
v27 = v25;
if( !a5 && !*(_BYTE *)(a1 + 437) )
{
v13 = (unsigned int)~(v33 - 1);
v28 = v26 - (v13 & v26);
v26 -= v28;
v27 = v13 & (v25 + v33 + v28 - 1);
}
if( CurrentIrql <= 2u )
{
KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 304), v13);
v18 = v29;
}
v30 = *(_QWORD *)(a1 + 296);
*(_QWORD *)v30 = 0i64;
*(_WORD *)(v30 + 10) = 0;
*(_QWORD *)(v30 + 32) = v26 & 0xFFFFFFFFFFFFF000ui64;
*(_WORD *)(v30 + 8) = 8 * ((((v26 & 0xFFF) + 4095 + v27) >> 12) + 6);
*(_DWORD *)(v30 + 44) = v26 & 0xFFF;
*(_DWORD *)(v30 + 40) = v27;
MmBuildMdlForNonPagedPool(*(_MDL **)(a1 + 296));
if( !a6 )
KeFlushIoBuffers(*(_MDL **)(a1 + 296), a5 == 0, 1u);
if( CurrentIrql <= 2u )
{
KxReleaseSpinLock((UINT64 *)(a1 + 304));
__writecr8(v18);
}
v11 = 0;
v9 = *(_QWORD *)(a3 + 8);
a3 = v9;
}
}
}Referenced by:
HalpDmaSyncMapBuffers