home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / dskutl / protect.arc / PROTECT.ASM next >
Assembly Source File  |  1988-05-11  |  4KB  |  128 lines

  1. ;
  2. ; PROTECT.ASM - Write protect tab simulation for hard disk
  3. ;
  4. CSEG    SEGMENT
  5.     ASSUME CS:CSEG
  6.     ORG    100H
  7. ;
  8. START:        JMP    INITIALIZE
  9. ;
  10. OLDINT13    DD    ?    ; save original INT 13h vector
  11. SWITCH        DB    0Fh    ; ON/OFF "switch" for write protect tab
  12. ;
  13. ; new protected INT 13h vector (BIOS disk I/O interrupt service)
  14. ;
  15. NEWINT13    PROC    FAR
  16.         CMP    AH, 03h        ; check for disk write function
  17.         JZ    CHECKSTAT    ; trap write request
  18. ;
  19.         CMP    AH, 05h        ;   disk format function
  20.         JZ    CHECKSTAT    ; trap format request
  21. ;
  22.         CMP    AH, 0Bh        ;   write long function (AT, PS/2)
  23.         JZ    CHECKSTAT    ; trap write long request
  24. ;
  25. CONTINUE:    JMP    CS:[OLDINT13]    ; service disk I/O request
  26. ;
  27. CHECKSTAT:    CMP    SWITCH, 00h    ; protect switch ON ?
  28.         JNZ    CONTINUE    ; no, skip disk I/O trap
  29. ;
  30.         CMP    DL, 00h        ; floppy A: selected ?
  31.         JZ    CONTINUE    ; yes, skip disk I/O trap
  32. ;
  33.         CMP    DL, 01h        ; floppy B: selected ?
  34.         JZ    CONTINUE    ; yes, skip disk I/O trap
  35. ;
  36. ABORT:        MOV    AH, 03h        ; set write protect error code
  37.         STC            ; set failure status
  38.         RET    2        ; and return with existing flags
  39. ;
  40. NEWINT13    ENDP
  41. ;
  42. ; PROTECT program installation
  43. ; search for PROTECT program in memory first
  44. ;
  45. INITIALIZE:    MOV    DX, OFFSET NEWINT13    ; address to begin search
  46.         MOV    AX, CS        ; DS:SI points to Destination
  47.         MOV    ES, AX        ; ES:DI points to Source
  48. ;
  49. NEXTSEG:    DEC    AX        ; search previous segment
  50.         MOV    DS, AX        ; load new segment to search
  51.         MOV    SI, DX        ; | point to head of string
  52.         MOV    DI, DX        ; | point to head of string
  53. ;
  54. ; Confirmation that program is in memory occurs when four words match
  55. ;
  56.         MOV    CX, 0004h    ; set match at four words
  57.         CLD            ; clear DF for auto-increment
  58.         REPE    CMPSW
  59.         JNZ    NOTFOUND    ; no match, try next segment
  60. ;
  61. ; May have found PROTECT program. Copy is identified by SWITCH = 0Fh
  62. ;
  63.         CMP    DS:SWITCH, 0Fh    ; is this an installed copy ?
  64.         JNZ    TOGGLESW    ; if so, toggle switch
  65. ;
  66. NOTFOUND:    CMP    AX, 0001h    ; stop searching if in low memory
  67.         JNZ    NEXTSEG
  68. ;
  69. ; Did not find PROTECT in memory. Must install program.
  70. ;
  71.         MOV    SWITCH, 00h    ; turn switch on
  72.                     ; Get old 13h vector from the BIOS
  73.         MOV    AX, 3513h    ; AH = 35h (Get interrupt vector func)
  74.                     ; AL = 13h (get vector 13h)
  75.         INT    21h        ; invoke BIOS interrupt service
  76. ;
  77. ; Save old 13h vector
  78. ;
  79.         MOV    WORD PTR CS:[OLDINT13], BX
  80.         MOV    WORD PTR CS:[OLDINT13 + 2], ES    ; old address saved
  81. ;
  82.         PUSH    CS
  83.         POP    DS        ; Set DS to CS
  84. ;
  85. ; Print message on control console
  86. ;
  87.         MOV    DX, OFFSET PROTECT_ON    ; point to head of message
  88.         MOV    AH, 09h        ; AH = 09h (print string function)
  89. ;
  90.         INT    21h        ; invoke BIOS interrupt service
  91. ;
  92. ; Create new 13h vector (pointing to this program)
  93. ;
  94.         MOV    DX, OFFSET NEWINT13
  95.                     ; Set new INT 13h vector with BIOS
  96.         MOV    AX, 2513h    ; AH = 25h (Set interrupt vector func)
  97.                     ; AL = 13h (set vector 13h)
  98.         INT    21h        ; invoke BIOS interrupt service
  99. ;
  100.         MOV    DX, OFFSET INITIALIZE    ; bytes to leave resident
  101.         INT    27h        ; Terminate and stay resident
  102. ;
  103. ; -------- Installation completed --------
  104. ;
  105. ; Copy of program found in memory. Just toggle switch and exit.
  106. ;
  107. TOGGLESW:    NOT    DS:SWITCH    ; value of DS set during search
  108.         CMP    DS:SWITCH, 00h    ; is switch ON ?
  109.         JZ    ON        ; no, turn switch ON
  110. ;
  111.         MOV    DX, OFFSET PROTECT_OFF    ; point to head of message
  112.         JMP    EXIT            ; run to the nearest exit
  113. ON:        MOV    DX, OFFSET PROTECT_ON    ; point to head of message
  114. EXIT:        MOV    AH, 09h        ;    (print string function)
  115.         PUSH    CS
  116.         POP    DS        ; restore DS from CS
  117.         INT    21h        ; put message on control console
  118.         INT    20h        ; return to DOS
  119. ;
  120. ; Console Messages
  121. ;
  122. PROTECT_ON    DB    "Fixed-disk write protect tab simulation is ON$"
  123. PROTECT_OFF    DB    "Fixed-disk write protect tab simulation is OFF$"
  124. ;
  125. CSEG        ENDS
  126. ;
  127.         END    START
  128.