Препоръчителни настройки на 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 винаги е първият модул, който се зарежда в пространството на паметта на новия процес от товарача, с изключение на няколко споделени, предварително заредени OS модула, като 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