.EXE
.EXE (zkr. anglicky executable - executable) - rozšíření spustitelných souborů používaných v operačních systémech DOS , Windows , Symbian OS , OS / 2 a v některých dalších, odpovídající řadě formátů . Kromě objektového kódu může obsahovat různá metadata ( zdroje , digitální podpis [1] ).
Formáty .EXE
- MZ je 16bitový formát, hlavní formát souboru DOS .EXE .
- Soubory EXE pro Windows a OS / 2 používají různé formáty pro hlavní část programu , ale stále začínají útržkem ve formátu MZ, který při pokusu zpravidla zobrazuje zprávu „Tento program nelze spustit v režimu DOS“ spustit soubor v DOSThis program cannot be run in DOS mode. ) a ukončí provádění, i když by teoreticky mohl spustit nějaký libovolný kód DOS.
- NE je 16bitový formát používaný Windows 3.x [2] , OS/2 a MS-DOS .
- LE je smíšený 16bitový a 32bitový formát dříve používaný OS/2 a Windows (VxD).
- LX je 32bitový formát používaný OS/2.
- PE je 32bitový a 64bitový formát používaný v moderních verzích Windows, počínaje Windows NT a Windows 95 .
Struktura souboru
Soubor EXE vygenerovaný linkerem se skládá ze dvou částí:
- řídicí informace pro bootloader;
- nakládací modul.
Informace pro zavaděč, popsané níže, se nacházejí na začátku souboru a tvoří tzv. hlavičku . Hned za ním následuje tělo zaváděcího modulu, což je kopie paměťového obrazu úlohy sestavené linkerem.
Standardní část záhlaví má následující formát [3] :
00-01 4D5A - podpis souboru .EXE;
02-03 Délka obrazu úlohy modulo 512 (to znamená počet užitečných bajtů v posledním bloku). Linkery před 1.10 vkládají do tohoto pole 04; pokud má takovou hodnotu, doporučuje se ji ignorovat);
04-05 Délka souboru v blocích;
06-07 Počet záznamů v tabulce nastavení adresy;
08-09 Délka záhlaví v 16bajtových odstavcích. Slouží ke zjištění začátku tělesa zátěžového modulu;
0A-0B Minimální množství paměti, které má být přiděleno po skončení obrazu úlohy (v 16bajtových odstavcích);
0C-0D Maximální množství paměti, které má být přiděleno po skončení obrazu úlohy (v 16bajtových odstavcích);
0E-0F Adresa segmentu začátku segmentu zásobníku vzhledem k začátku obrázku úlohy;
10-11 SP hodnota při zadávání úlohy;
12-13
Kontrolní součet - nula mínus výsledek sčítání bez přenosu všech slov souboru;
14-15 Hodnota IP
(počítadlo příkazů) při zadávání úkolu;
16-17 Adresa segmentu začátku segmentu kódu vzhledem k začátku obrázku úlohy;
18-19 Adresa prvního prvku tabulky nastavení adresy vzhledem k začátku souboru;
1A-1B Číslo segmentu překrytí (0 pro kořenový segment programu).
Následuje tabulka nastavení adresy. Tabulka se skládá z prvků, jejichž počet je zapsán v bajtech 06-07. Záznam tabulky nastavení se skládá ze dvou polí, 2bajtového offsetu a 2bajtového segmentu, a specifikuje slovo v zaváděcím modulu obsahující adresu, která má být nastavena na paměťové místo, kde je úloha načtena. Nastavení je následující:
- Prefix programového segmentu (PSP) je zabudován do oblasti paměti za rezidentní částí načítacího programu ;
- Standardní část hlavičky se načte do paměti;
- Je určena délka těla zaváděcího modulu (rozdíl mezi délkou souboru 04-07 a délkou hlavičky 08-09 plus počet bajtů v posledním bloku 02-03). V závislosti na znaménku označujícím načtení úlohy na konec paměti nebo na začátek se určí adresa segmentu pro načtení. Tento segment se nazývá počáteční segment ;
- Zatěžovací modul je načten do počátečního segmentu;
- Ladicí tabulka je načtena do pracovní paměti v dávkách;
- Pro každý záznam v tabulce nastavení se do pole segmentu přidá adresa segmentu počátečního segmentu. V důsledku toho záznam tabulky ukazuje na slovo v paměti, ke kterému je přidána adresa segmentu počátečního segmentu;
- Při zpracování tabulky nastavení adresy se hodnoty zadané v záhlaví zapíší do registrů SS a SP a adresa segmentu počátečního segmentu se přidá do SS. Adresa segmentu začátku PSP je zapsána do ES a DS. Řízení se přenese na adresu uvedenou v záhlaví (bajty 14-17).
Struktura segmentu programu
Při přístupu k nerezidentnímu příkazu nebo volání programu pomocí operace Exec určí DOS minimální adresu, ze které lze načíst odpovídající program. Tato oblast se nazývá programový segment.
Při offsetu 0000 v programovém segmentu generuje DOS předponu programového segmentu (PSP) . Samotný program se načte s offsetem 0100.
Program je ukončen skokem na adresu 0000 v programovém segmentu provedením INT 20, nebo provedením INT 21 s AH=0 nebo AH=4C, nebo voláním podprogramu na adrese 0050 v programovém segmentu s AH=0 nebo AH. = 4C.
Poznámka: při ukončení jinak než operací 4C musí program nejprve odeslat CS adresu začátku svého programového segmentu.
Všechny čtyři metody vrátí řízení do rezidentní části COMMAND.COM (v tomto případě operace 4C odešle ukončovací kód). Všechny čtyři metody způsobí, že program, který zavolal operaci Exec (4B), bude pokračovat v provádění. V tomto případě jsou vektory přerušení 22, 23 a 24 (ukončení, Ctrl-Break, fatální chyba výměny) obnoveny z prefixu programového segmentu obnovitelné úlohy. Poté se řízení přenese na koncovou adresu. Pokud se program vrátí do COMMAND.COM, pak se řízení přenese na nerezidentní část. Pokud k tomu dojde, když je dávkový soubor spuštěn, pokračuje, jinak COMMAND vyzve terminál a čeká na zadání dalšího příkazu.
Když načtený program převezme kontrolu, platí následující podmínky:
Pro všechny programy:
- Adresa média je přenášena v prefixu programového segmentu na offsetu 2C. Prostředí je posloupnost řetězců ASCIIZ ve tvaru parametr=hodnota. Celková délka řetězců prostředí není větší než 32 KB; Středa začíná na hranici odstavce. Za posledním řádkem následuje prázdný bajt. Prostředí předané úloze příkazem COMMAND obsahuje alespoň parametr COMSPEC= (hodnota tohoto parametru je úplný název souboru obsahujícího COMMAND.COM , který se má použít ). Obsahuje také hodnoty nastavené příkazy PATH, PROMPT a SET. Předávané prostředí je kopií prostředí nadřazeného procesu. Pokud úloha zůstane rezidentní, pak následující příkazy PATH, PROMPT a SET neovlivní její prostředí.
- Na offsetu 0050 obsahuje předpona segmentu programu program pro volání operací DOS. Vložením čísla operace do AH tedy program může volat procedury (LCALL) na PSP + 50 a nepřistupovat k přerušení 21.
- Adresa vyrovnávací paměti DTA je nastavena na PSP +80.
- Řídicí bloky souboru umístěné na offsetech 5C a 6C v prefixu segmentu programu se vyplňují podle parametrů příkazového řádku . V tomto případě, pokud odpovídající parametr obsahuje název adresáře, je do FCB zadán pouze kód zařízení, název souboru je vytvořen nesprávně.
- Neformátovaná část, začínající odsazením 81, obsahuje znaky příkazového řádku za názvem příkazu, včetně všech mezer a oddělovačů. Délka tohoto řetězce je umístěna v offsetu 80. Pokud příkazový řádek obsahuje možnosti přesměrování (jsou označeny symboly > a <), nejsou zde zahrnuty, protože přesměrování je pro programy transparentní.
- Word na offsetu 6 obsahuje počet bajtů v tomto segmentu.
- Registr AX ukazuje, zda jsou názvy zařízení v parametrech správné:
- AL = FF - název zařízení pro první parametr je nastaven špatně, jinak AL = 00;
- AH = FF - Název zařízení pro první parametr je nesprávný, jinak AH = 00.
Pro programy .EXE:
- DS a ES označují začátek předpony segmentu programu.
- Registry CS, IP, SS a SP získají hodnoty určené linkerem .
Pro programy .COM:
- Všechny čtyři segmentové registry ukazují na předponu segmentu programu.
- Veškerá volná paměť je přidělena programu. Pokud program spouští jiné programy pomocí operace Exec, pak pro něj musí uvolnit paměť operací Setblock (4A)
- Čítač příkazů IP je nastaven na 0100H.
- Registr SP označuje konec programového segmentu. Délka segmentu v místě předpony 6 je zmenšena o 0100H, aby se vytvořil prostor pro zásobník této velikosti.
- Nulové slovo je umístěno v horní části zásobníku.
Poznámky
- ↑ Windows Authenticode Portable Executable Signature Format (anglicky) (nepřístupný odkaz) . Získáno 11. prosince 2009. Archivováno z originálu 1. března 2012.
- ↑ Jak otevřít .DLL nebo .EXE soubor v Resource Editoru (anglicky) (downlink) . Získáno 11. prosince 2009. Archivováno z originálu 1. března 2012.
- ↑ Načtěte programy Windows z příkazového řádku DOS pomocí WINSTART // PC Mag. - č. 30. června 1992 .
Odkazy