HalpDmaAcquireBufferMappings

int __fastcall HalpDmaAcquireBufferMappings(__int64 a1, _QWORD *a2, unsigned int a3, __int64 a4){
  unsigned __int64 v4; 
  __int64 v5; 
  unsigned int v6; 
  _QWORD *v8; 
  _QWORD *v9; 
  __int64 v10; 
  __int64 v11; 
  struct _MDL *v12; 
  int v13; 
  struct _MDL *v14; 
  __int64 v15; 
  PSLIST_ENTRY v16; 
  char v17; 
  bool v18; 
  PSLIST_ENTRY v19; 
  WORK_QUEUE_TYPE v20; 
  void *v21; 
  WORK_QUEUE_TYPE v22; 
  void *v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  unsigned int v27; 
  int v28; 
  __int64 *v29; 
  __int64 v30; 
  int v31; 
  unsigned int v32; 
  _BYTE LockHandle[56]; 
  LODWORD(v4) = 0;
  v5 = a3;
  v6 = 0;
  v8 = a2;
  memset(LockHandle, 0, 24);
  if( a3 )
  {
    do
    {
      v4 = a2[6] & 0xFFFFFFFFFFFFF000ui64;
      if( !v4 )
        break;
      a2 = (_QWORD *)a2[1];
      ++v6;
    }
    while( v6 < a3 );
  }
  if( v6 == a3 )
  {
    *(_QWORD *)a4 = 0i64;
    return v4;
  }
  v9 = v8;
  v10 = *((unsigned int *)KeGetCurrentPrcb() + 9);
  v11 = (unsigned int)v10;
  v12 = *(struct _MDL **)(qword_140C53C60 + 8 * v10);
  v13 = 0;
  v14 = v12 + 1;
  if( (_DWORD)v5 )
  {
    v15 = v5;
    do
    {
      if( (v9[6] & 0xFFFFFFFFFFFFF000ui64) == 0 )
      {
        ++v13;
        v14->Next = (_MDL *)(*v9 >> 12);
        v14 = (struct _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_140C53C68 + 8 * v11);
    goto LABEL_32;
  }
  v19 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)&xmmword_140CF6260);
  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((PIO_WORKITEM)(a4 + 24), (PIO_WORKITEM_ROUTINE)&v16[2], v20, v21);
LABEL_32:
    LODWORD(v4) = MmMapLockedPagesWithReservedMapping(v16[1].Next, 0x206C6148ui64, v12, MmCached);
    v24 = v4;
    if( !v4 )
      KeBugCheckEx(0xACu, 0x1000ui64, 0xEF02ui64, 0i64, 0i64);
    goto LABEL_16;
  }
  v4 = (unsigned __int64)MmMapLockedPagesSpecifyCache(v12, 0, MmCached, 0i64, 0, 0x40000020u);
  v24 = v4;
  if( !v4 )
  {
    *(_QWORD *)LockHandle = 0i64;
    *(_QWORD *)&LockHandle[8] = qword_140CF2310;
    KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, qword_140CF2310, v22, v23);
    v27 = 1;
    v28 = *(_DWORD *)(*(_QWORD *)qword_140C53C68 + 24i64);
    if( (unsigned int)dword_140CF6278 > 1 )
    {
      v29 = (__int64 *)(qword_140C53C68 + 8);
      do
      {
        v30 = *v29;
        v31 = v28;
        ++v29;
        v28 = *(_DWORD *)(v30 + 24);
        v32 = v27;
        if( v28 >= v31 )
          v32 = (unsigned int)v16;
        ++v27;
        LODWORD(v16) = v32;
        if( v28 >= v31 )
          v28 = v31;
      }
      while( v27 < dword_140CF6278 );
    }
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
    v16 = *(PSLIST_ENTRY *)(qword_140C53C68 + 8i64 * (unsigned int)v16);
    goto LABEL_31;
  }
  v17 = 0;
LABEL_16:
  v25 = v24;
  if( (_DWORD)v5 )
  {
    v26 = v5;
    do
    {
      v4 = v8[6];
      if( (v4 & 0xFFFFFFFFFFFFF000ui64) == 0 )
      {
        v4 = v25 | v8[6] & 0xFEFi64 | 0x10;
        v8[6] = v4;
        v25 += 4096i64;
      }
      v8 = (_QWORD *)v8[1];
      --v26;
    }
    while( v26 );
  }
  *(_QWORD *)a4 = v12;
  *(_QWORD *)(a4 + 8) = v24;
  *(_QWORD *)(a4 + 16) = v16;
  *(_BYTE *)(a4 + 48) = v17;
  return v4;
}

Referenced by:

HalpDmaFreeMapRegisters
HalpDmaSyncMapBuffers
HalpDmaZeroMapBuffers