SmBinaryArrayGrow

CHAR *__fastcall SmBinaryArrayGrow(INT64 a1, UINT64 a2){
  CHAR *v2; 
  INT64 v3; 
  unsigned int v4; 
  int v5; 
  char *v6; 
  __int64 v7; 
  char *PoolWithTag; 
  v2 = 0i64;
  v3 = a1;
  _BitScanReverse((unsigned int *)&a1, a2);
  v5 = a2 ^ (1 << v4);
  if( v4 < 0x20 )
  {
    v6 = *(char **)(v3 + 8 * a1);
    v7 = (unsigned int)a1;
    if( !v6 )
    {
      PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned int)(16 * (1 << a1)), 0x41426D73ui64);
      v6 = PoolWithTag;
      if( !PoolWithTag )
        return v2;
      memset((INT64)PoolWithTag, 0i64);
      *(_QWORD *)(v3 + 8 * v7) = v6;
    }
    return &v6[16 * v5];
  }
  return v2;
}

Referenced by:

SmHpBufferAlloc