home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / diskutil / protect.asm < prev    next >
Assembly Source File  |  1994-03-04  |  6KB  |  159 lines

  1. Date: Mon, 25 Jan 88 13:31:46 SET
  2. To: info-ibmpc@walker-emh.ARPA
  3. From: RZACIU%DBNUAMA1.BITNET@CUNYVM.CUNY.EDU
  4. Subject: PROTECT.ASM program submission
  5.  
  6. Date: 25 January 1988, 13:22:33 SET
  7. From: Rainer Kleinrensing, RZACIU at DBNUAMA1 in BITNET
  8. To:   INFO-IBMPC at WALKER-EMH
  9.  
  10. I got PROTECT.ASM form Simtel20 or so (I don't remember exactly).
  11. This program realizes a hard disk write protect by intercepting
  12. INT13h.  In the last BYTE issue 'inside the IBM PCs' I saw some
  13. additional ROM Bios codes I thought to be important for this program,
  14. so I changed PROTECT.ASM to check those codes.  The program is quite
  15. useful when testing software that you fear could do harm to your hard
  16. disk, such as deleting files or writing nasty things.  When you run
  17. PROTECT, hard disk protection is on.  Each additional run toggles
  18. protection off or on.  Bios codes that aren't considered dangerous
  19. (such as disk read) are passed through to the original INT handler.
  20. The dangerous ones are intercepted, PROTECT returns from the interrupt
  21. with the error code for write protected disk, so you get the Abort,
  22. Retry, Ignore prompt.  Regrettably I lost the name of the author of
  23. this very useful program.
  24.  
  25.    Rainer Kleinrensing
  26.  
  27. =========================== cut here for PROTECT.ASM =========================
  28. ; protect.asm -- resident write protect for hard disk
  29. ; from pc magazine 13 jan 1987 page 320
  30. ; additional ROM BIOS codes taken from BYTE 1987 IBM issue, p.176
  31. ;
  32. cseg        segment
  33.             assume cs:cseg
  34.             org    100h
  35. ;
  36. start:      jmp    initialize
  37. ;
  38. oldint13    dd     ?            ; original interrupt 13 vector
  39. switch      db     0fh          ; on/off switch for protection
  40. ;
  41. ; new interrupt 13 (bios disk i/o)
  42. ; --------------------------------
  43. newint13    proc   far
  44.             cmp    ah,03h       ; see if doing disk write
  45.             jz     checkstat    ; if writing then check drive number
  46. ;
  47.             cmp    ah,05h       ; see if doing disk format
  48.             jz     checkstat    ; if formatting then check drive number
  49. ;
  50.             cmp    ah,06h       ; XT: format track & set bad sector flags
  51.             jz     checkstat
  52. ;
  53.             cmp    ah,07h       ; XT: format DRIVE starting at desired track
  54.             jz     checkstat
  55. ;
  56.             cmp    ah,0Bh       ; write long
  57.             jz     checkstat
  58. ;
  59.             cmp    ah,0Fh       ; write sector buffer
  60.             jz     checkstat
  61. ;
  62.             cmp    ah,13h       ; XT: drive diagnostic
  63.             jz     checkstat
  64. ;
  65.             cmp    ah,19h       ; PS/2: park heads
  66.             jz     checkstat
  67. ;
  68.             cmp    ah,1ah       ; PS/2: ESDI disk, format unit
  69.             jz     checkstat
  70. ;
  71. continue:   jmp    cs:[oldint13]; allow operation to proceed
  72. ;
  73. checkstat:  cmp    switch,00h   ; is protect switch on?
  74.             jnz    continue     ; if not then proceed
  75.             cmp    dl,00h       ; was drive a selected?
  76.             jz     continue     ; if yes, then proceed
  77.             cmp    dl,01h       ; was drive b selected?
  78.             jz     continue     ; if yes, then proceed
  79. ;
  80. ; abort if drive was c or higher
  81. ;
  82. abort:      mov    ah,03h       ; set write protect error code
  83.             stc                 ; set failure status
  84.             ret    2            ; return with existing flags
  85. ;
  86. newint13    endp
  87. ;
  88. ; program installation
  89. ; begin by searching for an existing copy of code
  90. ; -----------------------------------------------
  91. ;
  92. initialize: mov    dx,offset newint13    ; offset to begin code search
  93.             mov    ax,cs        ; ds:si points to destination
  94.             mov    es,ax        ; es:di points to source
  95. ;
  96. nextseg:    dec    ax           ; search previous segment
  97.             mov    ds,ax        ; load new segment to search
  98.             mov    si,dx        ; point to beginning of string
  99.             mov    di,dx        ; point to beginning of string
  100. ; 4 words must match to confirm a copy of program exists
  101.             mov    cx,0004h     ; four words must match
  102.             cld                 ; clear df for autoincrement
  103.             repe   cmpsw
  104.             jnz    notfound     ; if no match then keep trying
  105. ;
  106. ; a local copy of the program may exist in an input buffer
  107. ; any local copies may be identified by switch set to 0fh
  108.             cmp    ds:switch,0fh; is this an installed copy?
  109.             jnz    togglesw     ; if real copy then toggle switch
  110. notfound:   cmp    ax,0001h     ; stop searching at low memory
  111.             jnz    nextseg      ; search next segment
  112. ;
  113. ; if code not found then it must be installed as follows
  114. ;
  115.             mov    switch,00h   ; set switch to on
  116.             mov    ax,3513h     ; setup to get old vector
  117.             int    21h
  118. ;
  119. ; put old vector in memory
  120. ;
  121.             mov    word ptr cs:[oldint13],bx
  122.             mov    word ptr cs:[oldint13+2],es
  123. ;
  124.             push   cs
  125.             pop    ds           ; set ds to cs
  126. ;
  127. ; send message, exit and remain resident
  128.             mov    dx, offset protect_on
  129.             mov    ah,09h       ; print string function call
  130.             int    21h
  131. ;
  132. ; make interrupt 13 point to this program
  133.             mov    dx,offset newint13
  134.             mov    ax,2513h     ; set new interrupt 13
  135.             int    21h
  136. ;
  137.             mov    dx, offset initialize    ; number of bytes to stay
  138.             int    27h          ; terminate and stay resident
  139. ;
  140. ; if program already exists in memory then only toggle switch
  141. togglesw:   not    ds:switch    ; ds has been set by switch
  142.             cmp    ds:switch,00h; is switch on?
  143.             jz     on
  144.             mov    dx, offset protect_off
  145.             jmp    exit
  146. on:         mov    dx, offset protect_on
  147. exit:       mov    ah,09h       ; print string function call
  148.             push   cs
  149.             pop    ds           ; restore ds
  150.             int    21h
  151.             int    20h          ; exit to dos
  152. ;
  153. protect_on  db     "Hard disk protection On$"
  154. protect_off db     "Hard disk Protection Off$"
  155. cseg        ends
  156. ;
  157.             end    start
  158. ======================== End of PROTECT.ASM ===========================
  159.