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