以下内容为程序代码:
BOOL Security::SecWalkCommonProlog (SecWalkPrologData * pData, MethodDesc * pMeth, StackWalkAction * pAction, CrawlFrame * pCf)
{
*pAction = SWA_CONTINUE;
// 跳过 CAS 检测调用帧
if ((pData->pStackMark != NULL) && !IsInCalleesFrames(pCf->GetRegisterSet(), pData->pStackMark))
return TRUE;
// 跳过内部函数帧,如 Reflection / Remoting 调用的内部帧等等
if (pData->dwFlags & CORSEC_SKIP_INTERNAL_FRAMES)
{
// 跳过 Remoting.Messaging.StackBuilderSink.PrivateProcessMessage 方法
if (pMeth == s_stdData.pMethPrivateProcessMessage)
{
pData->bSkippingRemoting = TRUE;
return TRUE
}
// 跳过 Remoting 透明代理帧
if (!pCf->IsFrameless() && pCf->GetFrame()->GetFrameType() == Frame::TYPE_TP_METHOD_FRAME)
{
pData->bSkippingRemoting = FALSE;
return TRUE;
}
// 跳过 Remoting 帧
if (pData->bSkippingRemoting)
return TRUE;
// 跳过 Refection 相关类型的方法帧
MethodTable *pMT = pMeth->GetMethodTable();
if (pMT == s_stdData.pTypeRuntimeMethodInfo ||
pMT == s_stdData.pTypeMethodBase ||
pMT == s_stdData.pTypeRuntimeConstructorInfo ||
pMT == s_stdData.pTypeConstructorInfo ||
pMT == s_stdData.pTypeRuntimeType ||
pMT == s_stdData.pTypeType ||
pMT == s_stdData.pTypeRuntimeEventInfo ||
pMT == s_stdData.pTypeEventInfo ||
pMT == s_stdData.pTypeRuntimePropertyInfo ||
pMT == s_stdData.pTypePropertyInfo ||
pMT == s_stdData.pTypeActivator ||
pMT == s_stdData.pTypeAppDomain ||
pMT == s_stdData.pTypeAssembly)
{
return TRUE;
}
}
// 如果只希望检测调用者的调用者两级,则跳过其他的所有帧
if ((pData->pStackMark != NULL) && (*pData->pStackMark == LookForMyCallersCaller) && !pData->bFoundCaller)
{
pData->bFoundCaller = TRUE;
return TRUE;
}
// 最多只检测 cCheck 帧
if (pData->cCheck >= 0)
{
if (pData->cCheck == 0)
{
pData->dwFlags |= CORSEC_STACKWALK_HALTED;
*pAction = SWA_ABORT;
return TRUE;
}
else
{
--(pData->cCheck);
}
}
return FALSE;
}
在跳过了这些无需处理的堆栈帧后,CodeAccessCheckStackWalkCB 函数将对 Assembly/AppDomain 变化,和显式指定安全对象的情况,进行 CAS 检测。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/
关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:[email protected] 电话:010-51297073
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:[email protected] 电话:010-51297073










