150 lines
6.3 KiB
NASM
150 lines
6.3 KiB
NASM
To use it just type, from the dos prompt:
|
|
|
|
MASM NOCAD; (of course you need MASM)
|
|
LINK NOCAD; (and of course you need a linker)
|
|
NOCAD
|
|
|
|
If you type NOCAD once it has been loaded, it will tell you so.
|
|
I've used it with DOS 3.30, but it works just as well under DOS
|
|
2.00 and above.
|
|
If you have any comment of any kind please let me know.
|
|
And have a nice new decade everybody.
|
|
|
|
cut here: ************************************************************
|
|
page 255,132 ;just to get a nice list file
|
|
comment :
|
|
Program to prevent CTRL+ALT+DEL from restarting the system
|
|
WARNING: Once loaded, you only have three choices:
|
|
1) Turn power off
|
|
2) Use a reset button (not all the machines have one)
|
|
3) Generate INT 19h
|
|
|
|
WARNING: If you have a program that uses INT 0CDh, change
|
|
this value in the equates line below to the number
|
|
of a not used INT. This method is used because
|
|
there are too many programs that hook INT 9 Vector and
|
|
we can't be sure it always points to the end of our
|
|
notice (and start of our ISR).
|
|
|
|
NOTE: For memory references i use parentheses instead of
|
|
square brackets because of ASCII-EBCDIC translations.
|
|
It works the same under Microsoft's MASM 4.0
|
|
|
|
NOTE: NOCAD won't work if you press CTRL+ALT+DEL from
|
|
a program that hooked to INT 9 before NOCAD
|
|
(example: SideKick). Solution: Load NOCAD before
|
|
everything else.
|
|
|
|
|
|
ctrl equ 0100b ;bit map for ctrl key
|
|
alt equ 1000b ;bit map for alt key
|
|
free_vector equ 0CDh ;vector used to prevent double loading
|
|
;change it if your system uses INT 0CDh
|
|
nocad segment byte 'CODE'
|
|
assume cs:nocad, ds:msgs, es:nothing, ss:stack
|
|
Copyright db 'Antonio Quezada-Duarte ITESM ISC 296641 Monterrey '
|
|
db 'Nuevo Leon MEXICO'
|
|
Cright_Len equ $-Offset Copyright
|
|
new_int_9h proc near
|
|
push ax
|
|
push ds ;save registers
|
|
xor ax,ax
|
|
mov ds,ax ;point DS to BIOS data area
|
|
;well, actually BIOS data area
|
|
;starts at 0040:0000, but
|
|
; XOR AX,AX is faster than MOV AX,40h
|
|
mov al,ds:(417h) ;get keyboard flags
|
|
and al,ctrl+alt ;clear non relevant bits
|
|
cmp al,ctrl+alt ;compare to our map
|
|
jne go_ahead ;NO CTRL+ALT keys pressed
|
|
and byte ptr ds:(417h),not alt ;CTRL+ALT pressed
|
|
;clear ALT key bit to simulate
|
|
;ALT key is not pressed
|
|
go_ahead:
|
|
pushf ;old ISR returns with IRET
|
|
COMMENT :
|
|
The Following code stands for
|
|
|
|
CALL OLD_INT_9
|
|
Where OLD_INT_9 is a FAR PROC
|
|
this is faster than having the address of OLD_INT_9
|
|
stored in memory and doing a
|
|
CALL CS:(OLD_INT_9)
|
|
:
|
|
DB 9Ah
|
|
OLD_INT_9_OFS DW 0
|
|
OLD_INT_9_SEG DW 0 ;call old INT 9 ISR
|
|
|
|
pop ds
|
|
pop ax ;restore registers
|
|
iret ;return to caller
|
|
new_int_9h endp
|
|
begin proc near
|
|
push es ;save psp base address
|
|
mov dx,seg msgs
|
|
mov ds,dx
|
|
mov dx,offset msg_0
|
|
mov ah,9
|
|
int 21h
|
|
mov ax,3500h + free_vector
|
|
int 21h
|
|
mov di,bx ;ES:DI ===> start of INT 0CDh ISR
|
|
mov si,offset copyright
|
|
mov ax,cs
|
|
mov ds,ax ;DS:SI ===> THIS code copyright notice
|
|
mov cx,cright_len
|
|
cld
|
|
repe cmpsb ;compare
|
|
je loaded ;if equal then already loaded
|
|
mov ax,2500h + free_vector
|
|
mov dx,cs
|
|
mov ds,dx
|
|
mov dx,offset copyright
|
|
int 21h ;point free_vector INT vector to
|
|
;our copyright notice
|
|
mov ax,3509h
|
|
int 21h ;get pointer to INT 9 ISR
|
|
mov cs:old_int_9_ofs,bx
|
|
mov cs:old_int_9_seg,es ;put it IN the new INT 9 ISR
|
|
mov ax,2509h
|
|
mov dx,offset new_int_9h
|
|
push cs
|
|
pop ds
|
|
int 21h ;point INT 9 vector to our ISR
|
|
mov dx,seg msgs
|
|
mov ds,dx
|
|
mov dx,offset msg_1
|
|
mov ah,9
|
|
int 21h ;print loaded msg
|
|
pop ds ;get saved psp base address
|
|
mov es,ds:(2Ch)
|
|
mov ah,49h
|
|
int 21h ;free environment's memory
|
|
;assume no error
|
|
mov dx,offset begin ;everything up to BEGIN
|
|
add dx,10Fh ;and all the bytes needed to
|
|
mov cl,4 ;make a full paragraph ...
|
|
shr dx,cl
|
|
mov ax,3100h ;... stay resident
|
|
int 21h ;and return exit code = 0
|
|
loaded: pop ax ;get psp address out of stack
|
|
;any register will do
|
|
mov dx,seg msgs
|
|
mov ds,dx ;point DS to our data area
|
|
mov dx,offset msg_2
|
|
mov ah,9
|
|
int 21h ;print already loaded msg
|
|
mov ax,4C01h
|
|
int 21h ;terminate with exit code = 1
|
|
begin endp
|
|
nocad ends
|
|
msgs segment word 'DATA'
|
|
msg_0 db 10,13,'NOCAD: Prevent CTRL+ALT+DEL from restarting the '
|
|
db 'system',10,13,'Author: Antonio Quezada-Duarte',10,13,'$'
|
|
msg_1 db 10,13,'NOCAD Loaded OK.',10,13,'$'
|
|
msg_2 db 10,13,'NOCAD Already Loaded.',10,13,'$'
|
|
msgs ends
|
|
stack segment para stack 'STACK'
|
|
dw 1024 dup (?)
|
|
stack ends
|
|
end begin |