PfTAllocateBuffers

NTSTATUS __stdcall PfTAllocateBuffers(
        PFP_BUFFER_MANAGER *BufferMgr,
        UINT64 BufferSize,
        UINT64 BufferCount,
        UINT64 PoolTag){
  NTSTATUS v4; 
  UINT64 v5; 
  unsigned int v6; 
  unsigned int v7; 
  unsigned int v9; 
  VOID **PoolWithTag; 
  _QWORD *v11; 
  PFP_BUFFER_MANAGER *v12; 
  __int64 v13; 

  v4 = 0;
  v5 = (unsigned int)BufferSize;
  v6 = PoolTag;
  v7 = BufferCount;
  *BufferMgr = (16 * BufferSize) | *BufferMgr & 0xF;
  v9 = 0;
  if( (_DWORD)BufferCount )
  {
    while( 1 )
    {
      PoolWithTag = ExAllocatePoolWithTag(1ui64, v5, v6);
      if( !PoolWithTag )
        return -1073741670;
      if( (*BufferMgr & 0xF) != 0 )
      {
        memset(PoolWithTag, 0i64, v5);
        PoolWithTag[1] = PoolWithTag;
        *PoolWithTag = PoolWithTag;
        *((_DWORD *)PoolWithTag + 8) = 2048;
      }
      else
      {
        PfTLbInitialize(PoolWithTag, v5, 0);
      }
      *PoolWithTag = (VOID *)*((_QWORD *)BufferMgr + 2);
      ++*((_WORD *)BufferMgr + 5);
      ++v9;
      ++BufferMgr[1];
      *((_QWORD *)BufferMgr + 2) = PoolWithTag;
      if( v9 >= v7 )
        goto LABEL_6;
    }
  }
  else
  {
LABEL_6:
    v11 = PfTGetFreeBuffer((__int64)BufferMgr);
    v12 = BufferMgr + 6;
    v13 = *(_QWORD *)v12;
    if( *(PFP_BUFFER_MANAGER **)(*(_QWORD *)v12 + 8i64) != v12 )
      __fastfail(3u);
    *v11 = v13;
    v11[1] = v12;
    *(_QWORD *)(v13 + 8) = v11;
    *(_QWORD *)v12 = v11;
  }
  return v4;
}

Referenced by:

PfTStart