MiGetPagePrivilege
__int64 __fastcall MiGetPagePrivilege(ULONG_PTR BugCheckParameter2, int a2, unsigned __int64 *a3){
WCHAR *v6;
unsigned __int64 v7;
int v8;
__int64 v9;
INT64 v10;
unsigned __int64 v11;
unsigned int v12;
unsigned int v13;
__int64 result;
unsigned int v15;
unsigned __int64 v16;
unsigned __int8 v17;
UINT64 TopLevelPfn;
unsigned __int64 v19;
unsigned __int64 v20;
int v21;
__int64 v22;
__int64 v23;
__int64 v24;
unsigned __int64 v25;
int v26;
unsigned __int64 v27;
int v28;
unsigned int v29;
int v30;
if( (MiFlags & 0x2000) == 0
|| ((*(_QWORD *)(BugCheckParameter2 + 40) >> 60) & 7) != 3
|| MiIsPfnFileOnly(BugCheckParameter2) )
{
return 0i64;
}
if( a3 && ((unsigned __int16)v6 & 0x8000) == 0 )
a3 = 0i64;
v7 = *(_QWORD *)(BugCheckParameter2 + 8) | 0x8000000000000000ui64;
LOBYTE(v8) = MI_PFN_IS_PROTO(
(UNICODE_STRING *)BugCheckParameter2,
*(UNICODE_STRING **)(BugCheckParameter2 + 8),
0,
v6);
if( v8 )
{
v20 = *(_QWORD *)(BugCheckParameter2 + 16);
if( (v20 & 0x400) == 0 )
{
v21 = 16 * ((v12 >> 18) & 1);
if( a3 )
{
*a3 = v11;
a3[1] = v11;
}
return(unsigned int)(v21 + 3);
}
v22 = *(_QWORD *)(BugCheckParameter2 + 16);
if( qword_140C4DC80 && (v20 & 0x10) == 0 )
v22 = ~qword_140C4DC80 & v20;
v23 = v22 >> 16;
v24 = *(_QWORD *)v23;
if( (*(_DWORD *)(*(_QWORD *)v23 + 56i64) & 0x20) == 0 )
return 2i64;
v25 = *(_QWORD *)(v23 + 8);
if( v7 >= v25 && v7 < v25 + 8i64 * *(unsigned int *)(v23 + 44) )
{
v26 = *(_DWORD *)(v24 + 92);
if( (v26 & 0xC0000) != 0 && (v26 & 0x20000) != 0 && v23 != v24 + 128 )
return 40i64;
v27 = v20 >> 5;
v28 = v26 & 0xC0000;
if( (v12 & 0x40000) != 0 )
{
v29 = 2;
if( v28 )
{
v29 = 10;
if( (v27 & 2) != 0 )
v29 = 11;
}
LABEL_53:
if( a3 )
{
a3[1] = *(_QWORD *)(*(_QWORD *)(v24 + 96) + 56i64);
*a3 = (__int64)(v7 - *(_QWORD *)(v24 + 136)) >> 3 << 12;
}
return v29;
}
if( v28 )
{
v30 = 8;
if( (v27 & 2) != 0 )
v30 = 11;
v29 = v30;
goto LABEL_53;
}
}
return 0i64;
}
if( (v12 & 0x40000) != 0 )
{
v13 = 17;
if( (unsigned __int64)((__int64)((v7 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16) < 0xFFFF800000000000ui64 )
return 2;
return v13;
}
else
{
if( v9 )
{
v16 = (__int64)((v7 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( v16 < 0xFFFF800000000000ui64 )
{
v15 = 20;
if( a3 )
{
if( a2 )
v17 = 17;
else
v17 = MiLockPageInline(v10);
TopLevelPfn = MiGetTopLevelPfn(BugCheckParameter2);
v19 = (*(_QWORD *)TopLevelPfn >> 13) & 0x7FFFFFFFFFF0i64 | 0xFFFF800000000000ui64;
_InterlockedAnd64((volatile signed __int64 *)(TopLevelPfn + 24), 0x7FFFFFFFFFFFFFFFui64);
if( !a2 )
{
_InterlockedAnd64((volatile signed __int64 *)(BugCheckParameter2 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v17);
}
if( *(_QWORD *)(v19 + 992) )
{
*a3 = v16;
a3[1] = *(_QWORD *)(v19 + 992);
}
else
{
return 0;
}
}
}
else
{
v15 = 1;
if( (((unsigned __int8)*(_DWORD *)(BugCheckParameter2 + 16) >> 5) & 2) == 0 )
v15 = 64;
if( a3 )
{
result = v15;
*a3 = v16;
a3[1] = v11;
return result;
}
}
}
else
{
v15 = 4;
if( a3 )
{
result = 4i64;
*a3 = v11;
a3[1] = v11;
return result;
}
}
return v15;
}
}Referenced by:
MiAllocateWsle
MiClearPfnImageVerified
MiCombineCandidate
MiCompleteProtoPteFault
MiCopyPage
MiDbgWriteCheck
MiFlushSectionInternal
MiInsertPageInFreeOrZeroedList
MiMarkPfnVerified
MiPageMightBeZero
MiReferencePageForModifiedWrite
MiRevertValidPte
MiSetSystemCodeProtection
MiTradeActivePage
MiWsleFree
MmChangeImageProtection