10.1. Das Programmdateiformat

Ausführbare DiceRTE-Programme, die von BIND2EXE erzeugt wurden, bestehen aus mehreren Komponenten, von denen die eigentliche Applikation nur ein Teil ist. Eine ausführbare DiceRTE-Programmdatei besitzt das folgende Format :

 

 
 

10.1.1. Startup-Code

Der Startup-Code ist der Programmteil, der die gesamte Initialisierung und Vorbereitung zur Ausführung der eigentlichen Applikation vornimmt. Im einzelnen werden folgende Schritte durchgeführt :

Als Betriebssysteme kommen MS-DOS ab Version 5.0, Windows 3.x (Standard- oder Erweiterter-Modus)/ 95 / 98 / ME / 2000 / NT 3.x/4.0 und OS/2 3.x/4.x in Frage. Unter MS-DOS können folgende Speichermanagertypen eingesetzt werden : XMS (z.B. HIMEM.SYS ohne EMM386.EXE), VCPI (z.B. EMM386.EXE), DPMI (bereits laufender Extender, siehe 10.1.2.DOS-Extender") oder INT15 (=BIOS) als Speichermanager. Alle anderen oben genannten Betriebssysteme besitzen bereits einen eingebauten DPMI-Host.
 
Als Minimum ist ein 80386- oder kompatibler Prozessor zwingend erforderlich. Nach oben sind keine Grenzen gesetzt, solange die CPU 80386-kompatibel ist.
 
Wurde kein bereits laufender DPMI-Host gefunden, wird der DOS-Extender mit eigener DPMI-Schnittstelle initialisiert.
 
Die Umschaltung in den Protected Mode geschieht über einen standardisierten Funktionsaufruf über den DPMI-Host und durch das Anlegen von 32Bit-Segmentbeschreibern.
 
Als Minimum werden 2MB erweiterter Speicher benötigt, um die benötigten Tabellen zu installieren. Wieviel darüber hinaus gebraucht wird, hängt vom Speicherbedarf der Applikation und der DLLs ab. Ist nicht genug Speicher verfügbar, bricht der Startup-Code an dieser Stelle ab.
 
Nachdem die Applikation mit allen DLLs vorbereitet wurde, wird Sie vom Startup-Code ausgeführt. Dazu werden vorher die beiden Register EAX und EDX mit Zeigern auf den Namen der Programmdatei und den String mit den Kommandozeilenparametern gefüllt. Der Start des Programms geschieht über einen FAR-Sprung mit Segment und 32Bit-Offset. Das aufgerufene Programm muß die Ausführung daher mit einem FAR-Return an den Startup-Code zurückgeben.
 
  • DLL-Module entfernen
  • Nach Beendigung der Applikation werden die 'DllExit'-Funktionen der einzelnen DLLs aufgerufen und diese danach aus dem Speicher entfernt.
     

    10.1.2. DOS-Extender

    Zu den Aufgaben des DOS-Extenders zählt hauptsächlich die Verwaltung der Interrupts und des Speichers. Zur Herstellung einer Schnittstelle zwischen einer Applikation und dem DOS-Extender wurde das DPMI (DOS Protected Mode Interface) in der Version 0.9 herangezogen, um so Kompatibilität zu anderen DOS-Extendern zu wahren. Das DPMI ist eine vom DPMI-Kommitee genormte Schnittstelle, die einem DPMI-Client (einer Applikation) bestimmte Funktionen durch einen DPMI-Host (dem DOS-Extender) zur Verfügung stellt. Dazu gehören Funktionen zur Speicher-, Interrupt- und Deskriptorenverwaltung sowie Funktionen zur Umschaltung zwischen Protected- und Real Mode sowie Ausführung von Routinen im Protected- und Real Mode. Zum genauen Studium der einzelnen DPMI-Funktionen konsultieren Sie bitte die entsprechende Dokumentation.
     

    10.1.3. Modulverzeichnis

    Hinter dem Startup-Code und dem DOS-Extender befindet sich das Modulverzeichnis. Es enthält Informationen über den Namen, Offset, Typ und die Größe der einzelnen integrierten Module. Vor dem eigentlichen Modulverzeichnis ist ein Dword, das die Länge des Verzeichnisses enthält. Jeder Eintrag im folgenden Modulverzeichnis umfaßt 32 Bytes :

    Offset Typ Bedeutung
    +0 BYTE[16] Name des Moduls
    +16 DWORD physikalischer Offset des Moduls in Programmdatei
    +20 DWORD physikalische Größe des Moduls in Programmdatei
    +24 BYTE Modultyp (1:Applikation, 0:DLL)
    +25 BYTE[3] reserviert
    +28 DWORD reserviert

     
    10.1.4. Module

    Hinter dem Modulverzeichnis befinden sich die einzelnen Module. Neben der eigentlichen Applikation können bis zu 64 weitere Module/DLLs in die Programmdatei integriert werden. Dadurch ist es möglich, die Applikation fest an bestimmte DLLs zu binden.

    Jedes einzelne Modul besteht aus einem Kopfsatz, einer Objekttabelle und einigen Objektimages. Das Format der einzelnen Module entspricht im Prinzip den vom Linker erzeugten PE-Programmdateien, aus denen BIND2EXE diese DiceRTE-Programmdatei erstellt hat. Der Kopfsatz umfaßt hier allerdings 256 statt 248 Bytes. Die ersten 200 Bytes sind identisch mit dem Kopfsatz der ursprünglichen PE-Programmdatei. Dahinter folgt ein DWORD, das die Größe des DOS-Teils der PE-Programmdatei enthält. Die restlichen 52 Bytes sind für spätere Erweiterungen reserviert.

    Hinter dem Kopfsatz folgt die Objekttabelle. Sie wurde 1:1 aus der PE-Programmdatei entnommen, genau wie die dahinter folgenden Objektimages.