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