home *** CD-ROM | disk | FTP | other *** search
- program GetEnv_Pas;
- {
- (c) Volker Oth 1/1996
- Demonstriert, wie man an das Environment von
- Command.com und an dessen Größe kommt.
- }
- {$G+}
- type q=^char;
- var b:q; { Zeiger auf Environment }
- s,j: word; { s: Größe des Env., j:Laufvariable }
-
- function getenv(var v:q;var z:word):byte; assembler;
- var u:byte; { UMB-Status }
- e, { Segment des Environments }
- p:word; { Segment des PSPs }
- asm
- {***** PSP von Command.com suchen ********}
- mov ah,62h
- int 21h { PSP-Adresse ermitteln }
- mov es,bx { ES ist Segment des PSP }
- @SearchPsp: mov bx,es { alten PSP in BX speichern }
- mov dx,es:[16h] { nächster PSP in dx }
- mov es,dx { nächster PSP in es }
- cmp dx,bx { PSP = nächster PSP ??? }
- je @FoundPsP
- cmp dx,0 { Fehler: PSP zeigt auf keinen PSP }
- jne @SearchPsp
- mov al,1
- jmp @Exit { Exit wegen Fehler1 }
- @FoundPsp: mov p,dx
- mov dx,es:[02ch] { Segment des Environments }
- mov e,dx { ES zeigt auf Environment }
- {***** Memory Control Block (MCB) suchen ********}
- mov ah,58h
- mov al,02h
- int 21h { UMB-Status lesen }
- mov u,al { und speichern }
- mov al,03h
- mov bx,1
- int 21h { Umb-Status: UMBs einbeziehen }
- mov ah,52h
- int 21h { Dos-Info-Block holen }
- mov dx,es
- dec dx
- mov es,dx
- add bx,12 { es:bx Zeigt auf Segment des 1. MCB }
- mov di,es:[bx] { DI ist Offset des 1. MCB }
- mov dx,es:[bx+2] { Segment des 1st MCB }
- mov es,dx { ES:DI zeigt auf 1. MCB }
- @Search_MCB:inc dx { Segment des zugehör. Speichers }
- cmp dx,e { MCB des Environments ??? }
- je @Found_MCB
- cmp byte ptr es:[di],'Z'
- jne @Cont_MCB { letzter MCB ??? }
- mov al,2
- jmp @exit { Exit wegen Fehler 2 }
- @Cont_MCB: mov cx,es:[di+3] { CX:=Nummer der Paragraphen des MCBs}
- mov dx,es { DX:= Segment dieses MCBs }
- add dx,cx
- inc dx
- mov es,dx { ES:= ES(DX)+Paragraphen(CX)+1 }
- mov di,0 { ES:DI zeigt auf nächsten MCB }
- jmp @Search_MCB
- @Found_MCB: mov dx,es:[di+3] { dx:=Nummer der Paragraphen }
- shl dx,4 { dx:=Nummer der Bytes inm Env-MCB }
- les di,z
- mov es:[di],dx { Envgröße in Variable z schreiben }
- mov dx,e
- les di,v
- mov es:[di+2],dx { Zeiger auf Env. in Var. schreiben }
- mov word ptr es:[di],0 { hier könnte man auch Zeiger auf }
- mov al,0 { PSP in Var. schreiben: p:0 }
- @EXIT: push ax { Fehlercode sichern }
- mov ah,58h
- mov al,03h
- mov bl,u
- int 21h { UMB-Status zurücksetzen }
- pop ax { Fehlercode in AL }
- end;
-
- begin
- case getenv(b,s) of
- 0: begin
- writeln('Environment und PSP gefunden ! Environmentgröße:',s);
- j:= 1;
- repeat
- if b^<>#0 then begin write(b^); inc(b); end
- else begin writeln; inc(b); if b^=#0 then j:=s; end;
- inc(j);
- until j>s
- end;
- 1: writeln('PSP nicht gefunden !');
- 2: writeln('Environment nicht gefunden !');
- end;
- end.
-