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