【问题标题】:Data Execution Prevention with Windows ServicesWindows 服务的数据执行保护
【发布时间】:2012-02-10 05:58:11
【问题描述】:

我正在运行 Windows 7 Ultimate 64 位。

我有一个 Windows 服务(用 C# 编写)调用一个 dll,该 dll 由南非的一家主要电信服务提供商 (TELKOM) 发布。该 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 已关闭。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    找到了解决方案。解决方案实际上是双重的。 首先是DEP,需要对整个电脑关闭,然后重启电脑(这是因为不能通过控制面板关闭windows服务的DEP)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2010-11-14
      相关资源
      最近更新 更多