HalpDmaFlushScatterTransferV2

VOID __stdcall HalpDmaFlushScatterTransferV2(
        _ADAPTER_OBJECT *ChildAdapter,
        _MDL *Mdl,
        _HALP_DMA_TRANSLATION_ENTRY *TranslationBase,
        VOID *CurrentVa,
        UINT64 Length,
        INT64 WriteToDevice){
  int v10; 
  __int64 ContiguousPiece; 
  __int64 v12; 
  __int64 v13; 
  char v14; 
  __int64 v15; 
  __int64 v16; 
  _HALP_DMA_TRANSLATION_ENTRY *NextMapping; 
  unsigned __int64 v18; 
  __int64 v19; 
  INT64 WriteToDevicea; 
  UINT64 Lengtha; 

  if( TranslationBase )
  {
    TranslationBase->NextMapping = TranslationBase;
    if( !(_BYTE)WriteToDevice )
    {
      v10 = Length;
      if( (_DWORD)Length )
      {
        while( 1 )
        {
          LODWORD(Lengtha) = v10;
          LOBYTE(WriteToDevicea) = 0;
          ContiguousPiece = (unsigned int)HalpDmaNextContiguousPiece(
                                            ChildAdapter,
                                            Mdl,
                                            TranslationBase,
                                            CurrentVa,
                                            WriteToDevicea,
                                            Lengtha);
          v12 = (unsigned __int16)CurrentVa & 0xFFF;
          if( ChildAdapter->AdapterObject.MaximumPhysicalAddress.QuadPart < (unsigned __int64)(v12
                                                                                              + (*((_QWORD *)&Mdl[1].Next
                                                                                                 + (unsigned int)(((unsigned __int64)CurrentVa - (unsigned __int64)Mdl->StartVa) >> 12)) << 12)
                                                                                              + ContiguousPiece
                                                                                              - 1) )
            break;
          if( !ChildAdapter->CacheCoherent )
          {
            v13 = (unsigned int)(HalpDmaGetAdapterCacheAlignment(ChildAdapter) - 1);
            if( (v13 & v16) != 0 || (v15 & v13) != 0 )
              break;
            if( !v14 )
            {
              LOBYTE(Lengtha) = 0;
              LOBYTE(WriteToDevicea) = 0;
              HalpDmaFlushBuffer(v13, Mdl, CurrentVa, (unsigned int)ContiguousPiece, WriteToDevicea, Lengtha);
            }
          }
LABEL_14:
          CurrentVa = (char *)CurrentVa + ContiguousPiece;
          v10 -= ContiguousPiece;
          if( !v10 )
            goto LABEL_15;
        }
        LOBYTE(Lengtha) = 0;
        LODWORD(WriteToDevicea) = ContiguousPiece;
        HalpDmaSyncMapBuffers(ChildAdapter, Mdl, CurrentVa, TranslationBase->NextMapping, WriteToDevicea, Lengtha, 0, 0);
        NextMapping = TranslationBase->NextMapping;
        v18 = (unsigned __int64)(v12 + ContiguousPiece + 4095) >> 12;
        if( (_DWORD)v18 )
        {
          v19 = (unsigned int)v18;
          do
          {
            NextMapping = NextMapping->Next;
            --v19;
          }
          while( v19 );
        }
        TranslationBase->NextMapping = NextMapping;
        goto LABEL_14;
      }
LABEL_15:
      TranslationBase->NextMapping = TranslationBase;
    }
  }
}

Referenced by:

IoFlushAdapterBuffersV2