使用Windows服务防止数据执行
本文关键字:数据 执行 Windows 服务 使用 | 更新日期: 2023-09-27 18:24:12
我运行的是Windows 7 Ultimate 64位。
我有一个windows服务(用C#编写),它调用南非一家主要电信服务提供商(TELKOM)发布的dll。dll名为MPIEst.dll,我相信它是用C++编写的。链接上的那个人(http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/a7e5aafc-bb52-42c3-a3b7-19cb4cfbf6d5/)有点和我一样的问题。
在做了一些研究后,我发现DEP(数据执行保护)是错误"无法加载DLL‘MPIest.DLL’:对内存位置的无效访问。(HRESULT:0x800703E6的异常)"的罪魁祸首。所以我想"好吧,这很容易……让我们关闭整个计算机的DEP,看看会发生什么"。所以我这样做,结果变得更奇怪。。。windows服务成功运行,就像什么都没发生一样,但所有对DLL的调用都没有做任何事情。
我之所以知道这一点,是因为当我编写一个使用DLL的普通C#控制台应用程序时,DLL方法返回值并正常工作,但当从windows服务中运行时,DLL方式返回非零结果,这表明出现了问题。问题是没有任何文档说明返回代码的含义。
总之,底线是,以某种方式关闭整个系统的DEP不会影响windows服务。以前有人遇到过这种情况吗?windows服务和控制台应用程序调用完全相同的代码,做完全相同的事情,但控制台应用程序工作正常,而windows服务则默默地什么都不做,但整个系统的DEP都关闭了。
提前谢谢。
找到了解决方案。解决方案实际上有两个方面。首先是DEP,您需要关闭整个计算机的DEP,然后重新启动计算机(这是因为无法通过控制面板关闭windows服务的DEP)。
其次,我使用"ProcessMonitor"应用程序来查看windows服务和"MPIEst.dll"在幕后对windows操作系统做了什么。事实证明,DLL正在系统目录文件夹中搜索它所依赖的文件(client.mpi),尽管该文件与windows服务可执行文件在同一目录中。所以我添加了代码,将必要的文件复制到系统目录中,一切都正常了。