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