Рекомендуемые настройки заголовка PE для приложения Delphi 7, работающего на сервере терминалов?

При исследовании ошибок внешнего исключения C0000006, о которых сообщают некоторые пользователи, запускающие приложение Delphi 7 на терминальном сервере Windows 2008, я уже нашел несколько вопросов по этой и другим связанным с ней проблемам. Мне интересно, есть ли у кого-нибудь окончательный список этих настроек, которые подходят для стандартного приложения базы данных Delphi 7, работающего на терминальном сервере.

Я рассмотрел следующие вопросы:

Пока я не читал их, думаю, мне следует добавить в файл .dpr следующее:

const
  IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = $8000;
  // Following are already defined in D7's Windows.pas
  IMAGE_FILE_RELOCS_STRIPPED               = $0001;
  IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP       = $0400;
  IMAGE_FILE_NET_RUN_FROM_SWAP             = $0800;

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}

{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED 
  or IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 
  or IMAGE_FILE_NET_RUN_FROM_SWAP}

Изменить. Удалять раздел о перемещении, вероятно, не нужно, поэтому вот исправленная версия:

const
  IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = $8000;
  // Following are already defined in D7's Windows.pas
  IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP       = $0400;
  IMAGE_FILE_NET_RUN_FROM_SWAP             = $0800;

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}

{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 
  or IMAGE_FILE_NET_RUN_FROM_SWAP}

person dougwoodrow    schedule 17.01.2013    source источник
comment
Главный из них - флаг TSAWARE. Я не уверен, зачем вам IMAGE_FILE_RELOCS_STRIPPED - вы комбинируете это с stripreloc, потому что хотите уменьшить EXE? Почему это должно быть специфическим для терминального сервера?   -  person Warren P    schedule 17.01.2013
comment
@Warren: Хороший момент, это не относится к терминальным службам, но да, уменьшение размера EXE показалось мне хорошим делом. Есть ли причина НЕ удалять раздел о перемещении?   -  person dougwoodrow    schedule 18.01.2013
comment
Вы запрещаете Windows перемещать исполняемый файл, что в операционной системе NT представляет меньшую проблему, чем в старых системах Win95 / 98. Я в основном думаю об этом как о том, что вы должны делать только в том случае, если вы ДОЛЖНЫ это делать. Для установщиков это имеет смысл. Для обычного приложения это всего лишь еще одна вещь, которая может быть частью цепочки зла. В эпоху терабайтных жестких дисков мне кажется странным, что кого-то волнует, будет ли EXE на 2 мегабайта больше, если лечение включает запуск инструмента с закрытым исходным кодом, который изменяет то, что построил мой компоновщик. Другими словами, кому вы доверяете.   -  person Warren P    schedule 18.01.2013
comment
Согласно Джордану Расселу, в разделе перемещения фактически нет необходимости, поскольку EXE-файлы никогда не перемещаются. Но я принимаю вашу точку зрения, оставление раздела о перемещении вряд ли вызовет какие-либо проблемы.   -  person dougwoodrow    schedule 18.01.2013
comment
Вы можете безопасно удалить таблицу перемещения для exe   -  person David Heffernan    schedule 10.06.2013
comment
Для полноты картины заявление Дэвида верно даже для Windows 9x. Причина в том, что EXE всегда является первым модулем, который загружается загрузчиком в область памяти нового процесса, за исключением пары общих предварительно загруженных модулей ОС, таких как kernel32.dll, которые всегда загружаются с высокой скоростью. адрес. Это означает, что всегда доступен адрес загрузки по умолчанию 0x400000, поэтому у ОС никогда не будет причин перемещать образ EXE.   -  person 500 - Internal Server Error    schedule 16.01.2014
comment
@ 500: Спасибо, это хорошо.   -  person dougwoodrow    schedule 17.01.2014
comment
Просто ключевое слово: ASLR   -  person chksr    schedule 23.01.2018
comment
@chksr: да, но ASLR не поддерживался в версиях Delphi до Delphi 2007, AFAIK. community.embarcadero.com/blogs/entry/   -  person dougwoodrow    schedule 02.06.2021


Ответы (1)


{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_ SERVER_AWARE}
{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED   
  or IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   
  or IMAGE_FILE_NET_RUN_FROM_SWAP}

подходит для ваших нужд. Я подозреваю, что IMAGE_FILE_NET_RUN_FROM_SWAP - это то, что вам нужно, чтобы иметь дело с C0000006. Эта ошибка обычно возникает, когда вы запускаете с сетевого диска, и диск не может удовлетворить страницу в запросе исполняемого файла.

В любом случае вам подойдут другие флаги PE. Я бы хотел, как ты.

Что касается того, правильно ли IMAGE_DLLCHARACTERISTICS_TERMINAL_ SERVER_AWARE, только вы знаете. Соответствует ли ваше приложение требованиям, чтобы считаться устаревшим приложением для служб терминалов, например задокументировано в MSDN? Если это так, используйте IMAGE_DLLCHARACTERISTICS_TERMINAL_ SERVER_AWARE.

person David Heffernan    schedule 15.01.2014
comment
Спасибо, Дэвид, и хороший отзыв о настройке / TSAWARE. У меня не было отчетов об ошибках C0000006 с момента введения этих настроек. - person dougwoodrow; 17.01.2014