ViFlushDoubleBuffer
__int64 __fastcall ViFlushDoubleBuffer(_QWORD *a1, ULONG_PTR a2, ULONG_PTR a3, unsigned int a4, char a5){
UINT64 v6;
VOID *MdlBufferSa;
UINT64 v10;
__int64 v12;
UINT64 v13;
void *v14;
__int64 v15;
unsigned int v16;
__int64 v17;
UINT64 Param4[2];
v6 = a4;
LODWORD(Param4[0]) = 0;
MdlBufferSa = ViGetMdlBufferSa((_MDL *)a2, (VOID *)a3);
v10 = (UINT64)MdlBufferSa;
if( !MdlBufferSa )
return 0i64;
if( !ViFindMappedRegisterInFile((__int64)a1, (__int64)MdlBufferSa, Param4) )
{
ViHalPreprocessOptions(
&dword_140C12CFC,
(PSTR)"Cannot flush buffers that aren't mapped(Addr %p).",
0x16ui64,
v10,
(UINT64)a1,
0i64,
Param4[0]);
VfReportIssueWithOptions(0xE6ui64, 0x16ui64, v10, (UINT64)a1, 0i64, &dword_140C12CFC);
return 0i64;
}
v12 = a1[7];
v13 = (unsigned int)(LODWORD(Param4[0]) << 12) + (v10 & 0xFFF);
v14 = (void *)(v13 + a1[8]);
Param4[0] = v13;
if( (*(_BYTE *)(v12 + 10) & 5) != 0 )
{
v15 = *(_QWORD *)(v12 + 24);
}
else
{
LODWORD(v15) = (unsigned int)MmMapLockedPages((MDL *)v12, 0);
v12 = a1[7];
}
v16 = v15 + *(_DWORD *)(v12 + 40) - (_DWORD)v14;
if( (unsigned int)v6 > v16 )
{
ViHalPreprocessOptions(
&byte_140C12CF8,
(PSTR)"FLUSH: Can only flush %x bytes to end of map register file(%x attempted)",
0x10000000ui64,
1ui64,
v16,
v6,
Param4[0]);
VfReportIssueWithOptions(0xE6ui64, 0i64, 1ui64, v16, v6, &byte_140C12CF8);
v13 = Param4[0];
LODWORD(v6) = v16;
}
if( !a5 )
{
v17 = a1[9];
if( v17 )
ViCopyBackModifiedBuffer((MDL *)a2, (PVOID)a3, v14, (PVOID)(v13 + v17), (unsigned int)v6);
}
if( !(unsigned int)ViFreeMapRegistersToFile((INT64)a1, v10, (unsigned int)v6) )
VfUtilDbgPrint((INT8 *)"Flushing too many map registers\n");
return 1i64;
}Referenced by:
VfFlushAdapterBuffers
VfPutScatterGatherList