IoFlushAdapterBuffersV3

NTSTATUS __stdcall IoFlushAdapterBuffersV3(
        _ADAPTER_OBJECT *ChildAdapter,
        _MDL *Mdl,
        VOID *MapRegisterBase,
        VOID *CurrentVa,
        UINT64 Length,
        INT64 WriteToDevice){
  bool v10; 
  _DMA_OPERATIONS *v11; 
  NTSTATUS result; 
  UINT64 v13; 
  INT64 v14; 
  INT64 DeferFlushing; 

  if( (_DWORD)Length )
  {
    if( ChildAdapter->TranslationType == ExtTranslationTypeTranslate )
    {
      v10 = *((_BYTE *)MapRegisterBase + 64) == 0;
      v11 = (_DMA_OPERATIONS *)*((_QWORD *)MapRegisterBase + 3);
      *((_QWORD *)MapRegisterBase + 5) = v11;
      if( v10 )
      {
        result = HalpDmaFreeLa(&ChildAdapter->AdapterObject.DmaHeader, v11);
        *((_QWORD *)MapRegisterBase + 4) = 0i64;
      }
    }
    if( !ChildAdapter->MasterDevice )
      HalpDmaControllerFlushChannel(ChildAdapter->DmaController, ChildAdapter->ChannelNumber);
    if( ChildAdapter->NeedsMapRegisters )
    {
      if( MapRegisterBase )
        *((_QWORD *)MapRegisterBase + 7) = MapRegisterBase;
      LOBYTE(DeferFlushing) = 0;
      LOBYTE(v14) = WriteToDevice;
      LODWORD(v13) = Length;
      if( ChildAdapter->ScatterGather )
        HalpDmaFlushScatterTransferV3(
          ChildAdapter,
          Mdl,
          (_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase,
          CurrentVa,
          v13,
          v14,
          DeferFlushing,
          0i64);
      else
        HalpDmaFlushContiguousTransferV3(
          ChildAdapter,
          Mdl,
          (_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase,
          CurrentVa,
          v13,
          v14,
          DeferFlushing,
          0i64);
    }
  }
  LOBYTE(result) = 1;
  return result;
}

Referenced by:

IoFlushAdapterBuffers