home *** CD-ROM | disk | FTP | other *** search
/ Software Recommendations - 1998 Season 1 / DNBCD4.iso / develop / tool / zip / SETENV.RAR / SETENV.DOC < prev   
Encoding:
Text File  |  1997-02-19  |  6.5 KB  |  141 lines

  1. Anleitung zu SETENV/SETDRIVE (c) 1/1996 by dOnut hOle
  2. SetEnv.com hat den Sinn, eine Environment-Variable zu erzeugen, die den
  3. Pfad enthält, in dem SetEnv gestartet wurde.
  4. Nehmen wir an, SetEnv.com befindet sich im Pfad C:\GAME\SPIEL und wir
  5. starten es mit SETENV SPIELDIR. Jetzt enthält die Umgebungsvariable SPIELDIR
  6. den Pfad von SetEnv (also C:\GAME\SPIEL).
  7.  
  8. SetDrive.com funktioniert genauso, gibt aber das Laufwerk, in dem
  9. SetDrive gestartet wurde, zurück.
  10. Also SetDrive sei in C:\GAME\SPIEL und wir starten es mit SETDRIVE SPIELDIR.
  11. Dann enthält die Umgebungsvariable SPIELDIR den Laufwerkbuchstaben,
  12. also "C:".
  13.  
  14. Wozu braucht man das ?
  15. Angenommen, man besitzt ein Programm, daß seine Daten immer in einem
  16. Verzeichnis im Hauptverzeichnis speichert ('\GAMEDATA'). Wir wollen es
  17. mittels SUBST davon überzeugen, dieses Verzeichnis im Programmverzeichnis
  18. anzulegen (SUBST A: C:\GAME\SPIEL). Wenn wir Setenv in das Programmverzeich-
  19. nis kopieren, können wir das Programm jetzt mit folgendem Batchfile
  20. austricksen (wegen Kommentaren so nicht lauffähig).
  21.      @ECHO OFF               Meldungen ausschalten
  22.      SETENV PROGDIR          PROGDIR den Pfad von Setenv (des Progr.) zuweisen
  23.      SUBST A: %PROGDIR%      Daten nach A: umleiten
  24.      A:                      Auf Pseudolaufwerk A: wechseln
  25.      PROG.EXE                Programm ausführen
  26.      C:                      Zurück auf Festplatte wechseln
  27.      SUBST A: /D             Substitution rückgängig machen
  28.      SET PROGDIR=            Umgebungsvariable löschen
  29.  
  30. Bemerkungen:
  31. Zunächst mal: ja, man könnte meistens auch "." verwenden. Aber halt nicht
  32. immer. Jedenfalls ist SETENV die saubere Lösung. Und für SETDRIVE kenne
  33. ich überhaupt keinen Ersatz.
  34. SetEnv/SetDrive prüfen nicht, ob eine Variable gleichen Namens bereits
  35. existiert.
  36. Falls doch, exisiert diese zweifach im Environment.
  37. Man kann also noch eine Sicherheitsabfrage in das Batchfile einbauen:
  38.      IF NOT %PROGDIR%!==! GOTO ERROR1
  39.      SETENV PROGDIR
  40. Außerdem ist es möglich, daß kein Speicherplatz mehr im Environment frei
  41. ist. In diesem Fall sollte Setenv eine Fehlermeldung ausgeben. In jedem Fall
  42. sollte aber die Variable nicht gesetzt sein:
  43.      SETENV PROGDIR
  44.      IF %PROGDIR%!==! GOTO ERROR2
  45. Also nochmal die perfekte Lösung:
  46.      @ECHO OFF
  47.      IF NOT %PROGDIR%!==! GOTO ERROR1
  48.      SETENV PROGDIR
  49.      IF %PROGDIR%!==! GOTO ERROR2
  50.      SUBST A: %PROGDIR%      
  51.      A:                      
  52.      PROG.EXE                
  53.      C:                      
  54.      SUBST A: /D             
  55.      SET PROGDIR=            
  56.      GOTO ENDE
  57.   :ERROR1
  58.      ECHO Umgebungsvariable doppelt, Batchfile muß editiert werden !
  59.      GOTO ENDE
  60.   :ERROR2
  61.      ECHO Umgebungsspeicher zu knapp. Bitte erhöhen !
  62.   :ENDE
  63.  
  64. Den Umgebungsspeicher kann man übrigens in der CONFIG.SYS mit dem Befehl
  65.      SHELL=C:\COMMAND.COM /P /E:512
  66. z.B. auf 512 Byte festsetzen.
  67.  
  68.  
  69. Programmierung:
  70. Den Pfad des laufenden Programmes zu bekommen ist leicht. Der Programmname
  71. inklusive Pfad steht im zugehörigen Environment-Block nach den Environment-
  72. Variablen. Diese sind durch je eine 0 getrennt. Den Programmpfad trennt eine
  73. weitere 0 von den Variablen. Die Adresse des Environments erfährt man aus
  74. dem PSP des Programms, der bei einem COM-Programm am Anfang des Code-Segments
  75. liegt. Bei einem Exe-Programm kann man ihn mit einem Interrupt aufspüren
  76. (21h, AH=62h, denke ich).
  77. Schwierig ist alleine das Verändern des Umgebungsspeichers (bzw. das Finden).
  78. Im PSP (Program Segment Prefix) kann man leicht den Environment-Block des
  79. laufenden Programms abfragen. Der PSP und das Environment sind aber bloß
  80. Kopien des PSPs und Environments von Command.com.
  81.  
  82. PSP
  83. 00h   Aufruf des Interrupt 20h (2 Bytes)
  84. 02h   Endadresse des durch Programm belegten Speichers (nur Segment) (1 Word)
  85. 04h   reserviert (1 Byte)
  86. 05h   FAR-CALL zum Interrupt 21h (5 Bytes)
  87. 0Ah   Kopie von Interrupt 22h (2 Word)
  88. 0Eh   Kopie von Interrupt 23h (2 Word)
  89. 12h   Kopie von Interrupt 24h (2 Word)
  90. 16h   Vorheriger PSP: Segment (1 Word)
  91. 18h   Reserviert (20 Bytes)
  92. 2Ch   Segmentadresse des Environment Blocks (1 Word)
  93. 2Eh   Reserviert (46 Bytes)
  94. 5Ch   FCB #1 (16 Bytes)
  95. 6CH   FCB #2 (16 Bytes)
  96. 80h   Anzahl Zeichen in Kommandozeile (ohne CR) (1 Byte)
  97. 81h   Kommandozeile (127 Bytes)
  98.  
  99. Allerdings ist das Byte 16h im PSP ein Verweis auf den vorherigen PSP
  100. (undokumentiert!!!). Man kann sich also rückwärts durch die PSPs hangeln,
  101. bis ein PSP als nächsten PSP sich selbst angibt. Das ist der PSP von
  102. Command.com.
  103. Nun könnten wir also bereits im Environment von Command.com rumwerkeln,
  104. wissen aber nicht, wie groß es ist, was eine Beschädigung von command.com
  105. und damit einen Systemabsturz zur Folge haben könnte.
  106. Dazu muß man sich durch eine Liste von MCB (Memory Control Blocks) hangeln,
  107. deren erster im DOS-Info-Block an der Adresse -4 steht.
  108. Den Dos-Info-Block erhalten wir übrigens mit dem Interrupt 21h, AH=52h
  109. -> Zeiger auf DIB in es:bx
  110. -> Zeiger auf ersten MCB in es-1:bx+12 (entspricht -4, aber sicherer)
  111.  
  112. MCB
  113. 00h    ID ('Z': keiner folgt, 'M': es folgen weitere) (1 Byte)
  114. 01h    Segmentadresse des zugehörigen PSP (1 Word)
  115. 03h    Anzahl Paragraphen (16 Bytes) in allokiertem Speicherbereich (1 Word)
  116. 05h    ungenutzt (11 Byte)
  117. 10h    Allokierter Bereich (x Paragraphen)
  118.  
  119. Jetzt können wir uns durch die Liste hangeln: das erste Byte eines MCB
  120. entscheidet darüber, ob die Liste weitergeht ('M') oder aufhört ('Z').
  121. Über die Länge des verwalteten Bereichs (Word an 3. Byte-Stelle) können
  122. wir die Lage des nächsten Blockes errechnen. Daß der MCB das Environment
  123. enthält, kann man durch den Vergleich des MCB-Segments+1 (hier beginnen
  124. die Daten) mit dem Segment des Command.com-Environments feststellen (das
  125. wir vorher bestimmt haben).
  126. Jetzt kennen wir über das Wort an der 3.Byte-Stelle dieses MCBs die Länge
  127. des Environments in Paragraphen (=16Byte), wodurch ein Überschreiben
  128. anderer MCBs oder Programme verhindert werden kann.
  129. Einen Haken gibt es immer noch: benutzt man UMBs (Upper Memory Blocks),
  130. gibt es auch MCBs für UMBs. Der Environment-Block von Command.com kann
  131. also auch in einem UMB liegen. Standardmäßig steht aber im Dos-Info-Block
  132. der erste MCB im normalen Speicher -> man bekommt die MCBs der UMBs erst
  133. gar nicht. Man muß also der DOS-Speicherverwaltung erst explizit mitteilen,
  134. daß UMBs in die Speicherverwaltung einbezogen werden sollen. Das geschieht
  135. mit INT 21H, AH=58, AL=03, BX=1. Vorher sollte man noch den augenblicklichen
  136. Status speichern (AL=02, Ergebnis in AL), um ihn am Programmende zurücksetzen
  137. zu können.
  138.  
  139. email:    vOlkerOth@aol.com
  140. hOmepage: members.aol.com/vOlkerOth
  141.