home *** CD-ROM | disk | FTP | other *** search
- TITLE DEVICE.ASM
- ;----------------------------------------------------------
- ;- DEVCOM.ASM -
- ;- (C) 1990 Ulrich Schmitz & toolbox -
- ;----------------------------------------------------------
- ;- Programm verwaltet System- und andere Device-Treiber -
- ;----------------------------------------------------------
-
- ;------------- M A K R O S -------------------------
-
- Ausgabe MACRO Text
- push ax
- push dx
- mov ax, CS
- mov DS, ax
- mov ah, 09
- mov dx, OFFSET Text
- int 21h
- pop dx
- pop ax
- endm ;------------------------
-
-
-
- ;----------------------------------------------------------
-
- .model small
- .stack
- .code
-
- CR equ 13
- LF equ 10
- BEL equ 07
-
- O_Driver DW '??'
- S_Driver DW '??'
- O_Treiber DW '??'
- S_Treiber DW '??'
- last_Drv DW '??'
-
- T_Count DW 0
- T_Name DB '12345678'
- T_first DB 'SSOO'
- T_Liste DB 32 DUP ('>TREIBER','SSOO')
- Lesefehler DB '?'
-
- Parameter DB 'P'
- Treiber_Nr DB '#'
- Dateiname DB 'TREIBER.LST', 0
- Handle DW '##'
-
- Fehler_2 DB 'FEHLER: Datei "TREIBER.LST" konnte nicht erst'
- DB 'ellt werden!', '$'
-
- Fehler_3 DB 'FEHLER: Datei "TREIBER.LST" existiert nicht!'
- DB CR,LF,'Mit "DEVCOM I" Liste erstellen!',CR,LF
- DB '$'
-
- Show_Text DB 'Alle Systemtreiber auf einen Blick (auch deak'
- DB 'tivierte):',CR,LF,'$'
-
- Fehler DB 'FEHLERHAFTE PARAMETEREINGABE !!!! --->',CR,LF
- DB BEL, CR, LF
- Hilfstext DB 'Mit dem DEVICE-COMMANDER lassen sich alle i'
- DB 'm System befindlichen Device-Treiberbeliebig '
- DB 'ein- oder ausschalten.',CR, LF
- DB 'Der DEVICE-COMMANDER erzeugt mit der Option "'
- DB 'I" im aktuellen Laufwerk eine Listealler mom'
- DB 'entan vorhandenen Treiber. Das Ein- und Ausb'
- DB 'lenden von Devices ist nurmit Hilfe dieser un'
- DB 'sichtbaren Tabelle möglich!',CR,LF
- DB 'Zusätzlich können über "devcom L" alle in'
- DB 'stallierten Device-Treiber über denBildschirm'
- DB ' ausgegeben werden.',CR,LF
- DB 'Mit dem Parameter "-" und der entsprechenden'
- DB ' Nummer lassen sich nun jederzeitbeliebige '
- DB 'Treiber entfernen oder über "+Treibernummer" '
- DB ' wieder einbinden.',CR,LF,CR,LF
- DB 'Beispiel: devcom I --> erstellt Treiber-L'
- DB 'iste',CR,LF
- DB ' devcom -1 --> entfernt Treiber 1'
- DB CR,LF
- DB ' devcom +1 --> hängt Treiber 1 wi'
- DB 'eder ein',CR,LF
- DB CR,LF
- DB 'DEVICE-COMMANDER Version 1.0 (C) 1990 by tool'
- DB 'box & U.Schmitz',CR ,LF ,'DMV-Verlag', CR, LF
- DB 'Postfach 250', CR, LF, '3440 Eschwege',CR,LF
- DB '$'
-
-
- ;* Liste aller installierten Treiber, Segment sowie Offset *
-
- ;------------------ Unterprogramme -------------------------
- init_Driver proc
- push ax
- push bx
- push cx
- push dx
-
- sub ax,ax
- mov DS,ax ;Segment initialisieren
- jmp Driver_Start
- New_Segment:
- sub si,si ;Offset initialisieren
- mov di, DS
- inc di
- mov DS,di
-
- Driver_Start:
- inc si ;Offset hochzählen
- mov al,DS:[si]
- mov bl,DS:[si+1]
- mov cl,DS:[si+2]
- cmp si,0ffffh ;neues Segment?
- je New_Segment
- cmp al,'N'
- jne Driver_Start
- cmp bl,'U'
- jne Driver_Start
- cmp cl,'L'
- jne Driver_Start
- mov CS:O_Driver, si ;Offset Treibertabelle
- mov CS:S_Driver, DS ;Segment Treibertabelle
- Driver_Ende:
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- init_Driver endp
-
-
- first_Driver proc
- mov di, CS:S_Driver ;Segment Treiber
- mov DS,di
-
- mov si, CS:O_Driver ;Offset Treiber
- mov ax,DS:[si-8]
- mov CS:S_Treiber,ax
- mov ax,DS:[si-10]
- mov CS:O_Treiber,ax
-
- mov di,OFFSET CS:T_first ;erste Treiberadr.
- mov CS:[di+2],ax ;eintragen.
- mov ax,CS:S_Treiber ;(von NUL !!!!!)
- mov CS:[di],ax
- ret
- first_Driver endp
-
- next_Driver proc
- mov di,CS:S_Treiber ;Segment akt.Treiber
- mov DS,di
- mov si,CS:O_Treiber ;Offset akt. Treiber
- cmp si, 0ffffh ;kein weiterer Tr.?
- jne next_0 ;weiter
- mov CS:last_Drv, si ;Merker für letzten
- jmp Exit_Driver ; Treiber setzen
- ;--- Namen des aktuellen Treibers ausgeben --------
- next_0:
- mov di,0
- mov bx,OFFSET T_Name
- next_1:
- mov ax,DS:[si+10]
- mov CS:[bx],al
- add bx,1
- inc si
- inc di
- cmp di,8
- jne next_1
-
- ;- aktuellen Treiber in Liste T_Liste eintragen --
-
- mov ax,CS
- mov ES,ax ;Quelle->DS:SI
- mov DS,ax ;Ziel ->ES:DI
-
- mov ax,CS:T_Count ;Zähler für Treiber
- add ax,12 ;Zeiger für Tabelle
- mov CS:T_Count,ax
-
- cld
- mov cx, 8 ;8 Byte (Name)
- mov si,OFFSET CS:T_Name
- add ax,OFFSET CS:T_Name
- mov di,ax
- REP movsb ;kopiere Namen
-
- ;- akt. Treiberadresse (nächster Treiber) in Liste eintragen
- mov si,CS:T_Count
- add si,OFFSET CS:T_Name
- mov ax,CS:S_Treiber
- mov CS:[si+8],ax
- mov ax,CS:O_Treiber
- mov CS:[si+10],ax
-
- ;--- Nächste Treiberadresse berechnen ---------------------
-
- mov ax,CS:S_Treiber ;Segment setzen
- mov DS,ax
-
- mov si,CS:O_Treiber
- mov ax,DS:[si]
- mov CS:O_Treiber,ax ;nächstes Offset
-
- mov ax,DS:[si+2]
- mov CS:S_Treiber,ax ;nächstes Segment
-
-
- Exit_Driver:
- ret
- next_Driver endp
-
-
-
- create_list proc
- mov ah,3Ch
- mov bx,CS
- mov DS,bx
- mov dx,OFFSET CS:Dateiname
- mov cx,02 ;versteckte Datei
- int 21h
- mov CS:Handle, ax ;Handle speichern
- jnc create_OK
- Ausgabe Fehler_2
- create_OK:
- ret
- create_list endp
-
- insert_list proc
- mov ah,64
- mov bx,CS:Handle
- mov cx,180h ;32 * 12 Bytes
- mov dx,CS
- mov DS,dx
- mov dx,OFFSET T_first ;Anfangsadr. Daten
- int 21h
- jnc write_OK
- Ausgabe Fehler_2
- write_OK:
- ret
- insert_list endp
-
-
-
- read_list proc
- mov ah,3dh ;Datei öffnen
- mov al,0 ;nur lesen
- mov dx,CS
- mov DS,dx
- mov dx,OFFSET Dateiname
- int 21h ;TREIBER.LST öffnen
- jnc open_OK
- Ausgabe Fehler_3
- mov CS:Lesefehler,1
- jmp Ende_read
- open_OK:
- mov CS:Handle,ax ;Handle für Datei
-
- mov ah,3Fh
- mov bx,CS:Handle
- mov cx,180h ;Anzahl Daten
- mov dx,CS
- mov DS,dx ;Segment Daten
- mov dx,OFFSET T_first ;Offset Daten
- int 21h
- Ende_read:
- ret
- read_list endp
-
- show_list proc
- int 3
- mov si,OFFSET T_Liste ;OFFSET Daten->si
- mov di,si
-
- next_char:
- mov al,CS:[di]
- cmp al,'>'
- je show_Ende
- mov dx,di
- sub di,si
- cmp di,8
- mov di,dx
- jne weiter_char
- mov ah,14
- mov al,13 ;CR
- int 10h
- mov ah,14
- mov al,10 ;LF
- int 10h
- add si,12
- mov di,si ;nächster Treiber
- jmp next_char
- weiter_char:
- mov ah,14
- int 10h
- inc di
- jmp next_char
- show_Ende:
- ret
- show_list endp
-
- insert_Driver proc
- int 3
- mov al,CS:Treiber_Nr ;welcher Treiber?
- sub al,30h ;ASC-1 umwandeln
- mov di,OFFSET CS:T_first ;Offset Tabelle
- mov bx,[di] ;Segment Speicher
- mov si,[di+2] ;Offset Speicher
- sub si,36 ;korrigieren
- sub ah,ah ;Zähler init
- berechne_adr:
- add si,18 ;alle 18 Bytes->Sp.
- add di,12
- inc ah
- cmp al,ah ;Treibernr.erreicht?
- jne berechne_adr
- ;- Adressen wieder wechseln ----------
- int 3
- add di,2 ;Offset Tabelle
- mov ES,bx ;Segment Speicher
- mov ax,CS:[di] ;Tabellenwert in
- mov ES:[si],ax ;Speicherliste
- ret
- insert_Driver endp
-
-
-
- remove_Driver proc
- int 3
- mov al,CS:Treiber_Nr ;welcher Treiber?
- sub al,31h ;ASC-1 umwandeln -1
- mov di,OFFSET CS:T_first ;erste Treiberadr.
- mov bx,[di] ;Segment Speicher
- mov si,[di+2] ;Offset Speicher
- mov ah,1 ;Zähler init
- berechne_adresse:
- inc ah
- mov ES,bx
- mov di,ES:[si] ;echtes Offset
- mov bx,ES:[si+2] ;echtes Segment
- mov si,di ;Offset übertragen
- int 3
- cmp al,ah ;Treibernr.erreicht?
- jne berechne_adresse
- ;***********
- ;- Adressen wieder wechseln ----------
- int 3
- mov si,di
- add di,18 ;Ersatz-Adresse
- ;liegt 18 Bytes
- ;weiter!!!!!!!!
- mov ES,bx ;Segment Speicher
- mov ax,ES:[di] ;Treiberadresse
- mov ES:[si],ax ;Speicherliste
- ret
- remove_Driver endp
-
-
- ;------------------ Hauptprogramm -------------------------
- Programm:
- mov al,DS:0080h ;Param. auf Kommandoz.?
- cmp al,0
- jne Para_1
- Ausgabe Hilfstext
- jmp DOS
- Para_1:
- mov al,DS:0082h
- cmp al,'L'
- jne Liste
- call read_list
- Ausgabe Show_Text
- call show_list
- jmp Ende ;zurück zu DOS
- Liste:
- cmp al,'I' ;Liste erstellen
- jne Para_2
- mov CS:Parameter,'I'
- jmp Start
- Para_2:
- cmp al,'i'
- jne Para_3
- mov CS:Parameter,'I'
- jmp Start
- Para_3:
- cmp al,'+'
- je Para_4
- cmp al,'-'
- je Para_4
- Ausgabe Fehler
- jmp DOS
- Para_4:
- mov CS:Parameter,al
- mov al,DS:0083h
- mov CS:Treiber_Nr,al
-
- Start:
-
- ;- Treiberliste erstellen und auf Diskette speichern?
-
- mov al,CS:Parameter
- cmp al,'I'
- jne Ende_I ;nein
- call create_list ;Liste anlegen
-
- ;- Treiberliste erstellen und im RAM ablegen ----
- call init_Driver
- call first_Driver
- weiter:
- call next_Driver
- mov ax,CS:last_Drv ;wenn
- cmp al,'?' ;weitere Treiber?
- je weiter
- ;- Werte in Treiberliste eintragen --------------
- call insert_list
- jmp Ende
- Ende_I:
- ;------- Treiber entfernen oder wieder einhängen? ---------
- ;---> +
- mov al,CS:Parameter
- cmp al,'+'
- jne Ende_plus
- call read_list
- mov dl,CS:Lesefehler
- cmp dl,1 ;existiertt Treiber.lst?
- je Ende ;NEIN --> Ende
- call insert_Driver
- jmp Ende
- Ende_plus:
- ;---> -
- mov al,CS:Parameter
- cmp al,'-'
- jne Ende_minus
- call read_list
- call remove_Driver
- jmp Ende
- Ende_minus:
- ;-----------------------------------------------------------
- Ende:
- mov bx,CS:Handle
- cmp bx,'##'
- je DOS
-
- ;------- Handle schließen ----------
- mov ah,62
- int 21h ;CLOSE Handle
-
-
- DOS:
- ;------- zurück zu DOS -------------
- mov ah,4Ch ;zurück zu DOS
- int 21h
- end Programm