HalpDmaSyncMapBuffers

VOID __stdcall HalpDmaSyncMapBuffers(
        _ADAPTER_OBJECT *ChildAdapter,
        _MDL *Mdl,
        VOID *CurrentVa,
        _HALP_DMA_TRANSLATION_ENTRY *TranslationBase,
        UINT64 Length,
        INT64 CopyDown,
        UINT8 CacheSyncOnly,
        UINT8 DeferFlushing){
  unsigned __int8 CurrentIrql; 
  char *MappedSystemVa; 
  __int64 v14; 
  unsigned __int64 v15; 
  unsigned int v16; 
  _HALP_DMA_TRANSLATION_ENTRY *i; 
  char *v18; 
  INT64 v19; 
  char *v20; 
  unsigned int v21; 
  _HALP_DMA_TRANSLATION_ENTRY *v22; 
  size_t v23; 
  const VOID *v24; 
  UINT64 v25; 
  UINT64 Priority; 
  int v27; 
  char *v28; 
  INT64 v29[2]; 
  __int128 v30; 
  __int128 v31; 
  __int64 v32; 
  char v33; 

  *(_OWORD *)v29 = 0i64;
  v30 = 0i64;
  v31 = 0i64;
  v32 = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  if( (Mdl->MdlFlags & 5) != 0 )
  {
    MappedSystemVa = (char *)Mdl->MappedSystemVa;
  }
  else
  {
    LODWORD(Priority) = 1073741856;
    LODWORD(v25) = 0;
    MappedSystemVa = (char *)MmMapLockedPagesSpecifyCache(Mdl, 0, MmCached, 0i64, v25, Priority);
  }
  if( MappedSystemVa )
  {
    v33 = 0;
    v14 = (unsigned __int16)CurrentVa & 0xFFF;
    v15 = (v14 + (unsigned __int64)(unsigned int)Length + 4095) >> 12;
    v27 = v15;
    if( CurrentIrql <= 2u )
    {
      if( CurrentIrql < 2u )
      {
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
        v33 = 1;
      }
      HalpDmaAcquireBufferMappings(v14, TranslationBase, v15, (__int64)v29);
    }
    else
    {
      v16 = 0;
      for( i = TranslationBase; v16 < (unsigned int)v15; ++v16 )
      {
        if( ((unsigned __int64)i->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) == 0 )
          KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF03, 0i64, 0i64);
        i = i->Next;
      }
    }
    v18 = &MappedSystemVa[(char *)CurrentVa - Mdl->ByteOffset - (char *)Mdl->StartVa];
    v28 = v18;
    v19 = (unsigned __int16)v18 & 0xFFF;
    v20 = v18;
    if( !ChildAdapter->CacheCoherent && !(_BYTE)CopyDown )
    {
      LOBYTE(Priority) = DeferFlushing;
      LOBYTE(v25) = 0;
      HalpFlushMapBuffers(ChildAdapter, v18, TranslationBase, (unsigned int)Length, v25, Priority);
      v19 = (unsigned __int16)v18 & 0xFFF;
    }
    if( (_DWORD)Length )
    {
      v21 = Length;
      v22 = TranslationBase;
      do
      {
        v23 = v21;
        if( v21 >= 4096 - (int)v19 )
          v23 = 4096 - v19;
        v24 = (const VOID *)(((unsigned __int64)v22->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) + (unsigned int)v19);
        if( !CacheSyncOnly )
        {
          if( (_BYTE)CopyDown )
            ((void(__fastcall *)(const VOID *, char *, _QWORD))HalpMoveMemory)(v24, v18, v23);
          else
            memmove(v18, v24, v23);
        }
        v22 = v22->Next;
        v19 = 0i64;
        v18 += v23;
        v21 -= v23;
      }
      while( v21 );
      LODWORD(v15) = v27;
      v20 = v28;
    }
    if( !ChildAdapter->CacheCoherent && (_BYTE)CopyDown )
    {
      LOBYTE(Priority) = DeferFlushing;
      LOBYTE(v25) = CopyDown;
      HalpFlushMapBuffers(ChildAdapter, v20, TranslationBase, (unsigned int)Length, v25, Priority);
    }
    if( CurrentIrql <= 2u )
      HalpDmaReleaseBufferMappings(v19, (INT64)TranslationBase, (unsigned int)v15, (INT64)v29);
    if( v33 )
      __writecr8(CurrentIrql);
  }
  else
  {
    if( CurrentIrql > 2u )
      KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF05, 0i64, 0i64);
    HalpDmaSyncMapBuffersWithEmergencyResources(
      ChildAdapter,
      Mdl,
      CurrentVa,
      (_KLOCK_QUEUE_HANDLE *)TranslationBase,
      Length,
      CopyDown);
  }
}

Referenced by:

HalpDmaFlushContiguousTransferV2
HalpDmaFlushContiguousTransferV3
HalpDmaFlushScatterTransferV2
HalpDmaFlushScatterTransferV3
HalpDmaMapContiguousTransferV2
HalpDmaMapContiguousTransferV3
HalpDmaMapScatterTransferV2
HalpDmaMapScatterTransferV3