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