HalFlushAdapterBuffersEx

NTSTATUS __stdcall HalFlushAdapterBuffersEx(
        _ADAPTER_OBJECT *ChildAdapter,
        _MDL *Mdl,
        VOID *MapRegisterBase,
        UINT64 Offset,
        UINT64 Length,
        INT64 WriteToDevice){
  bool v7; 
  _HALP_DMA_TRANSLATION_ENTRY *v8; 
  _MDL *ScatterGatherMdl; 
  unsigned int v12; 
  UINT64 ByteCount; 
  _DMA_OPERATIONS *v15; 
  _MDL *Next; 
  unsigned int MappedLength; 
  unsigned int ByteOffset; 
  NTSTATUS AdapterCacheAlignment; 
  __int64 v20; 
  unsigned __int64 v21; 
  CHAR v22; 
  char v23; 
  _MDL *v24; 
  _MDL *v25; 
  unsigned int v26; 
  unsigned int v27; 
  char *v28; 
  UINT64 v29; 
  INT64 v30; 
  INT64 DeferFlushing; 
  PVOID BugCheckParameter4; 
  CHAR v33; 
  _HALP_DMA_TRANSLATION_ENTRY *NextMappingOut; 

  v7 = ChildAdapter->TranslationType == ExtTranslationTypeTranslate;
  v8 = (_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase;
  v33 = 0;
  BugCheckParameter4 = 0i64;
  NextMappingOut = 0i64;
  if( v7 )
  {
    v15 = (_DMA_OPERATIONS *)*((_QWORD *)MapRegisterBase + 3);
    *((_QWORD *)MapRegisterBase + 5) = v15;
    HalpDmaFreeLa(&ChildAdapter->AdapterObject.DmaHeader, v15);
  }
  ScatterGatherMdl = ChildAdapter->ScatterGatherMdl;
  if( ScatterGatherMdl )
  {
    do
    {
      Next = ScatterGatherMdl->Next;
      if( (ScatterGatherMdl->MdlFlags & 1) != 0 )
        MmUnmapLockedPages(ScatterGatherMdl->MappedSystemVa, ScatterGatherMdl);
      IoFreeMdl(ScatterGatherMdl);
      ScatterGatherMdl = Next;
    }
    while( Next );
  }
  v12 = Length;
  ChildAdapter->ScatterGatherMdl = 0i64;
  if( !v12 )
  {
    if( !ChildAdapter->MasterDevice )
      HalpDmaControllerFlushChannel(ChildAdapter->DmaController, ChildAdapter->ChannelNumber);
    return 0;
  }
  if( !Mdl )
    return -1073741811;
  do
  {
    ByteCount = Mdl->ByteCount;
    if( Offset < ByteCount )
      break;
    Mdl = Mdl->Next;
    Offset -= ByteCount;
  }
  while( Mdl );
  if( !Mdl )
    return -1073741811;
  if( !ChildAdapter->MasterDevice )
    HalpDmaControllerFlushChannel(ChildAdapter->DmaController, ChildAdapter->ChannelNumber);
  if( !ChildAdapter->NeedsMapRegisters )
    return 0;
  if( v8 )
  {
    MappedLength = v8->MappedLength;
    if( Mdl->Next
      || (ByteOffset = Mdl->ByteOffset,
          AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(ChildAdapter),
          ((AdapterCacheAlignment - 1) & (unsigned int)v20) != 0)
      && v21 >= (v20 & 0xFFFFFFFFFFFFF000ui64) )
    {
      v12 = MappedLength;
    }
    else
    {
      v12 = (-AdapterCacheAlignment & (v21 + AdapterCacheAlignment - 1)) - ByteOffset - Offset;
      if( v12 > MappedLength )
        v12 = MappedLength;
    }
  }
  HalpDmaCheckMdlAccessibility(
    (INT64)ChildAdapter,
    (INT64 *)Mdl,
    (unsigned int)Offset,
    v12,
    &v33,
    (_MDL **)&BugCheckParameter4);
  v22 = v33;
  v23 = WriteToDevice;
  if( v33 )
  {
    v24 = (_MDL *)BugCheckParameter4;
    if( !(_BYTE)WriteToDevice )
      HalpDmaFlushDriverMdl(BugCheckParameter4);
    if( v24 )
    {
      do
      {
        v25 = v24->Next;
        IoFreeMdl(v24);
        v24 = v25;
      }
      while( v25 );
    }
    if( !v8 )
      return 0;
    v22 = v33;
LABEL_35:
    v8->NextMapping = v8;
    while( v12 )
    {
      v26 = v12;
      if( !Mdl )
        break;
      v27 = v12;
      if( Mdl->ByteCount - (int)Offset <= v12 )
        v27 = Mdl->ByteCount - Offset;
      v28 = (char *)Mdl->StartVa + Mdl->ByteOffset + Offset;
      v12 -= v27;
      if( v12 && !Mdl->Next )
      {
        v27 = v26;
        v12 = 0;
      }
      LOBYTE(DeferFlushing) = v22;
      LOBYTE(v30) = v23;
      LODWORD(v29) = v27;
      if( ChildAdapter->ScatterGather )
        HalpDmaFlushScatterTransferV3(ChildAdapter, Mdl, v8, v28, v29, v30, DeferFlushing, &NextMappingOut);
      else
        HalpDmaFlushContiguousTransferV3(ChildAdapter, Mdl, v8, v28, v29, v30, DeferFlushing, &NextMappingOut);
      v8 = NextMappingOut;
      Offset = 0i64;
      Mdl = Mdl->Next;
      v22 = v33;
    }
    return 0;
  }
  if( v8 )
    goto LABEL_35;
  return -1073741823;
}

Referenced by:

HalPutScatterGatherListV3