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