home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------ *
- ;* DEVCOM.ASM *
- ;* (C) 1991 Ulrich Schmitz & DOS - toolbox *
- ;* ------------------------------------------------------ *
- ;* Programm verwaltet System- und andere Device-Treiber *
- ;* ------------------------------------------------------ *
-
- TITLE DEVCOM.ASM
- page 63,130 ;Drucken mit Schmalschrift
-
- ; Assemblieren mit Microsoft Macroassembler ab Version 5.0
- ; oder kompatiblem Assembler
- ;
- ; Aufruf: ASSCOM DEVCOM
- ; oder
- ;
- ; MASM DEVCOM;
- ; LINK DEVCOM; ---> "Warning"-Meldung "no stack segment"
- ; EXE2BIN DEVCOM.EXE DEVCOM.COM
- ;
- ;--------------- M A K R O S ----------------------
-
- msdos macro name ;MS-DOS Funtionsaufruf
- mov ah,&name
- int 21h
- endm
-
- ;---------- DOS Funktionscodes ----------------------------
-
- _outchr equ 02h ;Einzelzeichen über MS-DOS
- _outstr equ 09h ;Textstring über MS-DOS
- _create equ 3Ch ;Datei neu einrichten
- _open equ 3Dh ;Datei öffnen
- _close equ 3Eh ;Datei schließen
- _read equ 3Fh ;aus Datei lesen
- _write equ 40h ;in Datei schreiben
- _delete equ 41h ;Datei löschen
- _ende equ 4Ch ;zurück zu DOS
-
- ;----------------------------------------------------------
-
- ausgabe macro text ;Textausgabe über DOS
- push ax
- push dx
- mov dx,offset text
- msdos _outstr
- pop dx
- pop ax
- endm
-
- ;----------------------------------------------------------
- cr equ 13 ;zum Zeilenanfang
- lf equ 10 ;nächste Zeile
- bel equ 07 ;Warnton ausgeben
-
-
- ;------- B E G I N N D E S P R O G R A M M S ------------
-
- code_seg segment
-
- assume cs:code_seg, ds:code_seg
-
- org 0100h ;für .COM Datei
-
- prgm_start: jmp programm
-
- ;------ Variable und Texte --------------------------------
-
- o_treiber DW '??' ;Adressenspeicher
- s_treiber DW '??' ; " "
- last_drv DW '??' ;Flag für Ende
- t_count DW 0 ;Zeiger in Liste
- t_name DB '12345678' ;Namenspeicher
- t_adress DW 0FFFFh,0FFFFh ;Adressenspeicher
- t_status DB 'A'
- t_liste DB 32 DUP ('>TREIBER',0FFh,0FFh,0FFh,0FFh,'A')
- stat_cnt DB 0 ;Listenstatus-Zähler
- read_stat DB 0
- parameter DB 'P'
- treiber_nr DB '#'
- dateiname DB 'TREIBER.LST',0
- handle DW '##'
-
- bezeichnen DB 'Nr. Name Adresse Status'
- DB cr,lf,lf,'$'
- aktiv DB ' ein',cr,lf,'$'
- nichtaktiv DB ' aus',cr,lf,'$'
- show_text DB cr,lf,'Alle Systemtreiber auf einen Blick'
- DB cr,lf,lf,'$'
-
- fehler_0 DB 'FEHLERHAFTE PARAMETEREINGABE !!!! ---->'
- DB bel, cr, lf, lf
-
- fehler_1 DB 'Der DEVICE-COMMANDER zeigt alle '
- DB 'im System befindlichen Device-Treiber,'
- DB cr,lf
- DB 'mit Adresse und Status auf dem'
- DB ' Bildschirm an.'
- DB cr,lf
- DB 'Zum Ein- und Ausblenden von Devices '
- DB 'wird im aktuellen Laufwerk',cr,lf
- DB 'eine unsichtbare Datei angelegt.',cr,lf
- DB 'Mit dem Parameter "-" und der '
- DB 'entsprechenden '
- DB 'Nummer lassen sich nun',cr,lf
- DB 'beliebige Treiber abschalten oder mittels'
- DB ' "+" wieder einbinden.',cr,lf
- DB 'Der NUL-Treiber (Nummer 0) läßt sich '
- DB 'nicht beeinflussen.',cr,lf,lf
- DB 'Beispiel: DEVCOM L ---> zeigt '
- DB 'Treiberliste an.',cr,lf
- DB ' DEVCOM -1 ---> entfernt '
- DB 'Treiber Nr.1.',cr,lf
- DB ' DEVCOM +1 ---> hängt '
- DB 'Treiber Nr.1 '
- DB 'wieder ein.',cr,lf,lf
- DB 'DEVICE COMMANDER Version 2.0 (C) 1991'
- DB ' DOS - toolbox & U. Schmitz',cr,lf,cr,lf
- DB 'DMV-Verlag',cr,lf
- DB 'Postfach 250',cr,lf, '3440 Eschwege',cr,lf
- DB '$'
-
- fehler_2 DB 'FEHLER: Datei "TREIBER.LST" konnte nicht'
- DB ' erstellt werden!','$'
-
- fehler_3 DB 'FEHLER: NUL-Device kann nicht geschaltet '
- DB 'werden!','$'
-
- fehler_4 DB 'FEHLER: Ein Treiber mit dieser Nummer '
- DB 'existiert nicht!','$'
-
- ;----------------------------------------------------------
- ;--- Beginn der Programmroutinen --------------------------
- ;----------------------------------------------------------
- first_drv: push ax ;NUL Treiber suchen
- push bx
- push cx
- push es
- mov ax,0FFFFh
- mov es,ax ;Segment initialisieren
- new_seg: sub si,si ;Offset initialisieren
- mov di,es
- inc di
- mov es,di ;Segment hochzählen
- find_nul: inc si ;Offset hochzählen
- mov al,es:[si]
- mov bl,es:[si+1]
- mov cl,es:[si+2]
- cmp si,0FFFFh ;neues Segment?
- je new_Seg
- cmp al,'N'
- jne find_nul
- cmp bl,'U'
- jne find_nul
- cmp cl,'L'
- jne find_nul
- sub si,10 ;Beginn = Name - 10
- mov o_treiber,si ;Offset Treiber NUL
- mov s_treiber,es ;Segment Treiber NUL
- pop es
- pop cx
- pop bx
- pop ax
- ret
-
- next_drv: push es
- mov es,s_treiber ;Segment akt. Treiber
- mov si,o_treiber ;Offset akt. Treiber
- cmp si,0ffffh ;kein weiterer Tr.?
- jne next_0 ;weiter
- mov last_drv,si ;Merker für letzten
- pop es
- ret ;Treiber setzen, fertig
-
- ;--- Namen des aktuellen Treibers auslesen ----------------
-
- next_0: mov di,0
- mov bx,offset t_name
- next_1: mov al,es:[si+10] ;Name steht auf Pos. 10
- mov [bx],al
- add bx,1
- inc si
- inc di
- cmp di,8
- jne next_1
-
- ;--- aktuellen Treiber in Liste t_liste eintragen ---------
-
- push cs ;Quelle --> ds:si
- pop es ;Ziel --> es:dI
- mov ax,t_count ;Zähler für Treiber
- add ax,13 ;Zeiger für Tabelle
- mov t_count,ax
- cld
- mov cx,8 ;8 Byte (Name)
- mov si,offset t_name
- add ax,offset t_name
- mov di,ax
- rep movsb ;kopiere Namen
-
- ;--- akt. Treiberadresse in Liste eintragen ---------------
-
- mov si,offset t_name
- add si,t_count
- mov ax,s_treiber
- mov [si+8],ax
- mov ax,o_treiber
- mov [si+10],ax
-
- ;--- Nächste Treiberadresse berechnen ---------------------
-
- mov es,s_treiber ;Segment setzen
- mov si,o_treiber
- mov ax,es:[si]
- mov o_treiber,ax ;nächstes Offset
- mov ax,es:[si+2]
- mov s_treiber,ax ;nächstes Segment
- pop es
- ret
-
- ;--- Datei für Treiberliste anlegen -----------------------
-
- creat_list: mov dx,offset dateiname
- mov cx,02 ;versteckte Datei
- msdos _create
- jc creat_err
- mov handle,ax ;Handle speichern
- ret
-
- ;- Treiberliste erstellen und im RAM ablegen --------------
-
- make_list: call creat_list ;Liste anlegen
- call first_drv
- weiter: call next_drv
- cmp word ptr last_drv,'??' ;weitere Treiber?
- je weiter
-
- ;--- in Datei schreiben -----------------------------------
-
- insrt_list: mov bx,handle
- mov cx,32*13+1 ;32 * 13 + 1 Bytes
- mov dx,offset t_liste ;Listenanfang
- msdos _write
- jnc clos_hndl ;alles klar, --> close
- creat_err: pop ax ;sonst Fehler zeigen
- mov ax,2
- jmp fehler
-
- ;--- Treiberliste lesen -----------------------------------
-
- read_list: mov al,0 ;nur lesen
- mov dx,offset dateiname
- msdos _open ;TREIBER.LST öffnen
- jc read_err ;Lesefehler -->
- mov handle,ax ;Handle für Datei
- mov bx,ax
- mov cx,32*13+1 ;Anzahl Daten
- mov dx,offset t_liste ;Offset Daten
- msdos _read
- clos_hndl: mov bx,handle ;Datei wieder schließen
- msdos _close
- mov ax,'##'
- mov handle,ax ;Handle entfernen
- mov read_stat,AL ;Datei markieren
- ret
-
- read_err: ret ;Lesefehler --> fertig
-
- ;--- Treiberliste anzeigen --------------------------------
-
- show_list: mov si,offset t_liste ;OFFSET Daten -->si
- mov di,si
- mov t_count,0
- ausgabe bezeichnen
- next_nam: mov ax,t_count
- call outdec
- call out3sp
- inc t_count
- next_char : mov al,[di]
- cmp al,'>'
- je show_ende
- mov dx,di
- sub di,si
- cmp di,8
- mov di,dx
- jne weiter_chr
- call out2sp
- call showadr ;Treiber Adresse zeigen
- call status
- add si,13
- mov di,si ;nächster Treiber
- cmp byte ptr [di],'>'
- jne next_nam
- show_ende : ret
-
- weiter_chr: cmp al,20h ;Sonderz. als Hex-Byte
- jge ascchr
- call outhex
- jmp short bump
-
- ascchr: call outchr
- bump: inc di
- jmp next_char
-
- ;------- Status des Treibers anzeigen----------------------
-
- status: cmp byte ptr [di+4],'A';Statusbyte aktiv?
- je active
- ausgabe nichtaktiv ;nein, aus
- ret
-
- active: ausgabe aktiv ;ja, ein
- ret
-
- ;------ Adressen hexadezimal anzeigen ---------------------
-
- showadr: mov ax,[di] ;Segment Adresse
- call out2b ;anzeigen
- mov al,':'
- call outchr
- mov ax,[di+2] ;Offset Adresse
- call out2b ;anzeigen
- ret
-
- ;------- 2 bzw. 1 Byte anzeigen ---------------------------
-
- out2b: push ax ;2 Byte in AX
- mov al,ah ;zuerst High Byte in AL
- call out1b ;1 Byte anzeigen
- pop ax ;nun Low Byte in AL
- out1b: push ax ;Byte retten (AL)
- shr al,1 ;oberes Halbbyte
- shr al,1
- shr al,1
- shr al,1
- call outhex ;Halbbyte anzeigen
- pop ax ;zurück für
- ;unteres Halbbyte
- outhex: and al,0Fh ;nur untere 4 Bit
- cmp al,9
- jle outh1 ;0 ... 9
- add al,7 ;A ... F
- outh1: add al,30h ;in ASCII wandeln
- outchr: push dx
- push ax
- mov dl,al
- msdos _outchr ;Anzeige über DOS
- pop ax
- pop dx
- ret
-
- ;--- Leerzeichen ausgeben ---------------------------------
-
- out3sp: call outsp ;3 Zeichen
- out2sp: call outsp ;2 Zeichen
- outsp: push ax ;1 Zeichen
- mov al,20h
- call outchr
- pop ax
- ret
-
- ;--- Zahlen dezimal anzeigen ------------------------------
-
- outdec: cmp ax,100 ;dreistellig, wenn > 99
- jge decout ;sonst
- call outsp ;ein Leerzeichen
- cmp ax,10 ;zweistellig, wenn > 9
- jge decout ;sonst
- call outsp ;ein Leerzeichen
- decout: xor cx,cx ;Zähler auf null
- mov bx,10 ;Multiplikator 10
- dc1: xor dx,dx
- div bx ;AX:=AX div 10
- ;DX:=AX mod 10
- add dl,30h ;zu ASCII erweitern
- push dx ;und kellern
- inc cx ;Zähler := Zähler + 1
- or ax,ax ;AX = 0 ?
- jnz dc1 ;nein, weiter
- twodc2: pop ax ;AX mit Ziffer laden
- call outchr ;und schreiben
- dec cx ;Zähler := Zähler - 1
- jnz twodc2 ;weiter,
- ;wenn nicht fertig
- ret
-
- ;--- Treiber in die Kette wieder einfügen -----------------
-
- insert_drv: mov al,treiber_nr ;welcher Treiber?
- mov di,offset t_liste ;Listenanfang
- sub ah,ah ;Treiber NUL
- rechne_adr: add di,13 ;nächster in Liste
- cmp byte ptr [di],'>' ;Treiber vorhanden?
- je zugross ;nein
- inc ah ;zählen
- cmp al,ah ;Nummer erreicht?
- jne rechne_adr ;nein,weiter
- cmp byte ptr [di+12],'A' ;Treiber aktiv?
- je ins_ende ;ja, bereits fertig
-
- ; DI zeigt nun auf den Namen des angewählten Treibers in
- ; der Liste.
- ; Dieser ist nicht aktiv und läßt sich daher einschalten.
-
- neg byte ptr [di+12] ;Status einschalten
- dec stat_cnt ;Listenstatus zählen
- mov ax,[di+8] ;Segment holen
- mov bx,[di+10] ;Offset holen
- push di ;Listenzeig.aufheben
- try_on: sub di,13 ;vorigen Tr. zeigen
- cmp byte ptr [di+12],'A' ;Treiber aktiv?
- jne try_on ;nein, weiter zurück
- mov es,[di+8] ;Segment aus Liste
- mov si,[di+10] ;Offset zeigen
- mov es:[si+2],ax ;Verkettungsadresse
- mov es:[si],bx ;einsetzen
- pop di ;Listenzeiger zurück
- mov es,[di+8] ;Segment aus Liste
- mov si,[di+10] ;Offset zeigen
- try_nxt: add di,13 ;folgenden Tr.zeigen
- cmp byte ptr [di+12],'A' ;aktiv?
- jne try_nxt ;nein, zum nächsten
- ;Treiber
- mov ax,[di+8] ;Segment holen
- mov bx,[di+10] ;Offset holen
- mov es:[si+2],ax ;Verkettungsadresse
- mov es:[si],bx ;aktuell einsetzen
- ins_ende: ret ;fertig
-
- zugross: pop ax ;Treibernummer
- ;existiert nicht
- mov ax,4
- jmp fehler
-
- ;--- Treiber aus der Kette entfernen ----------------------
-
- remove_drv: mov al,treiber_nr ;welcher Treiber?
- mov di,offset t_liste ;Listenanfang
- sub ah,ah ;Treiber NUL
- neue_adr: add di,13 ;nächster in Liste
- cmp byte ptr [di],'>' ;Treiber vorhanden?
- je zugross ;nein
- inc ah ;zählen
- cmp al,ah ;Nummer erreicht?
- jne neue_adr ;nein,weiter
- cmp byte ptr [di+12],'A' ;Treiber aktiv?
- jne rem_ende ;nein, fertig
-
- ; DI zeigt nun auf den Namen des angewählten Treibers in
- ; der Liste.
- ; Dieser ist aktiv und kann daher ausgeschaltet werden.
-
- neg byte ptr [di+12] ;Status aus
- inc stat_cnt ;Listenstatus zählen
- mov es,[di+8] ;Segment holen
- mov si,[di+10] ;Offset zeigen
- mov ax,es:[si+2] ;verkettetes Segment
- mov bx,es:[si] ;und Offset holen
- try_of: sub di,13 ;vorigen Trb. zeigen
- cmp byte ptr [di+12],'A' ;aktiv?
- jne try_of ;nein, weiter zurück
-
- ; DI zeigt nun auf den Namen des nächsten aktiven Treibers
- ; in der Liste, der vor dem auszuschaltenden liegt.
- ; Mit diesem muß die Adresse AX:BX verkettet werden.
- ; Der ausgeschaltete Treiber wird dadurch umgangen
- ; und somit aus der Kette entfernt.
-
- mov es,[di+8] ;Segment setzen
- mov si,[di+10] ;Offset zeigen
- mov es:[si+2],ax ;Verkettungsadresse
- mov es:[si],bx ;einsetzen
- rem_ende: ret ;fertig
-
- ;------------------- Hauptprogramm ----------------------
-
- programm: push cs
- pop ds
- mov al,ds:[0080h] ;Parameter auf
- ;Kommandozeile?
- cmp al,0
- jne para_1
- mov ax,1 ;ohne Parameter:
- ; --> Hilfstext
- jmp fehler
-
- para_1: mov al,ds:[0082h] ;erstes Zeichen
- cmp al,40h
- jle Para_2 ;unterhalb von "A" -->
- and al,0DFh ;sonst in Uppercase wandeln
- cmp al,'L' ;L-Parameter?
- jne para_2
- call read_list ;ja, Listendatei versuchen
- jnc liste ;gefunden --> alles klar
- call first_drv ;sonst Treiber unmittelbar
- weit: call next_drv ;anzeigen
- cmp last_drv,'??' ;weitere Treiber?
- je weit
- ausgabe show_text ;Überschrift
- liste: call show_list
- jmp ende ;Ende
-
- para_2: cmp al,'+'
- je para_4
- cmp al,'-'
- je para_4
- mov ax,0 ;kein "+" oder "-" -> Fehler
- jmp fehler
-
- para_4: mov parameter,al ;Parameter setzen
- mov ax,ds:[0083h] ;weiter Zeichen
- cmp ah,0Dh ;nur eine Ziffer?
- jz para_6 ;ja, fertig
- mov cx,ax ;nein, AX 2 Ziffern
- mov bx,10
- xor ax,ax
- sub cx,3030h ;high + low Byte binär
- mov al,cl ;Zehnerstelle -> AL
- mul bx ;mal 10
- add al,ch ;Einerstelle addieren
- jmp para_8
- para_6: sub al,30h
- para_8: cmp al,1 ;nicht unter 1
- jae para_9
- mov ax,3 ;Nummer 0 nicht zugelassen
- jmp fehler
-
- para_9: mov treiber_nr,al ;Nummer einsetzen
-
- ;--- Treiber entfernen oder wieder einhängen? ------------
-
- do_plus: mov al,parameter
- cmp al,'+'
- jne do_minus
- call read_list ;Treiber Listendatei lesen
- jnc nxt1_i
- call make_list
- nxt1_i: call insert_drv ;Liste ändern
- call creat_list ;neu anlegen
- call insrt_list ;Datei schreiben
- call show_list ;geänderte Liste zeigen
- jmp ende
-
- do_minus: call read_list ;Listendatei lesen
- jnc nxt1_d
- call make_list
- nxt1_d: call remove_drv ;Liste ändern
- call creat_list ;neu anlegen
- call insrt_list ;Datei schreiben
- call show_list ;geänderte Liste zeigen
- jmp ende
-
- ;----- Fehleranzeige (Fehler Nummer in AX) ----------------
-
- err_tab DW fehler_0 ;Tabelle der Fehlertexte
- DW fehler_1
- DW fehler_2
- DW fehler_3
- DW fehler_4
-
- fehler: shl ax,1 ;Fehler Nr. mal 2
- mov di,offset err_tab ;auf Tabelle zeigen
- add di,ax ;Nummernwert addieren
- mov dx,[di] ;Textadresse nach DX
- msdos _outstr ;über DOS anzeigen
-
- ;----------------------------------------------------------
- ende: mov bx,handle
- cmp bx,'##' ;Handle benutzt?
- je test_del ;nein, fertig
-
- ;----- Handle schließen ---------------------------------
-
- msdos _close
-
- test_del: test read_stat,0FFh ;Datei gelesen?
- jz dos ;nein, fertig
- test stat_cnt,0FFh ;noch Treiber
- ;abgeschaltet?
- jnz dos ;ja, fertig
-
- ;----- angelegte Datei wieder löschen --------------------
-
- mov dx,offset dateiname
- msdos _delete
-
- ;----- zurück zu DOS ------------------------------------
-
- dos: msdos _ende ;zurück zu DOS
-
- code_seg ends
-
- end prgm_start
-
- ;* ------------------------------------------------------ *
- ;* - Ende von DEVCOM.ASM *
-
-