HalpDmaAllocateScatterPagesFromScatterPoolV3

__int64 __fastcall HalpDmaAllocateScatterPagesFromScatterPoolV3(
        __int64 a1,
        __int64 a2,
        unsigned int a3,
        char a4,
        char a5,
        unsigned int *a6){
  __int64 v9; 
  unsigned int v10; 
  unsigned int v11; 
  __int64 result; 
  unsigned int v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  memset(&LockHandle, 0, sizeof(LockHandle));
  v9 = 0i64;
  KeAcquireInStackQueuedSpinLock((UINT64 *)(a2 + 120), &LockHandle);
  if( a5 )
  {
    v10 = *(_DWORD *)(a2 + 208);
    v9 = a2;
    v11 = *(_DWORD *)(a2 + 212);
    if( v10 <= v11 )
    {
LABEL_3:
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      *a6 = 0;
      return 0i64;
    }
    v13 = v10 - v11;
    if( a3 > v13 )
      a3 = v13;
  }
  if( a3 > *(_DWORD *)(a2 + 32) )
  {
    a3 = 0;
    if( !a4 )
      a3 = *(_DWORD *)(a2 + 32);
  }
  if( !a3 )
    goto LABEL_3;
  v14 = *(_QWORD *)(a2 + 24);
  v15 = v14;
  v16 = a3;
  do
  {
    v17 = v15;
    v15 = *(_QWORD *)(v15 + 8);
    --v16;
  }
  while( v16 );
  *(_QWORD *)(v17 + 8) = 0i64;
  *(_DWORD *)(a2 + 32) -= a3;
  *(_QWORD *)(a2 + 24) = v15;
  if( a5 )
    *(_DWORD *)(v9 + 208) -= a3;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  result = v14;
  *a6 = a3;
  return result;
}

Referenced by:

HalpDmaAllocateScatterPagesFromScatterPool