IoMapTransferInternal

_LARGE_INTEGER __stdcall IoMapTransferInternal(
        _ADAPTER_OBJECT *ChildAdapter,
        _MDL *Mdl,
        VOID *MapRegisterBase,
        VOID *CurrentVa,
        UINT8 DeferFlushing,
        UINT64 WriteToDevice,
        UINT8 a7){
  unsigned int v10; 
  __int64 *v11; 
  unsigned int v12; 
  __int64 v13; 
  UINT64 v14; 
  _LARGE_INTEGER v15; 
  VOID *v17; 
  VOID *v18; 
  _ADAPTER_OBJECT *v19; 
  INT64 v20; 
  INT64 a6; 
  UINT8 v22; 

  if( MapRegisterBase )
  {
    LOBYTE(a6) = WriteToDevice;
    if( HalpDmaGetAdapterVersion(ChildAdapter) == 2 )
      return HalpMapTransferV2(v19, Mdl, v17, v18, DeferFlushing, a6, v22);
    else
      return HalpMapTransferV3(v19, Mdl, v17, v18, DeferFlushing, a6, a7);
  }
  else
  {
    v10 = 4096 - ((unsigned __int16)CurrentVa & 0xFFF);
    v11 = (__int64 *)(&Mdl[1].Next + (((unsigned __int64)CurrentVa - (unsigned __int64)Mdl->StartVa) >> 12));
    v12 = *(_DWORD *)DeferFlushing;
    v13 = *v11;
    v14 = *(unsigned int *)DeferFlushing;
    v15.QuadPart = ((unsigned __int16)CurrentVa & 0xFFF) + (*v11 << 12);
    if( v10 < *(_DWORD *)DeferFlushing )
    {
      do
      {
        if( v13 + 1 != *++v11 )
          break;
        v13 ^= *v11;
        if( (v13 & 0xFFFFFFFFFFF00000ui64) != 0 )
          break;
        v10 += 4096;
        v13 = *v11;
      }
      while( v10 < v12 );
      if( v10 < v12 )
      {
        *(_DWORD *)DeferFlushing = v10;
        v14 = v10;
      }
    }
    if( !ChildAdapter->CacheCoherent )
    {
      LOBYTE(a6) = a7;
      LOBYTE(v20) = WriteToDevice;
      HalpDmaFlushBuffer(v13, Mdl, CurrentVa, v14, v20, a6);
    }
    return v15;
  }
}

Referenced by:

HalMapTransferEx
IoMapTransfer