MiConvertHiberPhasePte
NTSTATUS __stdcall MiConvertHiberPhasePte(INT64 a1, INT64 *a2, INT64 a3){
INT64 PteShadow;
int v4;
__int64 v7;
unsigned __int64 v9;
int v10;
__int64 v11;
int v12;
unsigned __int64 v13;
int v14;
UINT64 v15;
PteShadow = *a2;
v4 = a3;
if( a2 >= (INT64 *)MmGetPml4eBase() && a2 <= (INT64 *)MmGetPxeUserLimit() )
PteShadow = MiReadPteShadow((__int64)a2, *a2);
v7 = *(_QWORD *)(a1 + 168);
v15 = PteShadow;
if( v7 )
{
if( (PteShadow & 1) != 0 && !v4 )
{
v9 = PteShadow;
LOBYTE(v10) = MiPteInShadowRange((UINT64)&v15);
if( v10 )
v9 = MiReadPteShadow((__int64)&v15, PteShadow);
v11 = (v9 >> 12) & 0xFFFFFFFFFi64;
MiIsPfn(v11);
if( v12 )
{
if( v11 != *(&stru_140C4DB30 + 498)
&& v11 != *(&stru_140C4DB30 + 495)
&& !_bittest64(*(const signed __int64 **)(v7 + 8), (unsigned int)v11) )
{
v13 = PteShadow & 0xFFFFFFFFFFFFFBFAui64 | 0x404;
v15 = v13;
MiPteInShadowRange((UINT64)a2);
LABEL_22:
*a2 = v13;
}
}
}
}
else if( (PteShadow & 1) == 0 && (PteShadow & 0x400) != 0 && (PteShadow & 4) != 0 )
{
v13 = PteShadow & 0xFFFFFFFFFFFFFBFAui64 | 1;
v15 = v13;
LOBYTE(v14) = MiPteInShadowRange((UINT64)a2);
if( v14 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 )
v13 |= 0x8000000000000000ui64;
goto LABEL_22;
}
return 0;
}Referenced by:
No references.