使用Outlook对象模型时触发Control Flow Guard异常的问题求助
问题背景
多个客户在将Outlook升级至11月9日发布的更新版本后出现崩溃现象,涉及至少两个更新频道:
- 月度企业版2209(版本号15629.20258)
- 半年企业版2202(版本号14931.20806)
目前处于根因排查阶段,已收集到如下相关数据。
错误日志信息
事件查看器记录
故障应用程序名称: OUTLOOK.EXE,版本: 16.0.15629.20258,时间戳: 0x63603097
故障模块名称: ucrtbase.dll,版本: 10.0.19041.789,时间戳: 0x2bd748bf
注:部分崩溃案例中,故障模块为ntdll.dll而非ucrtbase.dll
崩溃转储异常信息
Unhandled exception at 0x00007FFF720BC67F (ntdll.dll) in OUTLOOK.EXE.7468.dmp: Indirect call guard check detected invalid control transfer.
触发崩溃的代码片段
从客户转储文件中发现,崩溃触发点为看似普通的变量赋值或类型转换代码:
Dim propertyAccessor As Microsoft.Office.Interop.Outlook.PropertyAccessor = mail.PropertyAccessor
以及
Dim mail As Microsoft.Office.Interop.Outlook.MailItem = TryCast(item, Microsoft.Office.Interop.Outlook._MailItem)
调用栈信息
所有崩溃案例的调用栈均显示,代码由Add-in Express相关方法触发:
AddinExpress.MSO.2005.dll!AddinExpress.MSO.ADXOutlookAppEvents.DoExplorerSelectionChange(object explorer)
AddinExpress.MSO.2005.dll!AddinExpress.MSO.ADXAddinModule.OlExplorerEvents_10_SinkHelper.AddinExpress.MSO.IExplorerEvents_10.SelectionChange()
疑问
- 为何看似无关紧要的变量赋值或
TryCast操作会触发Control Flow Guard(控制流保护)异常? - 有哪些具体步骤可进一步排查该问题的根因?
内容的提问来源于stack exchange,提问作者Corith Malin

