home *** CD-ROM | disk | FTP | other *** search
/ PC Underground / UNDERGROUND.ISO / noreset / no_rst.asm next >
Assembly Source File  |  1995-07-28  |  3KB  |  97 lines

  1. data segment public
  2. start_message: db 'reset no longer possible',0dh,0ah,'$'
  3. buffer:   db 40d                ;length of input buffer
  4.           db 40 dup (0)         ;buffer
  5. old_int9  dd 0                  ;old interrupt handler
  6. data ends
  7.  
  8. code segment public
  9. assume cs:code,ds:data
  10. handler9 proc near              ;new interrupt 9 handler
  11.   push ax                       ;store used register
  12.   push bx
  13.   push ds
  14.   push es
  15.   mov ax,data                   ;load ds
  16.   mov ds,ax
  17.  
  18.   in al,60h                     ;read characters from keyboard in al
  19.  
  20.   xor bx,bx                     ;es to segment 0
  21.   mov es,bx
  22.   mov bl,byte ptr es:[417h]     ;load keyboard status in bl
  23.  
  24.   cmp al,83d                    ;scan code of  Del key ?
  25.   jne no_reset                  ;no, then no reset
  26.  
  27.   and bl,0ch                    ;mask Ctrl and Alt
  28.   cmp bl,0ch                    ;both pressed ?
  29.   jne no_reset                  ;no, then no reset
  30.  
  31. block:                          ;reset or break, so block
  32.   mov al,20h                    ;send EoI to interrupt controller
  33.   out 20h,al
  34.   jmp finished                  ;and exit interrupt
  35.  
  36. no_reset:                       ;no reset, now check Break
  37.   cmp al,224d                   ;extended key ?
  38.   je poss_Break                 ;yes -> Break possibly triggered
  39.   cmp al,46d                    ;'C' key ?
  40.   jne legal                     ;no -> legal key
  41. poss_Break:
  42.   test bl,4                     ;test keyboard status for Ctrl
  43.   jne block                     ;pressed, then block
  44.  
  45.  
  46. legal:                          ;legal key -> call old handler
  47.   pushf
  48.   call dword ptr [old_int9]     ;call original handler
  49. finished:
  50.   pop es
  51.   pop ds                        ;get back register
  52.   pop bx
  53.   pop ax
  54.   iret
  55. handler9 endp
  56.  
  57. start proc near
  58.   mov ax,data                   ;load ds
  59.   mov ds,ax
  60.   mov dx,offset start_message   ;load dx with offset of message
  61.   mov ah,09h                    ;output message
  62.   int 21h
  63.  
  64.   mov ax,3509h                  ;read old interrupt vector
  65.   int 21h
  66.   mov word ptr old_int9,bx      ;and store
  67.   mov word ptr old_int9 + 2, es
  68.  
  69.   push ds                       ;store ds
  70.   mov ax,cs                     ;load with cs
  71.   mov ds,ax
  72.   mov dx,offset handler9        ;load offset of handler also
  73.   mov ax,2509h                  ;set vector
  74.   int 21h
  75.   pop ds
  76.  
  77. ;-------------------------------------------------------------------------
  78. ;instead of the DOS call, you can also call your main program here
  79.  
  80.   mov ah,0ah                    ;input character string
  81.   lea dx,buffer                 ;as sample main program
  82.   int 21h
  83. ;-------------------------------------------------------------------------
  84.  
  85.   push ds
  86.   lds dx,old_int9               ;set old vector again
  87.   mov ax,2509h
  88.   int 21h
  89.   pop ds
  90.  
  91.   mov ax,4c00h                  ;end program
  92.   int 21h
  93. start endp
  94.  
  95. code ends
  96. end start
  97.