PfpCopyUserPfnPrioRequest

NTSTATUS __stdcall PfpCopyUserPfnPrioRequest(
        _PF_PFN_PRIO_REQUEST *UserPfnRequest,
        UINT64 UserRequestLength,
        _SUPERFETCH_INFORMATION_CLASS UserInformationClass,
        _PF_PFN_PRIO_REQUEST **PfnRequestOut,
        CHAR PreviousMode,
        UINT64 PfnQueryRequest){
  NTSTATUS v9; 
  _PF_PFN_PRIO_REQUEST *v10; 
  char *v11; 
  unsigned __int64 v12; 
  __int64 v13; 
  unsigned int v14; 
  unsigned int v15; 
  VOID **PoolWithTag; 
  size_t v17; 
  VOID *v18; 
  unsigned __int64 i; 

  v9 = 0;
  v10 = 0i64;
  if( PreviousMode && (_DWORD)UserRequestLength )
  {
    if( ((unsigned __int8)UserPfnRequest & 7) != 0 )
      ExRaiseDatatypeMisalignment();
    v11 = (char *)UserPfnRequest + (unsigned int)UserRequestLength;
    if( (unsigned __int64)v11 > 0x7FFFFFFF0000i64 || v11 < (char *)UserPfnRequest )
      MEMORY[0x7FFFFFFF0000] = 0;
  }
  v12 = *((_QWORD *)UserPfnRequest + 1);
  if( v12 <= 0xFFFFFFFF && 24 * (v12 + 8) <= 0xFFFFFFFF )
  {
    if( v12 )
    {
      LODWORD(v13) = MmGetHighestPhysicalPage(0i64);
      if( v12 <= v13 + 1 && v14 <= v15 )
      {
        PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v14, 1112565328i64);
        v10 = (_PF_PFN_PRIO_REQUEST *)PoolWithTag;
        if( !PoolWithTag )
        {
          v9 = -1073741670;
          goto LABEL_24;
        }
        *(_OWORD *)PoolWithTag = *(_OWORD *)UserPfnRequest;
        *((_OWORD *)PoolWithTag + 1) = *((_OWORD *)UserPfnRequest + 1);
        *((_OWORD *)PoolWithTag + 2) = *((_OWORD *)UserPfnRequest + 2);
        *((_OWORD *)PoolWithTag + 3) = *((_OWORD *)UserPfnRequest + 3);
        *((_OWORD *)PoolWithTag + 4) = *((_OWORD *)UserPfnRequest + 4);
        *((_OWORD *)PoolWithTag + 5) = *((_OWORD *)UserPfnRequest + 5);
        *((_OWORD *)PoolWithTag + 6) = *((_OWORD *)UserPfnRequest + 6);
        *((_OWORD *)PoolWithTag + 7) = *((_OWORD *)UserPfnRequest + 7);
        *((_OWORD *)PoolWithTag + 8) = *((_OWORD *)UserPfnRequest + 8);
        *((_OWORD *)PoolWithTag + 9) = *((_OWORD *)UserPfnRequest + 9);
        *((_OWORD *)PoolWithTag + 10) = *((_OWORD *)UserPfnRequest + 10);
        *((_OWORD *)PoolWithTag + 11) = *((_OWORD *)UserPfnRequest + 11);
        if( *(_DWORD *)PoolWithTag == 1
          && ((unsigned int)(UserInformationClass - 6) > 1 || (*((_DWORD *)PoolWithTag + 1) & 0xFFFFFFFE) == 0)
          && PoolWithTag[1] == (VOID *)v12 )
        {
          v17 = 24 * v12;
          v18 = PoolWithTag + 24;
          if( (_DWORD)PfnQueryRequest )
          {
            memset(v18, 0i64, v17);
            for( i = 0i64; i < v12; ++i )
              *(_QWORD *)&v10[6 * i + 50] = *(_QWORD *)&UserPfnRequest[6 * i + 50];
          }
          else
          {
            memmove(v18, UserPfnRequest + 48, v17);
          }
          *PfnRequestOut = v10;
          v10 = 0i64;
          goto LABEL_24;
        }
      }
    }
  }
  v9 = -1073741811;
LABEL_24:
  if( v10 )
    ExFreePoolWithTag(v10, 0);
  return v9;
}

Referenced by:

PfpPfnPrioRequest