HalpDmaAllocateContiguousPagesFromContiguousPoolV2

__int64 __fastcall HalpDmaAllocateContiguousPagesFromContiguousPoolV2(
        __int64 a1,
        __int64 a2,
        ULONG a3,
        char a4,
        char a5,
        ULONG *a6){
  __int64 v9; 
  unsigned int v10; 
  unsigned int v11; 
  __int64 result; 
  ULONG v13; 
  unsigned int ClearBitsAndSet; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  memset(&LockHandle, 0, sizeof(LockHandle));
  v9 = 0i64;
  KeAcquireInStackQueuedSpinLock((UINT64 *)(a2 + 120), &LockHandle);
  if( a5 )
  {
    v10 = *(_DWORD *)(a2 + 200);
    v9 = a2;
    v11 = *(_DWORD *)(a2 + 204);
    if( v10 <= v11 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
LABEL_4:
      *a6 = 0;
      return 0i64;
    }
    v13 = v10 - v11;
    if( a3 > v13 )
      a3 = v13;
  }
  ClearBitsAndSet = -1;
  if( a3 )
  {
    while( 1 )
    {
      ClearBitsAndSet = RtlFindClearBitsAndSet(*(PRTL_BITMAP *)(a2 + 16), a3, 0);
      if( ClearBitsAndSet != -1 )
        break;
      if( !a4 )
      {
        a3 >>= 1;
        if( a3 )
          continue;
      }
      goto LABEL_14;
    }
    if( a5 )
      *(_DWORD *)(v9 + 200) -= a3;
  }
LABEL_14:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( ClearBitsAndSet == -1 )
    goto LABEL_4;
  result = HalpDmaLinkContiguousTranslations(a2, ClearBitsAndSet, a3);
  *a6 = a3;
  return result;
}

Referenced by:

HalpDmaAllocateContiguousPagesFromContiguousPool