HalpDmaFlushBufferWithEmergencyResources

__int64 __fastcall HalpDmaFlushBufferWithEmergencyResources(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        unsigned int a4,
        char a5,
        char a6){
  unsigned int v9; 
  unsigned int v10; 
  _MDL **v11; 
  PMDL v12; 
  MEMORY_CACHING_TYPE v13; 
  void *v14; 
  void *v15; 
  unsigned int v16; 
  __int64 result; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock(&qword_140CF2318, &LockHandle);
  v9 = a3 & 0xFFF;
  v10 = 4096 - v9;
  v11 = (_MDL **)(a2 + 48 + 8i64 * (unsigned int)((unsigned __int64)(a3 - *(_QWORD *)(a2 + 32)) >> 12));
  v12 = MemoryDescriptorList;
  MemoryDescriptorList->StartVa = (void *)(a3 & 0xFFFFFFFFFFFFF000ui64);
  for( v12->ByteOffset = v9; ; v12->ByteOffset = a3 & 0xFFF )
  {
    v12->ByteCount = v10;
    if( !a4 )
      break;
    v13 = MmNonCached;
    v12[1].Next = *v11;
    while( 1 )
    {
      LODWORD(v14) = MmMapLockedPagesWithReservedMapping(MappingAddress, 0x206C6148ui64, v12, v13);
      v15 = v14;
      if( v14 )
        break;
      if( ++v13 >= MmMaximumCacheType )
        KeBugCheckEx(0xACu, 0x1000ui64, 0xEF01ui64, 0i64, 0i64);
    }
    v16 = a4;
    if( a4 >= 4096 - v9 )
      v16 = 4096 - v9;
    if( !a6 )
      KeFlushIoBuffers(v12, a5 == 0, 1u);
    MmUnmapReservedMapping(v15, 0x206C6148u, v12);
    a4 -= v16;
    a3 += v16;
    ++v11;
    v9 = 0;
    v10 = a4;
    if( a4 > 0x1000 )
      v10 = 4096;
    v12->StartVa = (void *)(a3 & 0xFFFFFFFFFFFFF000ui64);
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  result = (unsigned int)KiIrqlFlags;
  __writecr8(LockHandle.OldIrql);
  return result;
}

Referenced by:

HalpDmaFlushBuffer