IopAllocateMiniCompletionPacket

BYTE *__fastcall IopAllocateMiniCompletionPacket(CHAR a1, CHAR a2){
  CHAR v3; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v5; 
  BYTE *result; 
  __int64 v7; 
  UINT64 v8; 
  v3 = a1;
  if( a1 == 4 )
  {
    v8 = 80i64;
LABEL_7:
    result = (BYTE *)ExAllocatePoolWithTagPriority(NonPagedPoolNx, v8, 0x20706349ui64, LowPoolPriority);
    goto LABEL_8;
  }
  CurrentPrcb = KeGetCurrentPrcb();
  v5 = *((_QWORD *)CurrentPrcb + 270);
  ++*(_DWORD *)(v5 + 20);
  result = (BYTE *)RtlpInterlockedPopEntrySList((PSLIST_HEADER)v5);
  if( result )
    goto LABEL_3;
  ++*(_DWORD *)(v5 + 24);
  v7 = *((_QWORD *)CurrentPrcb + 271);
  ++*(_DWORD *)(v7 + 20);
  result = (BYTE *)RtlpInterlockedPopEntrySList((PSLIST_HEADER)v7);
  if( result )
    goto LABEL_3;
  ++*(_DWORD *)(v7 + 24);
  if( !a2 )
  {
    v8 = 56i64;
    goto LABEL_7;
  }
  v3 = 3;
  result = (BYTE *)ExAllocatePoolWithQuotaTag(NonPagedPoolNx, 0x38ui64, 0x20706349ui64);
LABEL_8:
  if( result )
LABEL_3:
    result[16] = v3;
  return result;
}

Referenced by:

IoAllocateMiniCompletionPacket
IoSetIoCompletionEx
IoSetIoCompletionEx2
NtReleaseWorkerFactoryWorker