HalpDmaAllocateScatterPagesFromContiguousPoolV3

__int64 __fastcall HalpDmaAllocateScatterPagesFromContiguousPoolV3(
        __int64 a1,
        __int64 a2,
        ULONG a3,
        char a4,
        char a5,
        ULONG *a6){
  __int64 v9; 
  unsigned int v10; 
  unsigned int v11; 
  __int64 result; 
  ULONG v13; 
  struct _RTL_BITMAP *v14; 
  __int64 v15; 
  __int64 v16; 
  ULONG v17; 
  ULONG v18; 
  unsigned int ClearBitsAndSet; 
  __int64 v20; 
  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 )
    {
LABEL_3:
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
LABEL_4:
      *a6 = 0;
      return 0i64;
    }
    v13 = v10 - v11;
    if( a3 > v13 )
      a3 = v13;
  }
  if( a4 )
  {
    v14 = *(struct _RTL_BITMAP **)(a2 + 16);
    if( v14->SizeOfBitMap - RtlNumberOfSetBits(v14) < a3 )
      goto LABEL_3;
  }
  v15 = 0i64;
  v16 = 0i64;
  v17 = 0;
  v18 = 0;
  if( a3 )
  {
    do
    {
      ClearBitsAndSet = RtlFindClearBitsAndSet(*(PRTL_BITMAP *)(a2 + 16), 1u, v18);
      if( ClearBitsAndSet == -1 )
        break;
      v20 = HalpDmaIndexToTranslationEntry(a2, ClearBitsAndSet, 0i64);
      if( v15 )
        *(_QWORD *)(v16 + 8) = v20;
      else
        v15 = v20;
      ++v17;
      v16 = v20;
    }
    while( v17 < a3 );
    if( v16 )
      *(_QWORD *)(v16 + 8) = 0i64;
  }
  if( a5 )
    *(_DWORD *)(v9 + 200) -= v17;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( !v17 )
    goto LABEL_4;
  result = v15;
  *a6 = v17;
  return result;
}

Referenced by:

HalpDmaAllocateScatterPagesFromContiguousPool