VfFlushAdapterBuffers

UINT8 __fastcall VfFlushAdapterBuffers(
        _DMA_ADAPTER *DmaAdapter,
        _MDL *Mdl,
        VOID *MapRegisterBase,
        VOID *CurrentVa,
        UINT64 Length,
        UINT8 WriteToDevice){
  __int64(__fastcall *v10)(_DMA_ADAPTER *, _MDL *, VOID *, VOID *, _DWORD, UINT8); 
  INT64 v11; 
  __int64(__fastcall *v12)(_DMA_ADAPTER *, _MDL *, VOID *, VOID *, _DWORD, UINT8); 
  UINT8 v13; 
  LIST_ENTRY *AdapterInformationInternal; 
  UINT8 result; 
  _QWORD *MapRegisterFile; 
  UINT8 v17; 
  UINT64 v20; 
  VOID *CurrentVaa; 
  VOID *MapRegisterBasea; 
  _MDL *Mdla; 
  __int64(__fastcall *v24)(_DMA_ADAPTER *, _MDL *, VOID *, VOID *, _DWORD, UINT8); 
  LODWORD(v10) = ViGetRealDmaOperation(DmaAdapter, 0x28ui64);
  LOBYTE(v11) = 1;
  v24 = v10;
  v12 = v10;
  AdapterInformationInternal = ViGetAdapterInformationInternal(DmaAdapter, v11);
  if( !AdapterInformationInternal )
    goto LABEL_4;
  VF_ASSERT_MAX_IRQL(v13);
  if( MapRegisterBase == (VOID *)-559026163i64 )
  {
    MapRegisterBase = 0i64;
    goto LABEL_4;
  }
  MapRegisterFile = (_QWORD *)ViGetMapRegisterFile((INT64)MapRegisterBase);
  if( !MapRegisterFile )
  {
LABEL_4:
    result = v12(DmaAdapter, Mdl, MapRegisterBase, CurrentVa, Length, WriteToDevice);
    if( AdapterInformationInternal )
    {
      if( result )
        _InterlockedExchange((volatile __int32 *)&AdapterInformationInternal[11].Blink + 1, 0);
    }
    return result;
  }
  Mdla = Mdl;
  CurrentVaa = CurrentVa;
  MapRegisterBasea = MapRegisterBase;
  if( (unsigned int)ViSwap(&MapRegisterBasea, &Mdla, &CurrentVaa) )
  {
    v17 = v24(DmaAdapter, Mdla, MapRegisterBasea, CurrentVaa, Length, WriteToDevice);
    ViFlushDoubleBuffer(MapRegisterFile, (ULONG_PTR)Mdl, (ULONG_PTR)CurrentVa, Length, WriteToDevice);
    if( v17 )
      _InterlockedExchange((volatile __int32 *)&AdapterInformationInternal[11].Blink + 1, 0);
    return v17;
  }
  else
  {
    if( (_DWORD)Length )
    {
      ViHalPreprocessOptions(
        &dword_140C12D24,
        (PSTR)"Cannot flush map register that isn't mapped! (Map register base %p, flushing address %p, MDL %p)",
        0x20ui64,
        (UINT64)MapRegisterBase,
        (UINT64)CurrentVa,
        (UINT64)Mdl,
        v20);
      VfReportIssueWithOptions(
        0xE6ui64,
        0x20ui64,
        (UINT64)MapRegisterBase,
        (UINT64)CurrentVa,
        (UINT64)Mdl,
        &dword_140C12D24);
    }
    return 0;
  }
}

Referenced by:

No references.