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