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