HalpMapTransferV2

_LARGE_INTEGER __stdcall HalpMapTransferV2(
        _ADAPTER_OBJECT *ChildAdapter,
        _MDL *Mdl,
        VOID *MapRegisterBase,
        VOID *CurrentVa,
        UINT8 DeferFlushing,
        UINT64 WriteToDevice,
        UINT8 a7){
  UINT64 *Length; 
  _LARGE_INTEGER result; 
  bool v12; 
  char v13; 
  __int64 v14; 
  unsigned int v15; 
  __int64 v16; 
  INT64 v17; 
  _LARGE_INTEGER LogicalAddressOut; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  _QWORD *DeferFlushinga; 

  Length = (UINT64 *)DeferFlushing;
  result.QuadPart = 0i64;
  LogicalAddressOut.QuadPart = 0i64;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( *(_DWORD *)DeferFlushing )
  {
    v12 = !ChildAdapter || ChildAdapter->MasterDevice;
    DeferFlushinga = (_QWORD *)*((_QWORD *)MapRegisterBase + 7);
    if( ChildAdapter && ChildAdapter->ScatterGather )
    {
      v13 = WriteToDevice;
      LOBYTE(v17) = WriteToDevice;
      HalpDmaMapScatterTransferV2(
        ChildAdapter,
        Mdl,
        (_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase,
        CurrentVa,
        Length,
        v17,
        &LogicalAddressOut);
    }
    else
    {
      v13 = WriteToDevice;
      LOBYTE(v17) = WriteToDevice;
      HalpDmaMapContiguousTransferV2(
        ChildAdapter,
        Mdl,
        (_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase,
        CurrentVa,
        Length,
        v17,
        &LogicalAddressOut);
    }
    v15 = *(_DWORD *)Length;
    if( !v12 )
    {
      if( !v13 )
      {
        if( ChildAdapter->IgnoreCount )
          HalpDmaZeroMapBuffers(v14, DeferFlushinga, (unsigned __int16)CurrentVa & 0xFFF, v15);
      }
      KeAcquireInStackQueuedSpinLock(&ChildAdapter->MasterAdapter->AdapterObject.SpinLock, &LockHandle);
      LOBYTE(v16) = v13;
      (*(void(__fastcall **)(void *, _MDL *, __int64, VOID *, _LARGE_INTEGER, unsigned int))(DmaDispatch + 40))(
        ChildAdapter->ChannelAdapter,
        Mdl,
        v16,
        CurrentVa,
        LogicalAddressOut,
        v15);
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
    }
    return LogicalAddressOut;
  }
  return result;
}

Referenced by:

IoMapTransferInternal