HalpDmaSyncMapBuffersWithEmergencyResources

__int64 __fastcall HalpDmaSyncMapBuffersWithEmergencyResources(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        _QWORD *a4,
        unsigned int a5,
        char a6,
        char a7,
        char a8){
  _QWORD *v8; 
  PMDL v11; 
  PMDL v12; 
  unsigned int v13; 
  unsigned __int64 v15; 
  _MDL **v16; 
  PVOID v17; 
  UINT8 *v18; 
  UINT8 *v19; 
  char v20; 
  MEMORY_CACHING_TYPE v21; 
  UINT8 *v22; 
  UINT8 *v23; 
  unsigned int v24; 
  int v25; 
  unsigned int v26; 
  __int16 v27; 
  __int64 v28; 
  unsigned __int64 v29; 
  int v30; 
  __int64 result; 
  _MDL **v32; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  int AdapterCacheAlignment; 
  __int64 v36; 
  _QWORD *v37; 
  v37 = a4;
  v36 = a3;
  v8 = a4;
  memset(&LockHandle, 0, sizeof(LockHandle));
  AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(a1);
  KeAcquireInStackQueuedSpinLock(&qword_140CF2318, &LockHandle);
  v11 = MemoryDescriptorList;
  v12 = Mdl;
  v13 = a3 & 0xFFF;
  v15 = (unsigned __int64)(a3 - *(_QWORD *)(a2 + 32)) >> 12;
  MemoryDescriptorList->ByteOffset = v13;
  v11->ByteCount = 4096 - v13;
  v11->StartVa = (void *)(a3 & 0xFFFFFFFFFFFFF000ui64);
  v12->StartVa = (void *)(a3 & 0xFFFFFFFFFFFFF000ui64);
  v16 = (_MDL **)(a2 + 8 * ((unsigned int)v15 + 6i64));
  v12->ByteOffset = v13;
  for( v12->ByteCount = 4096 - v13; ; v12->ByteCount = v26 )
  {
    v32 = v16;
    if( !a5 )
      break;
    if( (v8[6] & 0xFFFFFFFFFFFFF000ui64) != 0 )
    {
      v19 = (UINT8 *)(v13 + (v8[6] & 0xFFFFFFFFFFFFF000ui64));
      v20 = 0;
    }
    else
    {
      v17 = qword_140C53C50;
      v12[1].Next = (_MDL *)(*v8 >> 12);
      LODWORD(v18) = MmMapLockedPagesWithReservedMapping(v17, 0x206C6148ui64, v12, MmCached);
      v19 = v18;
      if( !v18 )
        KeBugCheckEx(0xACu, 0x1000ui64, 0xEF00ui64, 0i64, 0i64);
      v16 = v32;
      v20 = 1;
    }
    v21 = MmNonCached;
    v11[1].Next = *v16;
    while( 1 )
    {
      LODWORD(v22) = MmMapLockedPagesWithReservedMapping(MappingAddress, 0x206C6148ui64, v11, v21);
      v23 = v22;
      if( v22 )
        break;
      if( ++v21 >= MmMaximumCacheType )
        KeBugCheckEx(0xACu, 0x1000ui64, 0xEF01ui64, 0i64, 0i64);
    }
    v24 = a5;
    if( a5 >= 4096 - v13 )
      v24 = 4096 - v13;
    v13 = 0;
    if( a6 )
    {
      if( !a7 )
        ((void(__fastcall *)(UINT8 *, UINT8 *, _QWORD))HalpMoveMemory)(v19, v22, v24);
    }
    else
    {
      if( !*(_BYTE *)(a1 + 437) )
      {
        v25 = ~(AdapterCacheAlignment - 1);
        v12->ByteOffset = v25 & (unsigned int)v19 & 0xFFF;
        v12->StartVa = (void *)((unsigned __int64)&v19[-((unsigned int)v19 - (v25 & (unsigned int)v19))] & 0xFFFFFFFFFFFFF000ui64);
        v12->ByteCount = v25 & (v24 + AdapterCacheAlignment + (_DWORD)v19 - (v25 & (unsigned int)v19) - 1);
        if( !a8 )
          KeFlushIoBuffers(v12, 1u, 1u);
      }
      if( !a7 )
        memmove(v23, v19, v24);
    }
    MmUnmapReservedMapping(v23, 0x206C6148u, v11);
    if( v20 )
      MmUnmapReservedMapping(v19, 0x206C6148u, v12);
    a5 -= v24;
    v26 = a5;
    v16 = v32 + 1;
    v27 = v24 + v36;
    v8 = (_QWORD *)v37[1];
    v28 = v24 + v36;
    v37 = v8;
    if( a5 > 0x1000 )
      v26 = 4096;
    v36 += v24;
    v29 = v28 & 0xFFFFFFFFFFFFF000ui64;
    v11->ByteCount = v26;
    v11->StartVa = (void *)v29;
    v30 = v27 & 0xFFF;
    v11->ByteOffset = v30;
    v12->StartVa = (void *)v29;
    v12->ByteOffset = v30;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  result = (unsigned int)KiIrqlFlags;
  __writecr8(LockHandle.OldIrql);
  return result;
}

Referenced by:

HalpDmaSyncMapBuffers