MmCheckForSafeExecution
UINT8 __stdcall MmCheckForSafeExecution(
VOID *InstructionPointer,
VOID *StackPointer,
VOID *BranchTarget,
UINT8 PermitStackExecution){
_ETHREAD *CurrentThread;
UINT8 v9;
_EPROCESS *Process;
_MMVAD *Address;
_MMVAD *v12;
_MMVAD *v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = 1;
Process = CurrentThread->Tcb.ApcState.Process;
LOCK_ADDRESS_SPACE_SHARED(CurrentThread, Process);
if( !PermitStackExecution
&& ((MiLocateAddress(InstructionPointer), Address = MiLocateAddress(StackPointer), !v12)
|| !Address
|| v12 == Address
|| (v12->Core.u.LongFlags & 0x70) == 32)
|| (v13 = MiLocateAddress(BranchTarget)) == 0i64
|| (v13->Core.u.LongFlags & 0x70) != 32 )
{
v9 = 0;
}
UNLOCK_ADDRESS_SPACE_SHARED(CurrentThread, Process);
if( v9 == 1 )
return MmValidateUserCallTarget(BranchTarget) != 0;
return v9;
}Referenced by:
KiEmulateAtlThunk