home *** CD-ROM | disk | FTP | other *** search
/ Software Recommendations - 1998 Season 1 / DNBCD4.iso / develop / tool / GETENV.dnb < prev    next >
Encoding:
Text File  |  1997-02-19  |  3.8 KB  |  77 lines

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