home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS - Coast to Coast
/
simteldosarchivecoasttocoast.iso
/
diskutil
/
protect.asm
< prev
next >
Wrap
Assembly Source File
|
1994-03-04
|
6KB
|
159 lines
Date: Mon, 25 Jan 88 13:31:46 SET
To: info-ibmpc@walker-emh.ARPA
From: RZACIU%DBNUAMA1.BITNET@CUNYVM.CUNY.EDU
Subject: PROTECT.ASM program submission
Date: 25 January 1988, 13:22:33 SET
From: Rainer Kleinrensing, RZACIU at DBNUAMA1 in BITNET
To: INFO-IBMPC at WALKER-EMH
I got PROTECT.ASM form Simtel20 or so (I don't remember exactly).
This program realizes a hard disk write protect by intercepting
INT13h. In the last BYTE issue 'inside the IBM PCs' I saw some
additional ROM Bios codes I thought to be important for this program,
so I changed PROTECT.ASM to check those codes. The program is quite
useful when testing software that you fear could do harm to your hard
disk, such as deleting files or writing nasty things. When you run
PROTECT, hard disk protection is on. Each additional run toggles
protection off or on. Bios codes that aren't considered dangerous
(such as disk read) are passed through to the original INT handler.
The dangerous ones are intercepted, PROTECT returns from the interrupt
with the error code for write protected disk, so you get the Abort,
Retry, Ignore prompt. Regrettably I lost the name of the author of
this very useful program.
Rainer Kleinrensing
=========================== cut here for PROTECT.ASM =========================
; protect.asm -- resident write protect for hard disk
; from pc magazine 13 jan 1987 page 320
; additional ROM BIOS codes taken from BYTE 1987 IBM issue, p.176
;
cseg segment
assume cs:cseg
org 100h
;
start: jmp initialize
;
oldint13 dd ? ; original interrupt 13 vector
switch db 0fh ; on/off switch for protection
;
; new interrupt 13 (bios disk i/o)
; --------------------------------
newint13 proc far
cmp ah,03h ; see if doing disk write
jz checkstat ; if writing then check drive number
;
cmp ah,05h ; see if doing disk format
jz checkstat ; if formatting then check drive number
;
cmp ah,06h ; XT: format track & set bad sector flags
jz checkstat
;
cmp ah,07h ; XT: format DRIVE starting at desired track
jz checkstat
;
cmp ah,0Bh ; write long
jz checkstat
;
cmp ah,0Fh ; write sector buffer
jz checkstat
;
cmp ah,13h ; XT: drive diagnostic
jz checkstat
;
cmp ah,19h ; PS/2: park heads
jz checkstat
;
cmp ah,1ah ; PS/2: ESDI disk, format unit
jz checkstat
;
continue: jmp cs:[oldint13]; allow operation to proceed
;
checkstat: cmp switch,00h ; is protect switch on?
jnz continue ; if not then proceed
cmp dl,00h ; was drive a selected?
jz continue ; if yes, then proceed
cmp dl,01h ; was drive b selected?
jz continue ; if yes, then proceed
;
; abort if drive was c or higher
;
abort: mov ah,03h ; set write protect error code
stc ; set failure status
ret 2 ; return with existing flags
;
newint13 endp
;
; program installation
; begin by searching for an existing copy of code
; -----------------------------------------------
;
initialize: mov dx,offset newint13 ; offset to begin code search
mov ax,cs ; ds:si points to destination
mov es,ax ; es:di points to source
;
nextseg: dec ax ; search previous segment
mov ds,ax ; load new segment to search
mov si,dx ; point to beginning of string
mov di,dx ; point to beginning of string
; 4 words must match to confirm a copy of program exists
mov cx,0004h ; four words must match
cld ; clear df for autoincrement
repe cmpsw
jnz notfound ; if no match then keep trying
;
; a local copy of the program may exist in an input buffer
; any local copies may be identified by switch set to 0fh
cmp ds:switch,0fh; is this an installed copy?
jnz togglesw ; if real copy then toggle switch
notfound: cmp ax,0001h ; stop searching at low memory
jnz nextseg ; search next segment
;
; if code not found then it must be installed as follows
;
mov switch,00h ; set switch to on
mov ax,3513h ; setup to get old vector
int 21h
;
; put old vector in memory
;
mov word ptr cs:[oldint13],bx
mov word ptr cs:[oldint13+2],es
;
push cs
pop ds ; set ds to cs
;
; send message, exit and remain resident
mov dx, offset protect_on
mov ah,09h ; print string function call
int 21h
;
; make interrupt 13 point to this program
mov dx,offset newint13
mov ax,2513h ; set new interrupt 13
int 21h
;
mov dx, offset initialize ; number of bytes to stay
int 27h ; terminate and stay resident
;
; if program already exists in memory then only toggle switch
togglesw: not ds:switch ; ds has been set by switch
cmp ds:switch,00h; is switch on?
jz on
mov dx, offset protect_off
jmp exit
on: mov dx, offset protect_on
exit: mov ah,09h ; print string function call
push cs
pop ds ; restore ds
int 21h
int 20h ; exit to dos
;
protect_on db "Hard disk protection On$"
protect_off db "Hard disk Protection Off$"
cseg ends
;
end start
======================== End of PROTECT.ASM ===========================