home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* DISKSAVE.ASM *
- ;* Datenschutz für Disketten/Festplatten *
- ;* (c) 1989 by Christian Ramsauer & TOOLBOX *
- ;* ------------------------------------------------------- *
- ;* Assembler : Turbo Assembler 1.0 *
- ;* tasm disksave.asm *
- ;* tlink disksave.obj *
- ;* exe2bin disksave.exe disksave.com *
- ;* ------------------------------------------------------- *
- code segment
- assume cs:code, ds:code, es:code
- org 100h
-
- START: jmp BEGIN
-
- ;* Varibalen und Pufferspeicher
-
- res db 255,255,255,255
- leer db 512 dup(0)
-
- bootsec db 11 dup(0)
- bprosec dw 0 ; Bytes pro Sektor
- sproclu db 0 ; Sektoren pro Cluster
- bootsecs dw 0 ; Anzahl der Bootsektoren
- fats db 0 ; Kopien der FAT
- rootdir dw 0 ; Einträge im Rootdirectory
- secs dw 0 ; Anzahl der Sektoren
- disktyp db 0 ; Diskettentyp
- secinfat dw 0 ; Sektoren in der FAT
- puffer dw 512 dup(0)
-
- vergl dw 0
- status db 0
- laufwerk dw 0
-
- err1 db "Ungültige Laufwerksangabe !",13,10,7,36
- err2 db "Fehler beim Lesen/Schreiben"
- db " eines Sektors !",13,10,7,36
-
- ;* Laufwerk ermitteln, in dem die Diskette/Platte
- ;* ge- bzw. entsichert werden soll
-
- GetDrive proc near
- mov al,ds:[80h]
- cmp al,2
- jb LAB2
- mov al,ds:[82h]
- cmp al,90
- jle LAB1
- sub al,32
- LAB1: cmp al,90
- jg LAB2
- cmp al,65
- jl LAB2
- sub al,65
- mov ah,0
- mov laufwerk,ax
- ret
- LAB2: mov dx,offset err1
- mov ah,9
- int 21h
- jmp ENDE
- GetDrive endp
-
- ;* Abfangen eines Fehlers beim Lesen bzw. Schreiben
- ;* eines Sektors auf Diskette/Platte
-
- Error proc near
- jnc E_END
- mov dx,offset err2
- mov ah,9
- int 21h
- jmp ENDE
- E_END: ret
- Error endp
-
- ;* Interrupt 25h ausführen
- ;* Lesen eines Sektors
- ;* Sektornummer muß in DX übergeben werden
- ;* Puffer: DS:BX
-
- Int25h proc near
- mov ax,laufwerk
- mov cx,1
- int 25h
- call error
- popf
- ret
- Int25h endp
-
- ;* Interrupt 26h ausführen
- ;* Schreiben eines Sektors
- ;* Sektornummer muß in DX übergeben werden
- ;* Puffer: DS:BX
-
- Int26h proc near
- mov ax,laufwerk
- mov cx,1
- int 26h
- call error
- popf
- ret
- Int26h endp
-
- ;* Bootsektor (Nummer 0) von Diskette/Platte lesen
- ;* und ab der Adresse von »bootsec« ablegen
-
- GetBootSec proc near
- mov dx,0
- mov bx,offset bootsec
- call Int25h
- ret
- GetBootSec endp
-
- ;* Ersten Sektor des Directories einlesen
- ;* und geändert wieder zurückschreiben
-
- AlterDir proc near
- mov bx,offset puffer
- mov ax,secinfat
- mul fats
- add ax,bootsecs
- mov dx,ax
- call Int25h
- mov ah,[bx+16]
- mov al,[bx]
- mov status,al
- mov [bx+16],al
- mov [bx],ah
- call Int26h
- ret
- AlterDir endp
-
- ;* Löschen der ersten FAT auf der Diskette/Platte
- ;* bis auf die drei bzw. vier reservierten Bytes
-
- DelFat1 proc near
- mov ax,secinfat
- add ax,bootsecs
- mov vergl,ax
- mov dx,bootsecs
- WEITER: mov bx,offset leer
- cmp dx,bootsecs
- jnz NOBOOT
- push dx
- xor dx,dx
- mov ax,secs
- mov cl,sproclu
- mov ch,0
- div cx
- pop dx
- cmp ax,4096
- ja FAT16
- FAT12: sub bx,3
- mov ah,disktyp
- mov [bx],ah
- jmp NOBOOT
- FAT16: sub bx,4
- mov ah,disktyp
- mov [bx],ah
- NOBOOT: call Int26h
- inc dx
- cmp dx,vergl
- jnz WEITER
- ret
- DelFat1 endp
-
- ;* Wiederherstellung der ersten FAT durch Kopieren
- ;* der zweiten FAT an die Stelle der ersten
-
- RestoreFat proc near
- mov ax,secinfat
- add ax,bootsecs
- mov vergl,ax
- mov dx,bootsecs
- add dx,secinfat
- WHILE: mov bx,offset puffer
- call Int25h
- sub dx,secinfat
- mov bx,offset puffer
- call Int26h
- inc dx
- cmp dx,vergl
- je P_END
- add dx,secinfat
- jmp WHILE
- P_END: ret
- RestoreFat endp
-
- ;* Hauptteil des Programms
-
- BEGIN: Push cs
- Pop ds
- call GetDrive
- call GetBootSec
- call AlterDir
- mov al,0
- cmp status,al
- jz RESTORE
- call DelFat1
- jmp ENDE
-
- RESTORE: call RestoreFat
-
- ENDE: mov ah,4Ch
- int 21h
-
- code ends
- end START
- ;* ------------------------------------------------------- *
- ;* ENDE von DISKSAVE.ASM *