home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / dskutl / passwrd6.arc / PW.8 < prev    next >
Text File  |  1987-02-17  |  10KB  |  210 lines

  1. ; TITLE PW.8 - assembles to PW.SYS device driver (use A86 assembler)
  2. ; Rev by John R. Petrocelli   02/25/85
  3. ; Rev by John R. Petrocelli   04/30/85
  4. ; Rev by Durrell Drummond     10/10/86 
  5. ; Completely redone by Bob Montgomery 1/10/87
  6.  
  7. Lf  equ  0Ah       ;Line feed char
  8. Cr  equ  0Dh       ;Carriage return char
  9. Esc equ  1Bh       ;Escape char
  10. Bell equ 7         ;Bell char
  11. Tab equ  9         ;Tab char
  12.  
  13.     org 0          ;Required for a device driver
  14. Start:
  15.     dw  -1,-1      ;=>only 1 device is defined in this file
  16.     dw  8000h      ;=>char dev, non IOCTL
  17.     dw  Strategy   ;pointer to the installation procedure
  18.     dw  Interupt   ;pointer to the proc that handles all services
  19.     db  'PWXYZQPR' ;8-byte string of device name; should be something weird
  20.              ; or strange things may happen if you have a file by this name.
  21. ;===========================================================================
  22. ; These are the program variables and constants.
  23. RHoffset dw   ?                        ;Request Header offset
  24. RHseg    dw   ?                        ;Request Header segment
  25. Password db   8,'PASSWORD'             ;# chars and password (16 chars max)
  26. Userword db   16                       ;Max chars DOS to accept
  27. Wordlen  db   ?                        ;# chars in user word
  28. Wordbuff db   16 DUP(?)                ;User word starts here
  29. Tries    db   3                        ;Allow 3 tries before lockout
  30. Breakoff dw   ?                        ;Store old Break offset here
  31. Breakseg dw   ?                        ;Store old Break segment here
  32.  
  33. ; Messages ==================================================================
  34. MSG_1 db Esc,'[2J',ESC,'[9;1f'  ;Clear screen and move to row 10, col 1
  35. MSG1  db Esc,'[31;40m',Cr,Lf,   ;make output visible, red on black
  36.       db 4 dup(Tab),'Enter Password' ;Move 32 columns right (Tab 4)
  37.       db Esc,'[8m$'              ;make input invisible
  38. MSG_2 db Esc,'[0m'               ;make output visible
  39.       db Cr,Lf,4 dup(Tab)          ;Move 32 columns right
  40.       db 'Password accepted',Esc,'[33;40m$' ;Print msg, make brown on black
  41. MSG_3 db Esc,'[0m',Cr,Lf         ;make output visible
  42.       db 4 dup(Tab),'Wrong-Try again$';Move 32 columns right
  43. MSG_4 db Esc,'[0m',esc,'[2J'     ;make output visible & cls
  44.       db Esc,'[12;26f'           ;Move to row 12, col 26
  45.       db '3 STRIKES AND YOU ARE OUT...' ;Print message
  46.       db Esc,'[13;31f',ESC,'[31m',201,15 dup(205),187 ;Top border
  47.       db Esc,'[14;31f',186       ;Line 14, col 31 left border
  48.       db Esc,'[5m ACCESS DENIED ' ;Make output blink
  49.       db Esc,'[0;31m',186        ;Non-blink right border
  50.       db Esc,'[15;31f',200,15 dup(205),188 ;Row15, col 31 bottom border
  51.       db Esc,'[8m  ',8,'$'       ;Make invisible and bacspace
  52.  
  53. ;=====================================================================
  54. ;Ctrl-Break vector is pointed here, so it does an IRET; disables Break.
  55. Dummyret: iret                    ;Return from interrupt    
  56. ;=====================================================================
  57.  
  58. ; Subroutines 
  59. ; --------------------------------------------------------------------
  60. ; The following disables Ctrl-Break by pointing it to a dummy IRET.
  61. ; Old break vector is saved so it may be restored later.
  62.  
  63. Askpw:   mov  ds,cs               ;Set ds=cs
  64.          mov  ax,351Bh            ;Get Break (Int 1Bh) vector
  65.          int  21h                 ;from DOS
  66.          mov  Breakoff,bx         ;Save it for later
  67.          mov  Breakseg,es
  68.          mov  es,cs               ;Set es=cs
  69.          mov  dx,Dummyret         ;Set Break vector to IRET 
  70.          mov  ax,251Bh            ;in this code
  71.          int  21h                 ;thru DOS
  72.  
  73. ; Now, prompt the user for the correct password and locks up system
  74. ; if not given in 'Tries' attempts.
  75.  
  76. ; Set CL for allowed tries and point to message.
  77.          xor  cx,cx               ;Set Cx=0
  78.          mov  cl,Tries            ;Set Cl=# tries allowed
  79.          mov  dx,offset Msg_1     ;Point to ANSI cursor command
  80.          jmp  short prt_it        ;Print it and prompt
  81. ;Come here for next retry if wrong password given.
  82. Nxttry:  mov  al,Bell             ;Bell char
  83.          mov  ah,0Eh              ;Sound bell
  84.          int  10h                 ;using video I/O
  85.          mov  dx, offset Msg1     ;Point to prompt
  86. Prt_it:  push cx                  ;Save # tries
  87.          mov  ah,9                ;Print it
  88.          int  21h                 ;using DOS service
  89. ;Clear buffer, and get user word; 2nd byte is # char, word starts 3rd byte.
  90.          mov  dx,offset Userword  ;Clear keyboard buffer
  91.          mov  ah,12               ;using DOS function 12
  92.          mov  al,10               ;and then get new user word up to CR.
  93.          int  21H                 ;using DOS function 10
  94.          mov  si,offset Wordlen   ;Point to # char in user word
  95.          mov  di,offset Password  ;Point to # char in password
  96.          xor  cx,cx               ;Set Cx=0
  97.          mov  cl,[si]             ;Get # chars in user word in cx
  98.          cmpsb                    ;Same as # in password (inc si & di)?
  99.          jne  wrong               ;No
  100.          call Convup              ;Convert user word to upper case
  101.          repe cmpsb               ;Compare while chars are equal
  102.          cmp  cl,0                ;All chars same?
  103.          je   OK                  ;Yes
  104. ; Wrong password was given, so say so and see if any tries left.
  105. Wrong:   pop  cx                  ;Get # tries left
  106.          mov  dx,offset msg_3     ;Print 'wrong password'
  107.          mov  ah,9                ;using DOS function 9
  108.          int  21h
  109.          loopnz Nxttry            ;Dec cx and try again if not 0
  110. ; All tries have been used, so lock up the system.
  111.          mov  dx, offset Msg_4    ;Print '3 strikes out-access denied'
  112.          mov  ah,9                ;using DOS funtion 9
  113.          int  21h
  114.          cli                      ;Disable interrupts (Cntrl-Alt-Del)
  115. Locked:  jmp  Locked              ;Put into an endless loop to lock-up
  116.  
  117. ; Come here if correct password was given.
  118. OK:      pop  cx                  ;Remove # tries from stack
  119.          mov  dx,offset Msg_2     ;Print 'Password accepted'
  120.          mov  ah,9                ;using DOS function 9
  121.          int  21h
  122.  
  123. ; Now, restore the old Break vector.
  124.          mov  ds,Breakseg         ;Set old Break vector to enable Break
  125.          mov  dx,Breakoff
  126.          mov  ax,251Bh            ;thru DOS
  127.          int  21h
  128.          ret                      ;and return
  129. ;----------------------------------------------------------------------
  130. ; This sub will convert the string at DS:SI to upper case; Cx=# chars.
  131.  
  132. Convup:  push  ax,cx,ds,es,si,di  ;Save all
  133.          mov  es,ds               ;Set ES=DS
  134.          mov  di,si               ;Set DI=SI
  135. Chkchr:  lodsb                    ;Get char at DS:SI, inc SI
  136.          cmp  al,'a'              ;< a?
  137.          jl   Stbyte              ;Yes
  138.          cmp  al,'z'              ;> z?
  139.          jg   Stbyte              ;Yes
  140.          sub  al,20h              ;No, convert to upper case
  141. Stbyte:  stosb                    ;Store char at ES;DI, inc DI
  142.          loop Chkchr              ;Do all chars (until Cx=0)
  143.          pop  di,si,es,ds,cx,ax   ;Restore all registers
  144.          ret                      ;and return
  145.  
  146. ; End of subroutines
  147. ;======================================================================
  148.  
  149. ; The program LOCK.COM enters here by calling INT 66h.
  150. Lock1:   push ds,es,ax,bx,cx,dx,si,di  ;Save all
  151.          call Askpw               ;Get password from user
  152. Exit1:   pop  di,si,dx,cx,bx,ax,es,ds   ;Restore all registers
  153.          retf                     ;and return to DOS
  154.  
  155.  
  156. ;======================================================================
  157.  
  158. ; This is the procedure called by DOS to process the command in
  159. ; the Request Header. Should preserve the environment-restore when done.
  160.  
  161. Interupt: push ds,es,ax,bx,cx,dx,si,di  ;Save all
  162.          mov  ds,cs               ;Set ds=cs
  163.          mov  bx,RHoffset         ;Point ES:Bx to Request Header
  164.          mov  es,RHseg
  165.  
  166.       es cmp  b[bx+2],0           ;Command=0 (initialize)?
  167.          je   Init                ;Yes, do initialization
  168. ; Should only be called to initialize; any other is error so return 'done'.
  169. Exit: es or   w[bx+3],100h        ;No, set status=done
  170.          jmp  short Exit1         ;and exit to DOS
  171.  
  172. ;=========================================================================
  173.  
  174. ; This is the INITialize code; free memory starts here after initialize.
  175. Init:    mov  dx,Lock1            ;Point to interrupt 66h routine
  176.          mov  ax,2566h            ;Save Int 66 vector thru DOS
  177.          int  21h
  178.          xor  cx,cx               ;Set Cx=0
  179.          mov  si,offset Password  ;Point to # char in password
  180.          lodsb                    ;Get # char in al, inc si
  181.          mov  cl,al               ;Cx=# chars
  182.          push es,bx               ;Save RH header address
  183.          call Convup              ;Convert password to upper case
  184.          call Askpw               ;Get password from user
  185. ; The following sets the vector for INT 66h to the location of Lock
  186. ; so the LOCK.COM program can do a password check using the same code.
  187.          pop  bx,es               ;Restore RH pointer
  188.       es mov  w[bx+14],Init       ;Save pointer to Init as start of free
  189.       es mov  w[bx+16],cs         ;memory (after installation) in RH.
  190.          jmp  Exit                ;and return to DOS
  191.  
  192. ;===========================================================================
  193. ; The STRATEGY proc stores the location of the Request Header (passed by DOS 
  194. ; in ES:BX) here. The INTERUPT proc gets it to find the request from DOS.
  195.  
  196. ; Request Header format:
  197. ; Offset   Content
  198. ; 0        Byte-length (of request header)
  199. ; 1        Byte-unit code (if more than 1 device controlled)
  200. ; 2        Byte-command (0 thru Ch; 0=INITialize)
  201. ; 3,4      Word-status (Bit 8=done, bit 15=error, bits 0-3=error code)
  202. ; 5-D      8 bytes-reserved for DOS
  203. ; E-       Data-ending address if code=0, otherwise data to transfer
  204.  
  205. Strategy: cs mov RHoffset,BX      ;Save Request Header offset
  206.       cs mov RHseg,ES             ;Save Request Header segment
  207.          Retf                     ;and return (far)
  208.  
  209.          end  Start
  210.