delphi - 桌面 Delphi 应用程序是否可以通过 Windows 8 认证(使用 Windows 应用程序认证套件)?

标签 delphi windows-8 app-certification-kit wack

显然,Delphi(任何版本)does not support safe exception handlers (Visual Studio 中的/SAFESEH 开关)。在 Windows 8 上使用 Windows 桌面应用程序认证套件时,这会导致警告。根据 certification requirements对于 Windows 8 桌面应用程序:

Your app must be compiled using the /SafeSEH flag to ensure safe exceptions handling

显然Delphi缺少这个开关,所以无法做到。我的问题是:

  1. 我的理解是否正确,即使该套件仅显示警告(而不是失败),但由于这是“必须”要求,目前任何 Delphi 应用程序都无法通过 Windows 8 认证,因此不能包含在Windows 应用商店?

  2. 是否可以在编译后以某种方式将 SafeSEH 表添加到 PE 文件中(例如,从映射文件或调试符号中提取所需的信息),或者我们绝对需要编译器/链接器对此支持,因此必须等到Embarcadero 实现了这个功能吗?

需要澄清的是,我的应用程序是 Windows 32 位桌面应用程序(64 位兼容),不是 Metro 应用程序

最佳答案

我无法回答问题 1。但是,我很难想象使用“必须”一词可能意味着该规则是可选的。

对于问题2,您需要编译器/链接器的支持。您不能合理地期望使用 PE 编辑后链接工具来恢复它。考虑以下代码:

try
  Beep;
except
  on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
end;

编译器发出以下内容:

Project1.dpr.11: try
0041C3AA 33C0             xor eax,eax
0041C3AC 55               push ebp
0041C3AD 68C9C34100       push $0041c3c9 // exception handler is at $0041c3c9
0041C3B2 64FF30           push dword ptr fs:[eax]
0041C3B5 648920           mov fs:[eax],esp
Project1.dpr.12: Beep;
0041C3B8 6A00             push $00
0041C3BA E8E1CEFEFF       call MessageBeep
0041C3BF 33C0             xor eax,eax
0041C3C1 5A               pop edx
0041C3C2 59               pop ecx
0041C3C3 59               pop ecx
0041C3C4 648910           mov fs:[eax],edx
0041C3C7 EB59             jmp $0041c422
0041C3C9 E97291FEFF       jmp @HandleOnException
0041C3CE 0100             add [eax],eax
0041C3D0 0000             add [eax],al
0041C3D2 E42F             in al,$2f
0041C3D4 41               inc ecx
0041C3D5 00DA             add dl,bl
0041C3D7 C3               ret 
0041C3D8 41               inc ecx
0041C3D9 00A3D83E4200     add [ebx+$00423ed8],ah
Project1.dpr.15: Writeln(E.ClassName, ': ', E.Message);
........

现在,真正的异常处理程序是 HandleOnException,在 System.pas 中实现。但是,压入堆栈的地址是 $0041c3c9,这是包含 try/except block 的代码的本地地址。这意味着为了创建 SafeSEH PE 部分,您需要找到代码中的每个 try/except。虽然这显然是可行的,但我认为它不容易处理。

我宁愿想象 x86 编译器的 SEH 异常处理程序只是在 System.pas 中声明的 _HandleXXX 函数。在这种情况下,添加仅列出这些函数的 PE 部分作为链接后步骤就很容易了。然而,由于每个 try/except 都有自己的本地异常处理程序,我现在相信只有编译器作者才能真正希望添加 SafeSEH PE 部分。

据我所知,没有任何 QC 报告要求 SafeSEH 支持 x86 Windows 编译器。我建议您记录质量控制报告和官方支持案例。

更新:@haimg 做得很好,成功完成了我失败的工作,并设法找到了 QC 报告: QC#106781 .

关于delphi - 桌面 Delphi 应用程序是否可以通过 Windows 8 认证(使用 Windows 应用程序认证套件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11733872/

相关文章:

windows-8 - Windows 8 应用程序证书工具包不再运行?

visual-studio - 如何修复 win 8 认证报告中的 Debug App Check

c# - 在 WinRT 中,PropertyChangedCallback 在 OnApplyTemplate 之前调用

free pascal 中的 Python+Numpy 模块

arrays - Delphi将动态记录数组传递给函数

json - 如何检查 SuperObject 中是否存在特定元素?

javascript - 行为发生奇怪的变化 - Windows 8.1 中的 <textarea>

windows-8 - WinRT 应用程序可以在屏幕关闭时继续运行吗?

delphi - 64位Delphi桌面应用程序可以通过Windows 8.1认证吗

http - 如何使用 Synapse (Delphi) 发送 HTTP 数据并获得响应