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

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

根据微软官方定义:数据执行保护 (DEP) 是一种有助于防止您的计算机免受病毒和其他安全威胁破坏的安全功能。有害的程序可能会通过试图运行(也称为“执行”)计算机内存中为 Windows 和其他已授权程序保留的代码来攻击 Windows。这些类型的攻击可能会损害您的程序和文件。 DEP 可以通过监视程序以确保它们安全使用计算机内存,帮助保护您的计算机。如果 DEP 注意到计算机上的某个程序使用的内存不正确,则它将关闭该程序并通知您。 2 DEP的设置界面 DEP被WIN2003及之后的系统引入,是系统性能选项的一部分。“在计算机属性”配置页面中的“高级系统设置项”的“性能选项”,打开后界面如下。默认系统是不为其他应用程序启用DEP的,当然如果您系统安装时不小心选择了第二个选项,则所有的应用程序均在DEP保护范围内。

在VS2010的VC链接器配置里,我们也可以发现数据执行保护项,默认是被选择的,这样您写的小程序也就被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!嘿嘿,还记得上面DEP的承诺吗?则它将关闭该程序并通知您,关闭倒是关闭了,不知道怎么通知人的啊??



0 Comments

  1. 小谢

    谢谢您,您这篇文章给我救命了~!!!!

    Reply

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注