HalpDmaFlushBufferWithEmergencyResources

VOID __stdcall HalpDmaFlushBufferWithEmergencyResources(
        _DOUBLE ChildAdapter,
        _MDL *Mdl,
        VOID *CurrentVa,
        UINT64 WriteToDevice,
        INT64 DeferFlushing,
        INT64 a6){
  unsigned int v7; 
  int v9; 
  int v10; 
  _MDL **v11; 
  _MDL *v12; 
  _MEMORY_CACHING_TYPE v13; 
  VOID *v14; 
  unsigned int v15; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  v7 = WriteToDevice;
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&qword_140CF2318, &LockHandle);
  v9 = (unsigned __int16)CurrentVa & 0xFFF;
  v10 = 4096 - v9;
  v11 = &Mdl[1].Next + (unsigned int)(((unsigned __int64)CurrentVa - (unsigned __int64)Mdl->StartVa) >> 12);
  v12 = (_MDL *)::Mdl;
  *(_QWORD *)(::Mdl + 32) = (unsigned __int64)CurrentVa & 0xFFFFFFFFFFFFF000ui64;
  for( v12->ByteOffset = v9; ; v12->ByteOffset = (unsigned __int16)CurrentVa & 0xFFF )
  {
    v12->ByteCount = v10;
    if( !v7 )
      break;
    v13 = MmNonCached;
    v12[1].Next = *v11;
    while( 1 )
    {
      v14 = MmMapLockedPagesWithReservedMapping(MappingAddress, 0x206C6148ui64, v12, v13);
      if( v14 )
        break;
      if( ++v13 >= MmMaximumCacheType )
        KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF01, 0i64, 0i64);
    }
    v15 = v7;
    if( v7 >= 4096 - v9 )
      v15 = 4096 - v9;
    if( !(_BYTE)a6 )
      KeFlushIoBuffers(v12, (_BYTE)DeferFlushing == 0, 1u);
    MmUnmapReservedMapping((UINT64)v14, 0x206C6148ui64, (INT64)v12);
    v7 -= v15;
    CurrentVa = (char *)CurrentVa + v15;
    ++v11;
    v9 = 0;
    v10 = v7;
    if( v7 > 0x1000 )
      v10 = 4096;
    v12->StartVa = (void *)((unsigned __int64)CurrentVa & 0xFFFFFFFFFFFFF000ui64);
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
}

Referenced by:

HalpDmaFlushBuffer