INTPAR.COM
==========

Kurzbeschreibung: TSR zum Anzeigen der Register bei Interruptaufrufen

Dieses speicherresidente Utility dient zum berwachen (fast)
beliebiger Interrupts und der Registerinhalte vor Eintritt in den
Interrupthandler mit INT und nach Verlassen durch IRET oder RETF zur
Laufzeit irgendwelcher Programme. Dazu klinkt sich das Programm in den
betreffenden Interruptvektor ein und registriert von nun an jeden
Aufruf dieses Interrupts. Es sollten mit INTPAR keine zeitkritischen
Interrupts berwacht werden, da dies mit Sicherheit einen System-
absturz verursachen wrde! Auch das berwachen z.B. der Funktion 4Ch
des Interrupts 21h (Terminate Process) funktioniert nur einmal, da der
Handler nicht mehr zum aufrufenden Programm zurckkehrt.

Die Nummer des zu berwachenden Interrupts und optional die in AH
bergebene Funktionsnummer knnen INTPAR beim Aufruf in der
Kommandozeile mitgeteilt werden:


  INTPAR i [f]        resident installieren
  INTPAR /U           wieder deinstallieren


Dabei gibt i die Nummer des Interrupts (hexadezimal 0...FF) an
und f die Funktionsnummer (ebenfalls hex 0...FF). Ohne Angabe der
Funktionsnummer werden alle Funktionen des Interrupts berwacht.
Um mehrere Interrupts zu berwachen, kann INTPAR entsprechend oft
installiert werden. Mit der Option /U besteht die Mglichkeit, das
jeweils zuletzt im Speicher befindliche INTPAR wieder zu
deinstallieren. Ein Aufruf ohne Parameter zeigt einen Hilfstext an.


Sobald der von INTPAR berwachte Interrupt (ggf. mit der angegebenen
Funktionsnummer in AH) aufgerufen wird, werden die aktuellen Register-
inhalte und die Prozessorflags in einem PopUp-Fenster angezeigt. Durch
Drcken von <CR> verschwindet das Fenster wieder und der Interrupt
wird aufgerufen. Nach Beendigung des Interrupthandlers meldet sich
INTPAR erneut und zeigt nun die Inhalte von Registern und Flags zum
Zeitpunkt des Austritts aus dem Handler. Wenn Sie jetzt <CR> drcken,
dann wird das Fenster geschlossen und die Ausfhrung des unterbroche-
nen Programms normal fortgesetzt (bis zum nchsten Interruptaufruf).
Sie knnen aber auch <ESC> drcken, was bewirkt, da INTPAR erneut
auf einen Tastendruck wartet. Allerdings verbleibt der Code dieser
Taste dann im Tastaturpuffer und kann vom unterbrochenen Programm
ausgewertet werden. Dies ist manchmal notwendig, um bestimmte Funk-
tionen im Programm abzubrechen, die den berwachten Interrupt in
einer Endlosschleife immer wieder aufrufen, bis eine bestimmte Taste
gedrckt wird (z.B. beim Durchsuchen der gesamten Festplatte nach
einer Zeichenkette, whrend Int 25h berwacht wird).


Whrend der Anzeige der Registerinhalte und der Flags haben Sie die
Mglichkeit, sich bestimmte Speicherbereiche zur Laufzeit des
unterbrochenen Programms anzusehen. Die Tastenkombination <ALT+I>
aktiviert dazu die Funktion "Inspect Memory", die Sie zuerst nach
einer Speicheradresse in Segment:Offset-Schreibweise fragt. Die
Adresse kann sowohl hexadezimale Werte als auch Registerbezeichnungen
enthalten. Fr den Segmentanteil knnen Sie z.B. die Register CS, DS,
ES oder SS angeben und fr den Offsetanteil die Register AX, BX, CX,
DX, SI, DI, BP, SP oder IP. So kann gezielt auf Speicherbereiche
positioniert werden, deren Adressen in den angezeigten Registern
enthalten sind.


Anwendungsbeispiel: Sie wollen wissen, welche Dateien von einem
bestimmten Anwendungsprogramm geffnet werden. Der Einfachheit halber
ist hier der DOS-Befehl TYPE unser "Anwendungsprogramm". Der zu
berwachende Interrupt ist Int 21h, Funktion 3Dh (Dateien ffnen):

D:\ >intpar 21 3d
INTPAR V3.00 (C) 1991-1992 Stefan Bion
Installed at Int 21h, Function 3Dh


Jetzt wird das "Anwendungsprogramm" gestartet:

D:\ >type mcb.a86

