PfpLogPageAccess

unsigned __int64 *__fastcall PfpLogPageAccess(__int64 a1, _DWORD *a2, _BYTE *a3, __int64 a4, int a5){
  __int64 v5; 
  __int16 v6; 
  unsigned __int16 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  char v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  int v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  char v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  int v26; 
  __int64 v27; 
  int v28; 
  __int64 v29; 
  unsigned __int64 *result; 
  __int64 v31; 
  unsigned __int64 v32; 
  unsigned __int64 v33; 
  unsigned __int64 v34; 
  __int64 v35; 
  unsigned __int64 v36; 
  unsigned __int64 v37; 
  __int64 v38; 
  unsigned int v39; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  unsigned int v43; 
  unsigned int v44; 
  __int64 v45; 
  unsigned __int64 v46; 
  __int16 v47; 
  unsigned int v48; 
  unsigned int v49; 
  __int64 v50; 
  unsigned int v51; 
  __int64 v52; 
  unsigned __int64 v53; 
  unsigned __int64 v54; 
  __int16 v55; 
  unsigned int v56; 
  __int16 v57; 
  unsigned int v58; 

  v5 = 0i64;
  v6 = -1;
  v57 = -1;
  if( (*a2 & 0x1FF) == 0 )
    goto LABEL_9;
  v10 = 0;
  v11 = *(_QWORD *)(a4 - 8i64 * (*a2 & 0x1FF));
  v12 = v11 & 0xFFFFFFFFFFFFFFFCui64;
  v13 = 0;
  while( 1 )
  {
    v14 = *(&stru_140C4DB30 + 965);
    v15 = *(unsigned int *)(*(&stru_140C4DB30 + 965) + 16i64);
    v16 = (*(&stru_140C4DB30 + 965) + 47i64) & 0xFFFFFFFFFFFFFFF8ui64;
    if( *(_QWORD *)(v16 + 40 * v15) != v12 )
    {
      v54 = v11 & 0xFFFFFFFFFFFFFFFCui64;
      v15 = (HIBYTE(v54)
           + 37
           * (BYTE6(v54)
            + 37
            * (BYTE5(v54)
             + 37
             * (BYTE4(v54)
              + 37 * (BYTE3(v54) + 37 * (BYTE2(v54) + 37 * (BYTE1(v54) + 37 * ((unsigned __int8)v12 + 11623883)))))))) & (unsigned int)(*(_DWORD *)(*(&stru_140C4DB30 + 965) + 32i64) - 1);
      v38 = *(_QWORD *)(v16 + 40 * v15);
      if( v38 != v12 )
      {
        if( v38 )
        {
          v42 = (unsigned int)(v15 + 1);
          v43 = 0;
          v44 = *(_DWORD *)(*(&stru_140C4DB30 + 965) + 32i64);
          v58 = 0;
          while( (unsigned int)v42 >= v44 )
          {
LABEL_42:
            ++v43;
            v42 = 0i64;
            v58 = v43;
            v44 = (HIBYTE(v54)
                 + 37
                 * (BYTE6(v54)
                  + 37
                  * (BYTE5(v54)
                   + 37
                   * (BYTE4(v54)
                    + 37 * (BYTE3(v54) + 37 * (BYTE2(v54) + 37 * (BYTE1(v54) + 37 * ((unsigned __int8)v12 + 11623883)))))))) & (*(_DWORD *)(*(&stru_140C4DB30 + 965) + 32i64) - 1);
            if( v43 >= 2 )
            {
              v10 = -1;
              goto LABEL_55;
            }
          }
          while( 1 )
          {
            v45 = *(_QWORD *)(v16 + 40 * v42);
            if( v45 == v12 )
            {
              *(_DWORD *)(*(&stru_140C4DB30 + 965) + 16i64) = v42;
              LOWORD(v15) = v42;
              goto LABEL_4;
            }
            if( !v45 )
              break;
            v42 = (unsigned int)(v42 + 1);
            if( (unsigned int)v42 >= v44 )
            {
              v43 = v58;
              goto LABEL_42;
            }
          }
          *(_DWORD *)(*(&stru_140C4DB30 + 965) + 16i64) = v42;
          v10 = v42;
        }
        else
        {
          *(_DWORD *)(*(&stru_140C4DB30 + 965) + 16i64) = v15;
          v10 = v15;
        }
        goto LABEL_55;
      }
      *(_DWORD *)(*(&stru_140C4DB30 + 965) + 16i64) = v15;
    }
LABEL_4:
    if( (_WORD)v15 != 0xFFFF )
      goto LABEL_5;
LABEL_55:
    v51 = *(_DWORD *)(v14 + 28);
    if( v51 < 3 * (*(_DWORD *)(v14 + 32) >> 2) )
      break;
    if( PfTReplaceCurrentBuffer((PFP_BUFFER_MANAGER *)&stru_140C4DB30 + 1924) == -1073741823 )
      return 0i64;
  }
  v13 = 1;
  *(_DWORD *)(v14 + 28) = v51 + 1;
  LOWORD(v15) = v10;
  *(_QWORD *)(v16 + 40i64 * v10) = v12;
LABEL_5:
  if( !v14 )
    return 0i64;
  v57 = v15 + *(_WORD *)(v14 + 36);
  if( v13 )
  {
    v46 = v16 + 40i64 * (unsigned __int16)v15;
    v47 = *(_WORD *)(v46 + 16);
    *(_QWORD *)(v46 + 8) = (16 * v11) | *(_DWORD *)(v46 + 8) & 8 | 4;
    *(_WORD *)(v46 + 16) = v47 & 0xFFF0 | (v11 >> 60);
  }
  v5 = 0i64;
LABEL_9:
  v17 = a5;
  if( a1 >= 0 )
  {
    if( !a5 )
    {
      if( !a1 )
        goto LABEL_18;
      v5 = 1i64;
      v26 = (a1 & 0x7FFFFFFF) - 1;
LABEL_19:
      v27 = *(&stru_140C4DB30 + 960);
      v28 = ((*a3 & 3) == 2) + 1;
      if( (unsigned int)(v28 + *(_DWORD *)(*(&stru_140C4DB30 + 960) + 16i64)) > *(_DWORD *)(*(&stru_140C4DB30 + 960)
                                                                                           + 20i64) )
      {
        while( PfTReplaceCurrentBuffer((PFP_BUFFER_MANAGER *)&stru_140C4DB30 + 1914) != -1073741823 )
        {
          v27 = *(&stru_140C4DB30 + 960);
          if( (unsigned int)(v28 + *(_DWORD *)(*(&stru_140C4DB30 + 960) + 16i64)) <= *(_DWORD *)(*(&stru_140C4DB30 + 960)
                                                                                                + 20i64) )
            goto LABEL_20;
        }
        return 0i64;
      }
      else
      {
LABEL_20:
        v29 = *(unsigned int *)(v27 + 16);
        *(_DWORD *)(v27 + 16) = v28 + v29;
        result = (unsigned __int64 *)(16 * v29 + ((v27 + 31) & 0xFFFFFFFFFFFFFFF8ui64));
        if( (*a3 & 3) == 2 )
        {
          *(_OWORD *)result = *(_OWORD *)a3;
          *result = *result & 0xFFFFFFFFFFFFF003ui64 | 8;
          result += 2;
        }
        v31 = *result;
        if( (*a2 & 0x1FF) != 0 )
        {
          v32 = v31 & 0xFFFFFFFFFFFFFFFCui64;
          *result = v32;
          v33 = ((unsigned __int8)v32 ^ (unsigned __int8)((unsigned __int64)(unsigned int)*a2 >> 7)) & 4 ^ v32;
          *result = v33;
          v34 = ((unsigned __int8)v33 ^ (unsigned __int8)((unsigned __int64)(unsigned int)*a2 >> 7)) & 8 ^ v33;
          *result = v34;
          v35 = v34 & 0xF | (16i64 * (unsigned int)(*(_QWORD *)a2 >> 12));
          *((_WORD *)result + 5) = v6;
          *result = v35;
          *((_WORD *)result + 4) = v57;
        }
        else
        {
          v36 = v31 & 0xFFFFFFFFFFFFFFFCui64 | 1;
          *result = v36;
          v37 = (8 * v5) | (((unsigned __int8)v36 ^ (unsigned __int8)((unsigned __int64)(unsigned int)*a2 >> 7)) & 4 ^ v36) & 0xFFFFFFFFFFFFFFE7ui64;
          *result = v37;
          *result = *(_QWORD *)a2 ^ (*a2 ^ (unsigned int)v37) & 0xFFF;
          if( v5 == 2 )
            *((_WORD *)result + 5) = v6;
          else
            *((_DWORD *)result + 2) = v26;
        }
      }
      return result;
    }
  }
  else if( !a5 )
  {
    v18 = (*(_QWORD *)(a1 + 1088) ^ *(_QWORD *)(a1 + 1128)) & 0x1FFFFFFFFFFFFFFFi64;
    goto LABEL_12;
  }
  v18 = a1;
LABEL_12:
  v55 = 0;
  v19 = v18 & 0xFFFFFFFFFFFFFFFCui64 | 1;
  v20 = 0;
  v21 = 4 * (v19 & 3) + 16;
  while( 2 )
  {
    v22 = *(&stru_140C4DB30 + 965);
    v23 = *(unsigned int *)(v21 + *(&stru_140C4DB30 + 965));
    v24 = (*(&stru_140C4DB30 + 965) + 47i64) & 0xFFFFFFFFFFFFFFF8ui64;
    if( *(_QWORD *)(v24 + 40 * v23) == v19 )
    {
LABEL_14:
      if( (_WORD)v23 != 0xFFFF )
        goto LABEL_15;
      LOWORD(v40) = v55;
    }
    else
    {
      v39 = *(_DWORD *)(*(&stru_140C4DB30 + 965) + 32i64);
      v40 = (HIBYTE(v19)
           + 37
           * (BYTE6(v19)
            + 37
            * (BYTE5(v19)
             + 37
             * (BYTE4(v19)
              + 37 * (BYTE3(v19) + 37 * (BYTE2(v19) + 37 * (BYTE1(v19) + 37 * ((unsigned __int8)v19 + 11623883)))))))) & (v39 - 1);
      v41 = *(_QWORD *)(v24 + 40 * v40);
      if( v41 == v19 )
      {
        *(_DWORD *)(v21 + *(&stru_140C4DB30 + 965)) = v40;
        LOWORD(v23) = (HIBYTE(v19)
                     + 37
                     * (BYTE6(v19)
                      + 37
                      * (BYTE5(v19)
                       + 37
                       * (BYTE4(v19)
                        + 37
                        * (BYTE3(v19) + 37 * (BYTE2(v19) + 37 * (BYTE1(v19) + 37 * ((unsigned __int8)v19 + 24011)))))))) & (v39 - 1);
        goto LABEL_14;
      }
      if( v41 )
      {
        v48 = v40 + 1;
        v49 = 0;
        v17 = a5;
        v56 = 0;
        while( v48 >= v39 )
        {
LABEL_52:
          ++v49;
          v48 = 0;
          v56 = v49;
          v39 = v40;
          if( v49 >= 2 )
          {
            LOWORD(v40) = -1;
            goto LABEL_65;
          }
        }
        while( 1 )
        {
          v50 = *(_QWORD *)(v24 + 40i64 * v48);
          if( v50 == v19 )
          {
            *(_DWORD *)(v21 + *(&stru_140C4DB30 + 965)) = v48;
            LOWORD(v23) = v48;
            goto LABEL_14;
          }
          if( !v50 )
            break;
          if( ++v48 >= v39 )
          {
            v49 = v56;
            goto LABEL_52;
          }
        }
        *(_DWORD *)(v21 + *(&stru_140C4DB30 + 965)) = v48;
        LOWORD(v40) = v48;
      }
      else
      {
        *(_DWORD *)(v21 + *(&stru_140C4DB30 + 965)) = v40;
      }
LABEL_65:
      v55 = v40;
    }
    LODWORD(v23) = *(_DWORD *)(v22 + 28);
    if( (unsigned int)v23 >= 3 * (*(_DWORD *)(v22 + 32) >> 2) )
    {
      if( PfTReplaceCurrentBuffer((PFP_BUFFER_MANAGER *)&stru_140C4DB30 + 1924) == -1073741823 )
        return 0i64;
      continue;
    }
    break;
  }
  v20 = 1;
  *(_DWORD *)(v22 + 28) = v23 + 1;
  *(_QWORD *)(v24 + 40i64 * (unsigned __int16)v40) = v19;
  LOWORD(v23) = v40;
LABEL_15:
  if( v22 )
  {
    v5 = 2i64;
    v6 = v23 + *(_WORD *)(v22 + 36);
    v25 = v24 + 40i64 * (unsigned __int16)v23;
    if( v20 || (*(_BYTE *)(v25 + 8) & 4) != 0 )
    {
      v52 = *(_QWORD *)(v25 + 8);
      if( v17 )
      {
        *(_QWORD *)(v25 + 8) = v52 & 0xFFFFFFFFFFFFFFF8ui64 | 5;
      }
      else
      {
        v53 = v52 & 0xFFFFFFFFFFFFFFF8ui64 | 1;
        *(_QWORD *)(v25 + 8) = v53;
        *(_QWORD *)(v25 + 8) = v53 & 7 | (8i64 * (*(_QWORD *)(a1 + 1088) ^ *(_QWORD *)(a1 + 1128)));
        *(_DWORD *)(v25 + 28) = *(_DWORD *)(a1 + 1524);
        *(_DWORD *)(v25 + 24) = *(_DWORD *)(a1 + 1088);
        *(_QWORD *)(v25 + 16) = a1;
      }
    }
LABEL_18:
    v26 = 0;
    goto LABEL_19;
  }
  return 0i64;
}

Referenced by:

PfpCopyEvent
PfpFlushBuffers