PfpPfnPrioRequest

NTSTATUS __stdcall PfpPfnPrioRequest(_SUPERFETCH_INFORMATION *Info, INT8 PreviousMode, UINT64 *ReturnSize){
  size_t v5; 
  _DWORD *v6; 
  _SUPERFETCH_INFORMATION_CLASS v7; 
  UINT64 v8; 
  int v9; 
  char *v10; 
  char *v11; 
  _ETHREAD *CurrentThread; 
  UINT64 v13; 
  int v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  UINT64 v19; 
  _SUPERFETCH_INFORMATION v20; 
  int v21; 
  int v22; 
  UINT64 PfnQueryRequest; 
  _DWORD *v24; 
  VOID *Src; 

  v5 = 0;
  v6 = 0i64;
  Src = 0i64;
  v7 = Info[2];
  if( v7 == SuperfetchPfnQuery )
  {
    v8 = (unsigned int)Info[6];
    if( (unsigned int)v8 < 0xD8 )
    {
      v9 = -1073741306;
      goto LABEL_22;
    }
    LODWORD(PfnQueryRequest) = 1;
    v9 = PfpCopyUserPfnPrioRequest(
           *((_PF_PFN_PRIO_REQUEST **)Info + 2),
           v8,
           SuperfetchPfnQuery,
           (_PF_PFN_PRIO_REQUEST **)&Src,
           PreviousMode,
           PfnQueryRequest);
    if( v9 >= 0 )
    {
      v24 = Src;
      v10 = (char *)Src + 192;
      v9 = 0;
      v11 = (char *)Src + 24 * *((_QWORD *)Src + 1) + 192;
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      MiLockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
      if( v10 < v11 )
      {
        while( 1 )
        {
          v13 = *((_QWORD *)v10 + 1);
          MiIsPfn(v13);
          if( !v14 )
            break;
          MiIdentifyPfnWrapper(&MmGetPfnDb()[v13], (_MMPFN_IDENTITY *)v10);
          v10 += 24;
          if( v10 >= v11 )
            goto LABEL_7;
        }
        *((_QWORD *)v10 + 2) |= 2ui64;
        v9 = -1073741584;
      }
LABEL_7:
      MiUnlockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
      v6 = Src;
      if( v9 >= 0 && (*((_DWORD *)Src + 1) & 1) != 0 )
        MmQueryMemoryListInformation((VOID *)0xFFFFFFFFFFFFFFFFi64, (UINT64)Src + 16, (UINT64 *)0xB0);
      if( PreviousMode )
      {
        v15 = *((_QWORD *)Info + 2);
        if( Info[6] )
        {
          if( (v15 & 7) != 0 )
            ExRaiseDatatypeMisalignment();
          v16 = v15 + (unsigned int)Info[6] - 1i64;
          if( v15 > v16 || v16 >= 0x7FFFFFFF0000i64 )
            ExRaiseAccessViolation();
          v17 = (v16 & 0xFFFFFFFFFFFFF000ui64) + 4096;
          do
          {
            *(_BYTE *)v15 = *(_BYTE *)v15;
            v15 = (v15 & 0xFFFFFFFFFFFFF000ui64) + 4096;
          }
          while( v15 != v17 );
          v6 = Src;
        }
      }
      v5 = 24 * (v24[2] + 8);
      memmove(*((VOID **)Info + 2), v6, v5);
      goto LABEL_21;
    }
    goto LABEL_45;
  }
  if( v7 != SuperfetchPfnSetPriority && v7 != SuperfetchMovePages && v7 != SuperfetchInformationMax )
  {
    v9 = -1073741821;
    goto LABEL_22;
  }
  v19 = (unsigned int)Info[6];
  if( (unsigned int)v19 < 0xD8 )
  {
    v9 = -1073741306;
    goto LABEL_22;
  }
  LODWORD(PfnQueryRequest) = 0;
  v9 = PfpCopyUserPfnPrioRequest(
         *((_PF_PFN_PRIO_REQUEST **)Info + 2),
         v19,
         v7,
         (_PF_PFN_PRIO_REQUEST **)&Src,
         PreviousMode,
         PfnQueryRequest);
  if( v9 >= 0 )
  {
    v20 = Info[2];
    if( v20 == 7 )
    {
      v21 = 0;
    }
    else
    {
      if( v20 != 29 )
      {
        v6 = Src;
        v22 = MmRelocatePfnList(
                *((_QWORD *)Src + 1),
                (_MMPFN_IDENTITY *)Src + 48,
                *((unsigned __int16 *)Src + 2),
                *((unsigned __int16 *)Src + 3));
        goto LABEL_31;
      }
      v21 = 1;
    }
    v6 = Src;
    v22 = MmSetPfnListInfo(*((_QWORD *)Src + 1), (_QWORD *)Src + 24, v21);
LABEL_31:
    v9 = v22;
    if( Info[2] == 22 || v22 < 0 )
    {
      if( PreviousMode )
        ProbeForWrite(*((_QWORD *)Info + 2), (unsigned int)Info[6], 8i64);
      v5 = 24 * (v6[2] + 8);
      memmove(*((VOID **)Info + 2), v6, v5);
    }
LABEL_21:
    *(_DWORD *)ReturnSize = v5;
    goto LABEL_22;
  }
LABEL_45:
  v6 = Src;
LABEL_22:
  if( v6 )
    ExFreePoolWithTag(v6, 0);
  return v9;
}

Referenced by:

PfQuerySuperfetchInformation
PfSetSuperfetchInformation