SmHpBufferAlloc

VOID __fastcall SmHpBufferAlloc(_BYTE *Heap, CHAR a2){
  _QWORD *PoolWithTag; 
  __int64 v4; 
  UINT64 v5; 
  CHAR *v6; 
  _WORD *v7; 
  __int64 v8; 
  _WORD *v9; 
  unsigned __int64 i; 
  __int64 v11; 
  PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x1000ui64, 0x42436D73ui64);
  if( PoolWithTag )
  {
    v4 = *((unsigned int *)Heap + 136);
    if( (_DWORD)v4 == -1 )
    {
      v5 = *((unsigned int *)Heap + 64);
      if( (unsigned int)v5 > *((_DWORD *)Heap + 65) )
        goto LABEL_10;
      v6 = SmBinaryArrayGrow((INT64)Heap, v5);
      if( !v6 )
        goto LABEL_10;
      LODWORD(v4) = *((_DWORD *)Heap + 64);
      *((_DWORD *)Heap + 64) = v4 + 1;
    }
    else
    {
      _BitScanReverse((unsigned int *)&v11, v4);
      v6 = (CHAR *)(*(_QWORD *)&Heap[8 * v11] + 16 * (v4 ^ (unsigned int)(1 << v11)));
      *((_DWORD *)Heap + 136) = *((_DWORD *)v6 + 2);
    }
    v7 = v6 + 8;
    *(_OWORD *)PoolWithTag = 0i64;
    PoolWithTag[2] = 0i64;
    v8 = 0i64;
    *((_DWORD *)PoolWithTag + 4) = v4;
    PoolWithTag[1] = PoolWithTag;
    *PoolWithTag = PoolWithTag;
    *((_QWORD *)v6 + 1) = 0i64;
    *(_QWORD *)v6 = PoolWithTag;
    v9 = (_WORD *)((char *)PoolWithTag + *((unsigned int *)Heap + 70));
    for( i = (unsigned __int64)v9 + *((unsigned int *)Heap + 68);
          i <= (unsigned __int64)(PoolWithTag + 512);
          i += *((unsigned int *)Heap + 68) )
    {
      LOWORD(v8) = v8 + 1;
      *v7 = (_WORD)v9 - (_WORD)PoolWithTag;
      v7 = v9;
      v9 = (_WORD *)i;
    }
    *v7 = -1;
    SmHpBufferUpdateFullness(Heap, v6, v8);
    PoolWithTag = 0i64;
LABEL_10:
    if( PoolWithTag )
      ExFreePoolWithTag(PoolWithTag, 0);
  }
}

Referenced by:

SmHpChunkAlloc