使用Windows服务进行数据执行保护

时间:2012-02-10 05:58:12

标签: c# windows service dep data-execution-prevention

我正在运行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关闭整个系统。

提前致谢。

1 个答案:

答案 0 :(得分:2)

找到解决方案。解决方案实际上是双重的。 首先是DEP,您需要关闭整个计算机,然后重新启动计算机(这是因为无法通过控制面板关闭Windows服务的DEP)。

然后,我使用“ProcessMonitor”应用程序来查看Windows服务和“MPIEst.dll”在幕后使用Windows操作系统做了什么。事实证明,DLL正在系统目录文件夹中搜索它所依赖的文件(client.mpi),即使该文件与Windows服务可执行文件位于同一目录中。 所以我添加了代码将必要的文件复制到系统目录中,一切正常。