MmCheckForSafeExecution
UINT8 __stdcall MmCheckForSafeExecution(
PVOID InstructionPointer,
PVOID StackPointer,
PVOID BranchTarget,
UINT8 PermitStackExecution){
_ETHREAD *CurrentThread;
UINT8 v9;
_EPROCESS *v10;
RTL_BALANCED_NODE *Address;
__int64 v12;
RTL_BALANCED_NODE *v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = 1;
v10 = (_EPROCESS *)*((_QWORD *)CurrentThread + 23);
LOCK_ADDRESS_SPACE_SHARED(CurrentThread, v10);
if( !PermitStackExecution
&& ((MiLocateAddress((UINT64)InstructionPointer), Address = MiLocateAddress((UINT64)StackPointer), !v12)
|| !Address
|| (RTL_BALANCED_NODE *)v12 == Address
|| (*(_DWORD *)(v12 + 48) & 0x70) == 32)
|| (v13 = MiLocateAddress((UINT64)BranchTarget)) == 0i64
|| ((__int64)v13[2].Children[0] & 0x70) != 32 )
{
v9 = 0;
}
UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, (__int64)v10);
if( v9 == 1 )
return(unsigned int)MmValidateUserCallTarget(BranchTarget, 1ui64) != 0;
return v9;
}Referenced by:
KiEmulateAtlThunk