DEP引起的DLL库函数调用失败

1          什么是DEP(数据执行保护)

根据微软官方定义:数据执行保护 (DEP) 是一种有助于防止您的计算机免受病毒和其他安全威胁破坏的安全功能。有害的程序可能会通过试图运行(也称为“执行”)计算机内存中为 Windows 和其他已授权程序保留的代码来攻击 Windows。这些类型的攻击可能会损害您的程序和文件。

DEP 可以通过监视程序以确保它们安全使用计算机内存,帮助保护您的计算机。如果 DEP 注意到计算机上的某个程序使用的内存不正确,则它将关闭该程序并通知您

2          DEP的设置界面

DEPWIN2003及之后的系统引入,是系统性能选项的一部分。“在计算机属性”配置页面中的“高级系统设置项”的“性能选项”,打开后界面如下。默认系统是不为其他应用程序启用DEP的,当然如果您系统安装时不小心选择了第二个选项,则所有的应用程序均在DEP保护范围内。

 

VS2010VC链接器配置里,我们也可以发现数据执行保护项,默认是被选择的,这样您写的小程序也就被DEP保护了。

 

3          DEP导致的不兼容问题现象

一般情况下,保护给人的感觉总是不错的,然而,就是这默认的DEP,在我调用第三方的DLL库时引发了莫名的错误,我的环境是操作系统Windows 2003 server版,编译环境VS2005,使用的是NI Spectral Measurements 2.0 CVI的库,在别的机器上运行都比较正常,唯独在一台新装的Win2003系统上死活不能运行。跟踪问题,发现总是在库函数调用时弹出错误,信息如下:

TestSmt.exe 中的 0x7fc0c5f1 处最可能的异常: 0xC0000005: Access violation

TestSmt.exe 中的 0x7fc0c5f1 处有未经处理的异常: 0xC0000005: Access violation

跟踪到汇编,显然是DLL函数入口就错了。

这下难了,我们没有smt库的源代码,不可能知道到底发生了什么,但是项目总得交,问题总得解决。折腾啊折腾,在无尽的折腾中,终于看到了一丝曙光

4          解决之道

为了彻底查找问题,我在WIN7系统上使用VS2010编写了如下的测试代码:

 

程序编译后,与上述问题现象一摸一样,这下我彻底傻了,难道SMT库在WIN7下也是不能运行的,在反复思考觉得没有这样的道理的同时,我对VC的编译链接选项作了部分改动,再次带着一颗充满期望的心情编译尝试时,奇迹终于发生了,一切都是那么的OK,如下图所示的界面简直就是我的美味佳肴啊!

原来都是DEP搞的鬼,知道了问题所在,就非常好办了,按照前面介绍的知识检查后,发现新系统DEP的配置选项竟然是第二项,这狗日的腾讯,是谁动了我的配置!!!

修改DEP,一切OK

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webmote

如果能帮到你,请支持下博主

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值