Подтвердить что ты не робот

Можно ли сертифицировать настольное приложение Delphi для Windows 8 (с помощью набора сертификатов приложений Windows)?

По-видимому, Delphi (любая версия) не поддерживает безопасные обработчики исключений (/переключатель SAFESEH в Visual Studio). Это приводит к предупреждению при использовании пакета сертификации Windows Desktop App для Windows 8. В требования к сертификации для настольных приложений Windows 8:

Ваше приложение должно быть скомпилировано с использованием флага /SafeSEH для обеспечения безопасной обработки исключений

Очевидно, Delphi не имеет этого переключателя, поэтому это невозможно. Мои вопросы:

  • Насколько я понимаю, хотя в Kit отображается только предупреждение (не обязательно), так как это требование необходимо, любое приложение Delphi сегодня не может быть сертифицировано для Windows 8 и поэтому не может быть включено в хранилище приложений Windows?

  • Таблицы SafeSEH могут быть добавлены в PE файл после компиляции (например, извлечение необходимой информации из файла карты или символов отладки), или нам абсолютно необходима поддержка компилятора/компоновщика для этого, и поэтому необходимо подождать Embarcadero реализует эту функцию?

Чтобы очистить, мое приложение представляет собой 32-разрядное настольное приложение Windows (совместимое с 64-разрядной версией), а не приложение Metro.

4b9b3361

Ответ 1

Я не могу ответить на вопрос 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. Это означает, что для создания раздела SafeSEH PE вам необходимо найти все try/except в вашем коде. Хотя это, очевидно, возможно, я не думаю, что это сносно.

Я скорее предположил, что обработчики исключений SEH для компилятора x86 будут просто функциями _HandleXXX, объявленными в System.pas. В этом случае было бы легко добавить раздел PE, в котором перечислены только эти функции как шаг после ссылки. Однако, поскольку каждый try/except имеет свой собственный локальный обработчик исключений, теперь я считаю, что только автор компилятора может реально надеяться добавить раздел SafeSEH PE.

Есть, насколько я вижу, отчет о QC, который запрашивает поддержку SafeSEH для компилятора Windows x86. Я предлагаю вам зарегистрировать отчет о контроле качества и официальное подтверждение.

Обновление: Хорошо сделано для @haimg для успеха, когда я потерпел неудачу и сумел найти отчет QC: QС# 106781.