【问题标题】:CEF (Chromium Embedded Framework) vs DEP (Data Execution Prevention)CEF(Chromium 嵌入式框架)与 DEP(数据执行保护)
【发布时间】:2014-01-21 11:17:48
【问题描述】:

我在 Delphi 7 中使用 DCEF3 (https://code.google.com/p/dcef3/)。

嵌入 DCEF 的 CEF 版本是 3.1547.1412。

问题

在装有 Windows 2008 R2 的机器上,有时当我的应用程序加载时,它会因 BEX 类型的事件而崩溃。

我只能解决崩溃在 Windows 上停用 DEP,为此我使用了提示命令:

bdcedit /set nx AlwaysOff

但这不可能是解决方案。

我不能强迫我的用户在他们的服务器上禁用 DEP。

这是 APPCRASH 报告(葡萄牙语):

    Assinatura do problema:
      Nome do Evento de Problema:         BEX
      Nome do Aplicativo:                          MyExecutable.exe
      Versão do Aplicativo:                         1.1.0.1
      Carimbo de Data/Hora do Aplicativo:            2a425e19
      Nome do Módulo de Falhas:            dhcpcsvc6.DLL
      Versão do Módulo de Falhas:           6.1.7601.17970
      Carimbo de Data/Hora do Módulo de Falhas:              50745f7c
      Deslocamento de Exceção:               00001730
      Código de Exceção:                            c0000005
      Dados de Exceção:                             00000008
      Versão do sistema operacional:        6.1.7601.2.1.0.18.10
      Identificação da Localidade:             1046
      Informações Adicionais 1:                 a7aa
      Informações Adicionais 2:                 a7aa91f17ea749d42a4de3b390fa5b3d
      Informações Adicionais 3:                 a7aa
      Informações Adicionais 4:                 a7aa91f17ea749d42a4de3b390fa5b3d

谁能帮我找到问题的根源或一些关于为什么会发生这种情况的信息?

【问题讨论】:

  • 你能用一个嵌入 Chromium 的小型测试应用来重现这个吗?如果是这样,这里的人会更容易回答。您的大型应用程序可能正在做许多与 CEF 交互不良的事情。您正在寻找 SSCCE,这在您嵌入组件时可能会很困难,但请尽力而为。
  • 还有this article indicates that SysUtils in Delphi 7 can trigger DEP,需要升级到D2005或更高版本才能修复。 (但是,这篇文章确实链接到了一个补丁。)Delphi 7 非常古老,所以它在发布后编写的 Windows 版本上不可接受的东西也就不足为奇了。我对任何使用 D7 的人的标准建议是无论如何都要升级 :)
  • @David:这个问题在我嵌入 CEF 后开始发生,我无法迁移到较新的 delphi。我将尝试创建一个测试应用程序,但我不保证我会重现该问题..

标签: delphi delphi-7 chromium-embedded dep


【解决方案1】:

在 cmets 中,您可以通过调用 SetProcessDEPPolicy 链接到 forum that explains that Chromium intentionally enables data execution preventionDEP is known to interfere with Delphi 7. 鉴于此,我看到了三种解决方案(按偏好降序排列):

  1. 升级到不到十年的 Delphi 版本。您将获得可识别 DEP 的 RTL。
  2. 论坛中提到,自己编译Chromium,排除DEP相关代码。您可以这样做,例如,通过编辑 ApplyProcessMitigationsToCurrentProcess in process_mitigations.cc 使其忽略 MITIGATION_DEPMITIGATION_DEP_NO_ATL_THUNK 标志。
  3. 运行bcdedit,正如您已经找到的那样。当您这样做时,您会在操作系统级别禁用 DEP,这会迫使 Chromium 对 SetProcessDEPPolicy 的调用失败。

【讨论】:

  • (6 年后..)所以,我有一个类似的问题,但有一个不同的问题子遗留 DLL。我尝试了您的建议,即在删除 DEP 代码的情况下重新编译 Chrome。问题是,您在上面确定的代码并未作为 CEF 的一部分提供。唯一发布的 Chromium dll 似乎是 chrome_elf.dll。上面标识的代码被编译成 sandbox.dll。除非,然后以某种方式将其合并到一个 CEF 库中,否则这似乎是一条死胡同。
【解决方案2】:

根据这篇文章:

我添加了以下指令以将 TSAWARE 信息添加到标题中:

{$SETPEOPTFLAGS $8000}

经过一些详尽的测试,问题停止了。

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多