home *** CD-ROM | disk | FTP | other *** search
- Anleitung zu GETENV (c) 1/1996 Volker Oth
-
- GetEnv.pas dokumentierter TP-Quelltext
- Genv1024.pas Kilopack-Listing
-
- GetEnv verdeutlicht, wie man an das Environment von Command.com herankommt.
- Änderungen in diesem bleiben auch nach der Beendigung des Programmes
- erhalten: man kann also Umgebungsvariablen o.ä. bleibend setzen/verändern.
- Die Assemblerprozedur ermittelt einen Zeiger auf das Environment
- von Command.com sowie die Größe des Environments. Der Pascal-Teil gibt
- lediglich das Environment aus, damit das Programm überhaupt etwas macht.
-
- Die Adresse des PSPs erfährt man mit dem Interrupt 21h,AH=62h;
- Im PSP (Program Segment Prefix) kann man leicht den Environment-Block des
- laufenden Programms abfragen. Der PSP und das Environment sind aber bloß
- Kopien des PSPs und Environments von Command.com.
-
- PSP
- 00h Aufruf des Interrupt 20h (2 Bytes)
- 02h Endadresse des durch Programm belegten Speichers (nur Segment) (1 Word)
- 04h reserviert (1 Byte)
- 05h FAR-CALL zum Interrupt 21h (5 Bytes)
- 0Ah Kopie von Interrupt 22h (2 Word)
- 0Eh Kopie von Interrupt 23h (2 Word)
- 12h Kopie von Interrupt 24h (2 Word)
- 16h Vorheriger PSP: Segment (1 Word)
- 18h Reserviert (20 Bytes)
- 2Ch Segmentadresse des Environment Blocks (1 Word)
- 2Eh Reserviert (46 Bytes)
- 5Ch FCB #1 (16 Bytes)
- 6CH FCB #2 (16 Bytes)
- 80h Anzahl Zeichen in Kommandozeile (ohne CR) (1 Byte)
- 81h Kommandozeile (127 Bytes)
-
- Allerdings ist das Byte 16h im PSP ein Verweis auf den vorherigen PSP
- (undokumentiert!!!). Man kann sich also rückwärts durch die PSPs hangeln,
- bis ein PSP als nächsten PSP sich selbst angibt. Das ist der PSP von
- Command.com.
- Nun könnten wir also bereits im Environment von Command.com rumwerkeln,
- wissen aber nicht, wie groß es ist, was eine Beschädigung von Programmen
- und damit einen Systemabsturz zur Folge haben könnte.
- Um die Größe zu erfahren, muß man sich durch eine Liste von MCBs (Memory
- Control Blocks) hangeln, deren erster im DOS-Info-Block an der Adresse -4
- steht. Den Dos-Info-Block erhalten wir übrigens mit dem Interrupt 21h,AH=52h
- -> Zeiger auf DIB in es:bx
- -> Zeiger auf ersten MCB in es-1:bx+12 (entspricht -4, aber sicherer)
-
- MCB
- 00h ID ('Z': keiner folgt, 'M': es folgen weitere) (1 Byte)
- 01h Segmentadresse des zugehörigen PSP (1 Word)
- 03h Anzahl Paragraphen (16 Bytes) in allokiertem Speicherbereich (1 Word)
- 05h ungenutzt (11 Byte)
- 10h Allokierter Bereich (x Paragraphen=x-mal 16 Bytes)
-
- Jetzt können wir uns durch die Liste hangeln: das erste Byte eines MCBs
- entscheidet darüber, ob die Liste weitergeht ('M') oder aufhört ('Z').
- Über die Länge des verwalteten Bereichs (Word an 3. Byte-Stelle) können
- wir die Lage des nächsten Blocks errechnen. Daß der MCB das Environment
- enthält, kann man durch den Vergleich des MCB-Segments+1 (hier beginnen
- die Daten) mit dem Segment des Command.com-Environments feststellen (das
- wir vorher bestimmt haben).
- Jetzt kennen wir über das Wort an der 3.Byte-Stelle dieses MCBs die Länge
- des Environments in Paragraphen (=16Byte), wodurch ein Überschreiben
- anderer MCBs oder Programme verhindert werden kann.
- Einen Haken gibt es immer noch: benutzt man UMBs (Upper Memory Blocks),
- gibt es auch MCBs für UMBs. Der Environment-Block von Command.com kann
- also auch in einem UMB liegen. Standardmäßig steht aber im Dos-Info-Block
- der erste MCB im normalen Speicher -> man bekommt die MCBs der UMBs erst
- gar nicht. Man muß also der DOS-Speicherverwaltung erst explizit mitteilen,
- daß UMBs in die Speicherverwaltung einbezogen werden sollen. Das geschieht
- mit INT 21H, AH=58, AL=03, BX=1. Vorher sollte man noch den augenblicklichen
- Status speichern (AL=02, Ergebnis in AL), um ihn am Programmende zurücksetzen
- zu können.
- -----------------------------------------------------------------------------
- eMail: vOlkerOth@aol.com
- hOmepage: members.aol.com/vOlkerOth
-