HalpDmaSyncMapBuffersWithEmergencyResources

VOID __stdcall HalpDmaSyncMapBuffersWithEmergencyResources(
        _ADAPTER_OBJECT *ChildAdapter,
        _MDL *Mdl,
        VOID *CurrentVa,
        _KLOCK_QUEUE_HANDLE *TranslationBase,
        UINT8 CacheSyncOnly,
        UINT8 DeferFlushing){
  _KLOCK_QUEUE_HANDLE *Lock; 
  _MDL *v9; 
  _MDL *v10; 
  unsigned int v11; 
  unsigned int v12; 
  unsigned __int64 v13; 
  _MDL **v14; 
  VOID *v15; 
  UINT64 v16; 
  char v17; 
  _MEMORY_CACHING_TYPE v18; 
  VOID *v19; 
  size_t v20; 
  int v21; 
  int v22; 
  __int16 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  int v26; 
  _MDL **v27; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  NTSTATUS AdapterCacheAlignment; 
  char *v31; 
  _KLOCK_QUEUE_HANDLE *v32; 
  char v33; 
  char v34; 

  v32 = TranslationBase;
  v31 = (char *)CurrentVa;
  Lock = TranslationBase;
  memset(&LockHandle, 0, sizeof(LockHandle));
  AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(ChildAdapter);
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&qword_140CF2318, &LockHandle);
  v9 = (_MDL *)::Mdl;
  v10 = (_MDL *)MemoryDescriptorList;
  v11 = (unsigned __int16)CurrentVa & 0xFFF;
  v12 = CacheSyncOnly;
  v13 = ((unsigned __int64)CurrentVa - (unsigned __int64)Mdl->StartVa) >> 12;
  *(_DWORD *)(::Mdl + 44) = v11;
  v9->ByteCount = 4096 - v11;
  v9->StartVa = (void *)((unsigned __int64)CurrentVa & 0xFFFFFFFFFFFFF000ui64);
  v10->StartVa = (void *)((unsigned __int64)CurrentVa & 0xFFFFFFFFFFFFF000ui64);
  v14 = &Mdl[1].Next + (unsigned int)v13;
  v10->ByteOffset = v11;
  for( v10->ByteCount = 4096 - v11; ; v10->ByteCount = v22 )
  {
    v27 = v14;
    if( !v12 )
      break;
    if( ((unsigned __int64)Lock[2].LockQueue.Next & 0xFFFFFFFFFFFFF000ui64) != 0 )
    {
      v16 = v11 + ((unsigned __int64)Lock[2].LockQueue.Next & 0xFFFFFFFFFFFFF000ui64);
      v17 = 0;
    }
    else
    {
      v15 = qword_140C53C50;
      v10[1].Next = (_MDL *)((unsigned __int64)Lock->LockQueue.Next >> 12);
      v16 = (UINT64)MmMapLockedPagesWithReservedMapping(v15, 0x206C6148ui64, v10, MmCached);
      if( !v16 )
        KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF00, 0i64, 0i64);
      v14 = v27;
      v17 = 1;
    }
    v18 = MmNonCached;
    v9[1].Next = *v14;
    while( 1 )
    {
      v19 = MmMapLockedPagesWithReservedMapping(MappingAddress, 0x206C6148ui64, v9, v18);
      if( v19 )
        break;
      if( ++v18 >= MmMaximumCacheType )
        KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF01, 0i64, 0i64);
    }
    v20 = v12;
    if( v12 >= 4096 - v11 )
      v20 = 4096 - v11;
    v11 = 0;
    if( DeferFlushing )
    {
      if( !v33 )
        ((void(__fastcall *)(UINT64, VOID *, _QWORD))HalpMoveMemory)(v16, v19, v20);
    }
    else
    {
      if( !ChildAdapter->CacheCoherent )
      {
        v21 = ~(AdapterCacheAlignment - 1);
        v10->ByteOffset = v21 & v16 & 0xFFF;
        v10->StartVa = (void *)((v16 - ((unsigned int)v16 - (v21 & (unsigned int)v16))) & 0xFFFFFFFFFFFFF000ui64);
        v10->ByteCount = v21 & (v20 + AdapterCacheAlignment + v16 - (v21 & v16) - 1);
        if( !v34 )
          KeFlushIoBuffers(v10, 1u, 1u);
      }
      if( !v33 )
        memmove(v19, (const VOID *)v16, v20);
    }
    MmUnmapReservedMapping((UINT64)v19, 0x206C6148ui64, (INT64)v9);
    if( v17 )
      MmUnmapReservedMapping(v16, 0x206C6148ui64, (INT64)v10);
    v12 -= v20;
    v22 = v12;
    v14 = v27 + 1;
    v23 = v20 + (_WORD)v31;
    Lock = (_KLOCK_QUEUE_HANDLE *)v32->LockQueue.Lock;
    v24 = (unsigned __int64)&v31[v20];
    v32 = Lock;
    if( v12 > 0x1000 )
      v22 = 4096;
    v31 += v20;
    v25 = v24 & 0xFFFFFFFFFFFFF000ui64;
    v9->ByteCount = v22;
    v9->StartVa = (void *)v25;
    v26 = v23 & 0xFFF;
    v9->ByteOffset = v26;
    v10->StartVa = (void *)v25;
    v10->ByteOffset = v26;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
}

Referenced by:

HalpDmaSyncMapBuffers