INTPAR meldet sich aus dem Hintergrund und zeigt die Registerinhalte
und Flags zum Zeitpunkt des Aufrufs von Interrupt 21h, Funktion 3Dh.
Die Adresse des Namens der zu ffnenden Datei wird der Funktion
blicherweise im Registerpaar DS:DX bergeben. Dieser Speicherbereich
soll nun angezeigt werden. Nach Bettigen von <ALT+I> geben Sie
also die Adresse DS:DX ein:


                   ͵INTPAR V3.00 (C) 1991-92 Stefan Bionͻ
                                                           
                    Call Parameters Int 21h, Function 3Dh  
                                                           
                    AX 3D20    BX 1283        Flags:       
                    CX 0020    DX 0B0E                     
                    BP 10B0    Fl 0246    - - 1 - 1 - 1 -  
                    IP 1270    CS 9000    O D I S Z A P C  
                    SI 1110    DS 135B                     
                    DI 1110    ES 9000    CR/ESC: Continue 
                    SP 10B0    SS 135B    ALT-I : Inspect  
                                          ͵Segm:Offsͻ  
                   ͺ             ͼ
  Eingabe der Speicheradresse DS:DX   ===>   ds:dx_     
 (Dateiname fr Int 21h, Funktion 3Dh)     ͼ


Daraufhin erscheint ein Hex/ASCII-Dumpfenster, das ab dem Beginn der
zuvor eingegebenen Adresse 256 Bytes des Speicherinhaltes anzeigt.
Der Name der geffneten Datei ist ganz am Anfang als ASCIIZ-String zu
erkennen:


͵Inspect Memoryͻ
                                                                   
 135B:0B0E  6D 63 62 2E 61 386D 24 65 5B 34 34  mcb.a86 36m$e[44 
 135B:0B1E  6D 24 70 20 24 676D 24 65 5B 33 37  m$p $g$e[0m$e[37 
                 :
                 :
 135B:0BEE  04 8C C8 D3 EF 030C 50 CB 5B B8 00    P. P[  
 135B:0BFE  00 50 B8 CA 06 50A0 80 00 32 E4 B1   P PP 2 
                                                                   
 Scroll:  <PgUp> <PgDn>  <Arrew Address:  <ALT-A>    End:  <ESC> 
ͼ

(Abb.: Ausschnitt aus der "Inspect-Memory"-Box)



Eine weitere Mglichkeit ist der Einsatz von INTPAR als Breakpoint-
Utility. Wenn Sie in Assembler programmieren, dann knnen Sie in Ihr
Programm an beliebiger Stelle Haltepunkte einbauen, bis zu denen das
Programm in normaler Geschwindigkeit abluft und dann anhlt. Nun
knnen Sie Register- oder Speicherinhalte prfen und sehen, was Ihr
Programm bis dahin so angestellt hat.

Ein Haltepunkt oder auch Breakpoint besteht aus dem 1-Byte-Befehl
INT 3 (Opcode 0CCh). Der Vektor des Interrupt 3 zeigt normalerweise
auf ein IRET, so da ein entsprechender Interruptaufruf ohne sichtbare
Wirkung bleibt. Debugger benutzen Breakpoints dazu, das Programm bis
zu einer bestimmten Adresse ausfhren zu lassen und dann wieder selbst
die Kontrolle zu bernehmen. Dazu verbiegen sie diesen Vektor und
ersetzen das Byte hinter der Zieladresse durch den Opcode von INT 3.
Sobald die Programmausfhrung dort angelangt ist, verzweigt der
Prozessor zu der im Int-3-Vektor eingetragenen Adresse. Anschlieend
mu natrlich das Original-Byte wiederhergestellt werden.

Manche Programme laufen aber in einer Debugger-Umgebung nicht normal
ab, z.B. dann nicht, wenn der Programm-Code nicht einfach durch will-
krliches Setzen von Breakpoints durch den Debugger verndert werden
darf, oder wenn Sie mit dem Prozessor-Cache arbeiten. Manchmal ist es
auch einfach zu umstndlich, das Programm in einen Debugger zu laden
und die Adresse ausfindig zu machen, an der das Programm anhalten
soll. Benutzen Sie gar Mammut-Debugger wie TD, kann es vorkommen, da
fr Ihr eigentliches Programm gar nicht mehr genug Speicherplatz da
ist. Wenn Sie nur bestimmte Register- oder Speicherinhalte prfen
wollen, die zu einem bestimmten Zeitpunkt der Programmausfhrung
vorliegen, dann ist das manuelle Einbauen von Breakpoints vielleicht
sinnvoller. Setzen Sie dazu an den betreffende(n) Stelle(n) in Ihren
Assembler-Quelltext einfach den Befehl INT 3 ein und assemblieren Sie
das Programm neu. Rufen Sie dann INTPAR mit dem Parameter 3 auf und
starten Sie Ihr Programm. Bei jedem Erreichen eines Breakpoints meldet
sich INTPAR dann aus dem Hintergrund.
