HalpDmaAcquireBufferMappings

unsigned __int64 __fastcall HalpDmaAcquireBufferMappings(__int64 a1, _QWORD *a2, unsigned int a3, __int64 a4){
  unsigned __int64 result; 
  __int64 v5; 
  unsigned int v6; 
  _QWORD *v8; 
  _QWORD *v9; 
  __int64 Number; 
  __int64 v11; 
  _MDL *v12; 
  int v13; 
  _MDL *v14; 
  __int64 v15; 
  PSLIST_ENTRY v16; 
  char v17; 
  bool v18; 
  PSLIST_ENTRY v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  unsigned int v23; 
  int v24; 
  __int64 *v25; 
  __int64 v26; 
  int v27; 
  unsigned int v28; 
  UINT64 v29; 
  UINT64 Priority; 
  _KLOCK_QUEUE_HANDLE LockQueue; 

  result = 0i64;
  v5 = a3;
  v6 = 0;
  v8 = a2;
  memset(&LockQueue, 0, sizeof(LockQueue));
  if( a3 )
  {
    do
    {
      result = a2[6] & 0xFFFFFFFFFFFFF000ui64;
      if( !result )
        break;
      a2 = (_QWORD *)a2[1];
      ++v6;
    }
    while( v6 < a3 );
  }
  if( v6 == a3 )
  {
    *(_QWORD *)a4 = 0i64;
    return result;
  }
  v9 = v8;
  Number = KeGetCurrentPrcb()->Number;
  v11 = (unsigned int)Number;
  v12 = (_MDL *)*((_QWORD *)qword_140C53C60 + Number);
  v13 = 0;
  v14 = v12 + 1;
  if( (_DWORD)v5 )
  {
    v15 = v5;
    do
    {
      if( (v9[6] & 0xFFFFFFFFFFFFF000ui64) == 0 )
      {
        ++v13;
        v14->Next = (_MDL *)(*v9 >> 12);
        v14 = (_MDL *)((char *)v14 + 8);
      }
      v9 = (_QWORD *)v9[1];
      --v15;
    }
    while( v15 );
  }
  v16 = 0i64;
  v12->StartVa = 0i64;
  v17 = 1;
  v12->ByteOffset = 0;
  v18 = byte_140C53C58 == 0;
  v12->ByteCount = v13 << 12;
  if( !v18 )
  {
    v16 = (PSLIST_ENTRY)*((_QWORD *)qword_140C53C68 + v11);
    goto LABEL_32;
  }
  v19 = RtlpInterlockedPopEntrySList(&ListHead);
  if( v19 )
  {
    *((_DWORD *)&v19[1].Next + 3) = 0;
    v16 = v19;
LABEL_31:
    _InterlockedIncrement((volatile signed __int32 *)&v16[1].Next + 2);
    *(_QWORD *)(a4 + 24) = 0i64;
    *(_QWORD *)(a4 + 32) = v16 + 2;
    KxAcquireQueuedSpinLock((_KSPIN_LOCK_QUEUE *)(a4 + 24), (UINT64 *)&v16[2]);
LABEL_32:
    result = (unsigned __int64)MmMapLockedPagesWithReservedMapping(v16[1].Next, 0x206C6148ui64, v12, MmCached);
    v20 = result;
    if( !result )
      KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF02, 0i64, 0i64);
    goto LABEL_16;
  }
  LODWORD(Priority) = 1073741856;
  LODWORD(v29) = 0;
  result = (unsigned __int64)MmMapLockedPagesSpecifyCache(v12, 0, MmCached, 0i64, v29, Priority);
  v20 = result;
  if( !result )
  {
    LockQueue.LockQueue.Next = 0i64;
    LockQueue.LockQueue.Lock = &qword_140CF2310;
    KxAcquireQueuedSpinLock(&LockQueue.LockQueue, &qword_140CF2310);
    v23 = 1;
    v24 = *(_DWORD *)(*(_QWORD *)qword_140C53C68 + 24i64);
    if( (unsigned int)dword_140CF6278 > 1 )
    {
      v25 = (__int64 *)((char *)qword_140C53C68 + 8);
      do
      {
        v26 = *v25;
        v27 = v24;
        ++v25;
        v24 = *(_DWORD *)(v26 + 24);
        v28 = v23;
        if( v24 >= v27 )
          v28 = (unsigned int)v16;
        ++v23;
        LODWORD(v16) = v28;
        if( v24 >= v27 )
          v24 = v27;
      }
      while( v23 < dword_140CF6278 );
    }
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
    v16 = (PSLIST_ENTRY)*((_QWORD *)qword_140C53C68 + (unsigned int)v16);
    goto LABEL_31;
  }
  v17 = 0;
LABEL_16:
  v21 = v20;
  if( (_DWORD)v5 )
  {
    v22 = v5;
    do
    {
      result = v8[6];
      if( (result & 0xFFFFFFFFFFFFF000ui64) == 0 )
      {
        result = v21 | v8[6] & 0xFEFi64 | 0x10;
        v8[6] = result;
        v21 += 4096i64;
      }
      v8 = (_QWORD *)v8[1];
      --v22;
    }
    while( v22 );
  }
  *(_QWORD *)a4 = v12;
  *(_QWORD *)(a4 + 8) = v20;
  *(_QWORD *)(a4 + 16) = v16;
  *(_BYTE *)(a4 + 48) = v17;
  return result;
}

Referenced by:

HalpDmaFreeMapRegisters
HalpDmaSyncMapBuffers
HalpDmaZeroMapBuffers