home *** CD-ROM | disk | FTP | other *** search
/ Software Recommendations - 1998 Season 1 / DNBCD4.iso / develop / tool / zip / GETENV.RAR / GETENV.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-01-06  |  4.0 KB  |  96 lines

  1. program GetEnv_Pas;
  2. {
  3.   (c) Volker Oth 1/1996
  4.   Demonstriert, wie man an das Environment von
  5.   Command.com und an dessen Größe kommt.
  6. }
  7. {$G+}
  8. type q=^char;
  9. var b:q;                                { Zeiger auf Environment }
  10.     s,j: word;                          { s: Größe des Env., j:Laufvariable }
  11.  
  12. function getenv(var v:q;var z:word):byte; assembler;
  13. var u:byte;                             { UMB-Status }
  14.     e,                                  { Segment des Environments }
  15.     p:word;                             { Segment des PSPs }
  16. asm
  17. {***** PSP von Command.com suchen ********}
  18.             mov ah,62h
  19.             int 21h                     { PSP-Adresse ermitteln }
  20.             mov es,bx                   { ES ist Segment des PSP }
  21. @SearchPsp: mov bx,es                   { alten PSP in BX speichern }
  22.             mov dx,es:[16h]             { nächster PSP in dx }
  23.             mov es,dx                   { nächster PSP in es }
  24.             cmp dx,bx                   { PSP = nächster PSP ??? }
  25.             je @FoundPsP
  26.             cmp dx,0                    { Fehler: PSP zeigt auf keinen PSP }
  27.             jne @SearchPsp
  28.             mov al,1
  29.             jmp @Exit                   { Exit wegen Fehler1 }
  30. @FoundPsp:  mov p,dx
  31.             mov dx,es:[02ch]            { Segment des Environments }
  32.             mov e,dx                    { ES zeigt auf Environment }
  33.             {***** Memory Control Block (MCB) suchen ********}
  34.             mov ah,58h
  35.             mov al,02h
  36.             int 21h                     { UMB-Status lesen }
  37.             mov u,al                    { und speichern }
  38.             mov al,03h
  39.             mov bx,1
  40.             int 21h                     { Umb-Status: UMBs einbeziehen }
  41.             mov ah,52h
  42.             int 21h                     { Dos-Info-Block holen }
  43.             mov dx,es
  44.             dec dx
  45.             mov es,dx
  46.             add bx,12                   { es:bx Zeigt auf Segment des 1. MCB }
  47.             mov di,es:[bx]              { DI ist Offset des 1. MCB }
  48.             mov dx,es:[bx+2]            { Segment des 1st MCB }
  49.             mov es,dx                   { ES:DI zeigt auf 1. MCB }
  50. @Search_MCB:inc dx                      { Segment des zugehör. Speichers }
  51.             cmp dx,e                    { MCB des Environments ??? }
  52.             je @Found_MCB
  53.             cmp byte ptr es:[di],'Z'
  54.             jne @Cont_MCB               { letzter MCB ??? }
  55.             mov al,2
  56.             jmp @exit                   { Exit wegen Fehler 2 }
  57. @Cont_MCB:  mov cx,es:[di+3]            { CX:=Nummer der Paragraphen des MCBs}
  58.             mov dx,es                   { DX:= Segment dieses MCBs }
  59.             add dx,cx
  60.             inc dx
  61.             mov es,dx                   { ES:= ES(DX)+Paragraphen(CX)+1 }
  62.             mov di,0                    { ES:DI zeigt auf nächsten MCB }
  63.             jmp @Search_MCB
  64. @Found_MCB: mov dx,es:[di+3]            { dx:=Nummer der Paragraphen }
  65.             shl dx,4                    { dx:=Nummer der Bytes inm Env-MCB }
  66.             les di,z
  67.             mov es:[di],dx              { Envgröße in Variable z schreiben }
  68.             mov dx,e
  69.             les di,v
  70.             mov es:[di+2],dx            { Zeiger auf Env. in Var. schreiben }
  71.             mov word ptr es:[di],0      { hier könnte man auch Zeiger auf }
  72.             mov al,0                    { PSP in Var. schreiben:   p:0 }
  73. @EXIT:      push ax                     { Fehlercode sichern }
  74.             mov ah,58h
  75.             mov al,03h
  76.             mov bl,u
  77.             int 21h                     { UMB-Status zurücksetzen }
  78.             pop ax                      { Fehlercode in AL }
  79. end;
  80.  
  81. begin
  82.   case getenv(b,s) of
  83.   0: begin
  84.        writeln('Environment und PSP gefunden ! Environmentgröße:',s);
  85.        j:= 1;
  86.        repeat
  87.          if b^<>#0 then begin write(b^); inc(b); end
  88.                    else begin writeln; inc(b); if b^=#0 then j:=s; end;
  89.          inc(j);
  90.        until j>s
  91.      end;
  92.   1: writeln('PSP nicht gefunden !');
  93.   2: writeln('Environment nicht gefunden !');
  94.   end;
  95. end.
  96.