PfpFileBuildReadList
__int64 __fastcall PfpFileBuildReadList(__int64 a1, __int64 a2, char a3, _QWORD *a4){
unsigned int v7;
__int64 v8;
__int64 v9;
_DWORD *v10;
int v11;
unsigned __int64 v12;
VOID **v13;
unsigned int i;
__int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
VOID **PoolWithTag;
if( (*(_DWORD *)a2 & 1) != 0 && !a3 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x18ui64, 1280468560i64);
if( PoolWithTag )
{
*PoolWithTag = 0i64;
*((_DWORD *)PoolWithTag + 3) = 0;
PoolWithTag[2] = 0i64;
*((_DWORD *)PoolWithTag + 2) = 1;
*a4 = PoolWithTag;
return 0i64;
}
}
else
{
v7 = *(_DWORD *)(a2 + 16);
v8 = 0i64;
if( v7 )
{
v9 = v7;
v10 = (_DWORD *)(*(_QWORD *)(a2 + 24) + 8i64);
do
{
v11 = *v10 >> 12;
v10 += 4;
v8 = (unsigned int)(v11 + v8 + 2);
--v9;
}
while( v9 );
}
v12 = 8 * v8 + 16;
if( v12 > 0xFFFFFFFF )
return 3221225621i64;
v13 = ExAllocatePoolWithTag(1ui64, (unsigned int)v12, 1280468560i64);
if( v13 )
{
*(_OWORD *)v13 = 0i64;
if( (*(_DWORD *)a2 & 1) != 0 )
*((_DWORD *)v13 + 3) = 1;
for( i = 0; i < *(_DWORD *)(a2 + 16); ++i )
{
v15 = *(_QWORD *)(a2 + 24) + 16i64 * i;
v16 = *(_QWORD *)v15 & 0xFFFFFFFFFFFFF000ui64;
if( (*(_DWORD *)(*(_QWORD *)a1 + 80i64) & 2) == 0 )
v16 = *(_QWORD *)v15;
v17 = *(_QWORD *)v15 + *(unsigned int *)(v15 + 8);
while( v16 < v17 )
{
v13[(unsigned int)(*((_DWORD *)v13 + 2))++ + 2] = (VOID *)v16;
v16 += 4096i64;
}
}
*a4 = v13;
return 0i64;
}
}
return 3221225626i64;
}Referenced by:
PfpFileBuildReadSupport