MiMakeProtoReadOnly
CHAR __stdcall MiMakeProtoReadOnly(UINT64 *a1, INT64 a2){
INT64 v4;
char v5;
__int64 v6;
unsigned __int64 v7;
int v8;
_ETHREAD *CurrentThread;
v4 = MI_READ_PTE_LOCK_FREE((INT64)a1);
v5 = *(_BYTE *)(a2 + 34) >> 6;
v6 = 1i64;
if( v5 != 1 )
{
if( v5 )
{
if( v5 == 2 )
v6 = 25i64;
}
else
{
v6 = 9i64;
}
}
v7 = v4 & 0xFFFFFFFFFFFFFC1Fui64 | (32 * v6);
v8 = 0;
LODWORD(CurrentThread) = MiPteInShadowRange((UINT64)a1);
if( (_DWORD)CurrentThread )
{
LODWORD(CurrentThread) = MiPteHasShadow();
if( (_DWORD)CurrentThread )
{
v8 = 1;
if( HIBYTE(word_140C4DD48) )
goto LABEL_13;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (*(_DWORD *)(*((_QWORD *)CurrentThread + 23) + 2172i64) & 0x1000) == 0 )
goto LABEL_13;
}
if( (v7 & 1) != 0 )
{
LOBYTE(CurrentThread) = 0;
v7 |= 0x8000000000000000ui64;
}
}
LABEL_13:
*a1 = v7;
if( v8 )
LOBYTE(CurrentThread) = MiWritePteShadow();
return(char)CurrentThread;
}Referenced by:
MiFinishHardFault
MiResolveTransitionFault