Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dos Mode: Message Warnung (https://www.delphipraxis.net/137999-dos-mode-message-warnung.html)

Aphton 1. Aug 2009 21:05


Dos Mode: Message Warnung
 
Hallo liebe Leute,

Ich würde gerne wissen, warum der Offset von dem Text, das angezeigt wird, wenn man eine Win32 Applikation in einem zB Dos Emulator ausführt, so komisch ist.

Der Text befindet sich in der Exe zwischen dem Dos Header und dem NT Header.

Code:
Hex Darstellung:
Begin Offset: $40
BA10000E1FB409CD21B8014CCD219090546869732070726F6772616D206D7573742062652072756E20756E6465722057696E33320D0A24370000000...0000
End Offset: $100

Ascii Darstellung:
´   Í!¸LÍ!This program must be run under Win32
$7
Wenn man das dissassembliert sieht man schön, das der $21 Interrupt mit AH = 9 ausgeführt wird:

Code:
mov edx, 0x1f0e0010
mov ah, 0x9
int 0x21
Warum ist hier jedoch EDX = $1f0e0010 ?
Bei mir befindet sich der Text zur Laufzeit bei $400040 - so wie sich das eben gehört.

Kann es sein, dass die Appliaktion im Dos Modus ganz anders geladen wird und somit der Offset auch ein ganz anderer ist?

MfG

[edit=Luckie]Zeilenlänge korrigiert. Mfg, Luckie[/edit]

SirThornberry 1. Aug 2009 23:07

Re: Dos Mode: Message Warnung
 
Unter Windows ist es so das man auf einem virtuellen Adressraum arbeitet. Die Basisadresse des virtuellen Adressraumes kann man in den Compiler-/Linkeroptionen angeben. Die virtuellen Adressräume sind dafür da, dass eine Anwendung nicht einfach so im Speicher von anderen rumschreibt und somit durch Fehler das gesamte System zu Absturz bringt. Unter Dos hingen sieht das anders aus. Da läuft immer nur eine Anwendung und somit war dort sowas nicht notwendig.

Aphton 1. Aug 2009 23:10

Re: Dos Mode: Message Warnung
 
Der erste Teil deiner Aussage war mir klar, der Zweite jedoch nicht.
Weißt du zufällig auch, wie ich die Adresse (vom Text) nun ermitteln kann?

MfG

himitsu 1. Aug 2009 23:41

Re: Dos Mode: Message Warnung
 
also da drinnen findest du einige Informationen
http://www.delphipraxis.net/internal...t.php?t=160791

Aphton 2. Aug 2009 00:22

Re: Dos Mode: Message Warnung
 
@Himitsu
Ne, leider nicht

MfG

himitsu 2. Aug 2009 07:20

Re: Dos Mode: Message Warnung
 
also da sieht man, wie der Dateiheader ausgelesen wird, und wie z.B. Adressen umgerechnet werden (siehe RVA2RealPointer für Win32) ...

jetzt mußt du dich nur vom IMAGE_DOS_HEADER zu den für dich wichtigen Infos durchkämpfen und alles auf deine DOS-Bedürfnisse abändern :zwinker:

Aphton 2. Aug 2009 08:21

Re: Dos Mode: Message Warnung
 
@Himitsu
Das tut alles leider nichts zur Sache :|
Dieser Teil befindet sich in keinem Header, sondern zwischen 2 Headers und zwar DOS & NT Header.
Lies bitte nochmal meinen ersten Beitrag durch

Danke bis jetzt

Die Frage ist leider immernoch offen

EDIT: Eventuell habe ich mich zu undeutig ausgedrück xD

Naja ich versuchs nochmal zu erklären:
Nach dem DOS Header, welcher $40 Byte groß ist, ist eine freie Stelle. Der NT Header fängt meist bei OFFSET $100 an.
DH man hat in diesem Fall $100 - $40 = $C0 freien Speicher zwischen dem DOS & NT Header.
Hier befindet sich der Code, welcher für die Warnmessage zuständig ist - führt man eine Win32 Applikation in Dos aus, so wird eben einem eine Message (siehe 1 Post) angezeigt.

Nun, die konkrete Frage war eben, warum der Offset von dem Text, das angezeigt werden soll, so komisch ist?!
Der kann sich doch nicht bei 0x1f0e0010 befinden? Wie komme ich auf die Adresse?
Und nein, im DOS Header sind keine nützlichen Infos zu diesem Offset gegeben.

MfG

turboPASCAL 2. Aug 2009 08:46

Re: Dos Mode: Message Warnung
 
Äh... damit die Kompatibilität zu MS-DOS (8-Bit etc.) gegeben ist ? :gruebel:
An dieser Stelle ist ja der MS-Dos-Exe-Header.


gefunden:
http://support.microsoft.com/kb/65122
http://www.i8086.de/dos-diskettenformate/exe-datei.html

thkerkmann 2. Aug 2009 08:48

Re: Dos Mode: Message Warnung
 
Hi,

Zitat:

Der kann sich doch nicht bei 0x1f0e0010 befinden? Wie komme ich auf die Adresse?
Hast Du berücksichtigt, dass unter DOS dies keine lineare Adresse ist, sondern sich in Segment und Offset aufteilt ?
Ich weiss jetzt nicht in welcher Reihenfolge, aber man muss wohl

0x1f0e:0x0010 (bzw. 0x0010:0x1f0e) als Seg:Ofs Paar sehen. Könnte das dann irgendwie hinhauen ?

Gruss

Aphton 2. Aug 2009 09:50

Re: Dos Mode: Message Warnung
 
@thkerkmann

Ähm das wusste ich nicht bzw habs nicht berücksichtig.
Hab mich da schnell erkundig ( http://www.bullhost.de/s/segment-off...essierung.html );
wenn ich die Berechnung durchführe komme ich nicht annähernderweise auf den Wert $400040 (hier beginnt der Dos-Stub, ein paar Bytes weiter befindet sich der Text).

Ich hab echt keine Ahnung, wie man jetzt diese Adresser ermittelt.
Wäre sie auch bei anderen Win32 Anwendungen mit gleicher ImageBase gleich, dann könnte ich sie als Konstante deklarieren, jedoch ist sie das nicht.
zZ gehe ich davon aus, dass in DOS die ganze Anwendung iwo anders hin geladen wird als wie es vorgesehen ist (ImageBase).

Danke für die bisherigen Mühen

Edit:
Ohhh ich habs raus.
Sorry für den obigen Assemblerextrakt, liebe Leute
Unabsichtlicherweise habe ich das mit 32Bit - anstatt mit 16Bit - dissassembliert

Ich hab das ganze nochmal mit Windows's Debug debugged und habe folgenden Output bekommen:
Code:
mov dx, 0x10 // nun wird mir alles klar :D hier befindet sich der Text xD
push cs
pop ds
mov ah, 0x09 // schreibe text
int 0x21
mov ax, 0x4c01 // terminiere
int 0x21
Sorry für die Unannehmlichkeiten :wall:

MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz