unit NonStop; {Makes your program UNSTOPPABLE!} interface var Intr09 : pointer absolute $0000:$0024; {Interrupt $09, keyboard ISR} OldIntr09 : pointer; {Original Interrupt $09 } const NoBoot : boolean = true; {flag to disable soft boot } NoBreak : boolean = true; {flag to disable Ctrl-Break } NoCtrlC : boolean = true; {flag to disable Ctrl-C } procedure InstallNonStopISR; procedure NonStopExitProc; implementation var PreNonStopExitProc : pointer; const Installed : boolean = false; procedure NonStopISR; External; {$L NonStop} procedure InstallNonStopISR; begin if not Installed then begin OldIntr09 := Intr09; inline($fa); {CLI - disable interrupts } Intr09 := @NonStopISR; {Link NonStop into interrupt chain} inline($fb); {STI - enable interrupts } PreNonStopExitProc := ExitProc; {Save old ExitProc } ExitProc := @NonStopExitProc; {Link in NonStopExitProc } Installed := true; end; end; procedure NonStopExitProc; begin ExitProc := PreNonStopExitProc; {Point ExitProc to next } inline($fa); {CLI - disable interrupts} Intr09 := OldIntr09; {Restore Original Vector } inline($fb); {STI - enable interrupts } end; end. *XX3402-000419-090294--72--85-43138-----NONSTOP.OBJ--1-OF--1 U+o+0qtjPbBoPr+iEJBBG6UU++++53FpQa7j623nQqJhMalZQW+UJaJmQqZjPW+n9X8NW-A+ ECblGoYQ0qtjPbBoPr+iEJBBQ6U1+21dH7M0++-cW+A+E84IZUM+-2F-J234a+Q+G++++U2- 3NM4++F1HoF3FNU5+0WW++A-+N8A7U+4HYx0HoxI++RCHo7GFI39++RCHoBIIYl1++ZDH2F7 HZFGA1Y+l7+F+++00YtDHZBIHp-7Ip6++++oW+E+E86-YO0V++6++-tEi+++XhUilUOR+CeE znM0+Dwq+++iXkOS+0uD-e++Aw0CqDwq7+-M-HA+I6w47+-M5ls4I9V++6v+i+++XhUaWWML +61Y-61A+5FAt4+mt+ca++-o2mO87VQ+UCE6UAk+R+MwIrI0ulcmt+ca++-o-XnURE9f119Y 0WM++5END0tp3SFVWi+AUCNVVi1aDTek6CMUK+QTnzhM-lw6b0s+l+dI+gENJ+925ZE0m+BI +QEE-U22l-E4+EH6D3E-l3A4+E52PUM-+gFw-U21m6c5+A2++U6++8c+ ***** END OF BLOCK 1 ***** { ------------------------ ASSEMBLER MODULE --------------------- } ;ASM NONSTOP.PAS DATA SEGMENT WORD PUBLIC ASSUME DS:DATA EXTRN NoBoot : BYTE EXTRN NoBreak : BYTE EXTRN NoCtrlC : BYTE EXTRN OldIntr09 : DWORD DATA ENDS CODE SEGMENT BYTE PUBLIC ASSUME CS:CODE NonStopISR PROC FAR PUBLIC NonStopISR push ds ;This is the initialization code push ax ;It will be used only once mov ax, seg DATA ;To fix up the far jump mov ds, ax ;put Global Data Segment in DS mov cs:[JmpCode], 0eah ;install far jump op code push [OldIntr09] ;put pointer to old interrupt 09 pop cs:Offs ;in far jump offset pop cs:Segm ;in far jump segment xor ax,ax ;point DS to interrupt vector table mov ds,ax ;ie, ds=0 push ds:[24h] ;Put offset of Int 09 pop ax ;in ax add ax, Entry - NonStopISR ;Adjust past init code push ax pop ds:[24h] ;revector to regular entry point pop ax pop ds Entry: push ds push es push ax mov ax, 40h ;point es mov es, ax ;to BIOS data area mov ax, seg DATA ;point ds mov ds, ax ;to data segment mov ah, es:[17h] ;put keyboard shift flags in ax and ah, 00000100b ;mask out everything but ctrl flag or ah, 00000000b ;see if zero jz NormalKey ;chain on if ctrl not pressed in al, 60h ;get make/break code xor ah, ah ;zero ah or ah, NoBoot ;Is flag set to disable soft boot? jz CheckBreak ;No? Go check for break mov ah, es:[17h] ;get keyboard shift flags and ah, 00001000b ;mask out all but alt flag or ah, 00000000b ;is result zero? jz CheckBreak ;go on to check for break cmp al, 53h ;is it del make? jnz CheckBreak ;no, chain on to old int 09 jmp short TossIt ;Soft boot attempted - no dice! CheckBreak: xor ah, ah ;zero ah or ah, NoBreak ;Flag set to disable ctrl-break? jz CheckCtrlC ;No? Go check for Ctrl-C cmp al, 0E0h ;is it Break make? jnz CheckCtrlC ;No? Go check for Ctrl-C jmp short TossIt ;Ctrl-Break attempted - toss it! CheckCtrlC: xor ah, ah ;zero ah or ah, NoCtrlC ;flag set to disabe ctrl-c? jz NormalKey ;No? Chain on to old ISR cmp al, 2Eh ;C pressed? jnz NormalKey ;No? Chain on to old ISR TossIt: in al, 61h ;read keyboard control port mov ah, al or al, 10000000b ;set the "reset" bit out 61h, al ;send it back to control xchg ah, al ;get back control value out 61, al ;send it out also cli mov al, 20h ;send EOI to the out 20h, al ;interrupt controller pop ax; pop es; pop ds; iret ;LATER, DUDE! NormalKey: sti ;allow interrupts pop ax ;cleanup and pop es pop ds JmpCode db ? ;Far jump to old Int 09 Offs dw ? Segm dw ? NonStopISR ENDP CODE ENDS END NonStopISR