home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
noreset
/
no_rst.asm
next >
Wrap
Assembly Source File
|
1994-10-31
|
3KB
|
97 lines
data segment public
start_message: db 'Plus de Reset possible',0dh,0ah,'$'
buffer: db 40d ;taille du buffer d'entrée
db 40 dup (0) ;buffer
old_int9 dd 0 ;ancien gestionnaire d'interruption
data ends
code segment public
assume cs:code,ds:data
handler9 proc near ;nouveau gestionnaire de l'interruption 9
push ax ;sauvegarde les registres exploités
push bx
push ds
push es
mov ax,data ;charge ds
mov ds,ax
in al,60h ;lit les caractères tapés en al
xor bx,bx ;es pointe sur le segment 0
mov es,bx
mov bl,byte ptr es:[417h] ;charge en bl l'état du clavier
cmp al,83d ;scan code de la touche <Suppr>?
jne pasde_reset ;non, pas de reset
and bl,0ch ;masque Ctrl et Alt
cmp bl,0ch ;enfoncées simultanément ?
jne pasde_reset ;non pas de reset
bloque: ;Reset ou break, il faut intervenir
mov al,20h ;envoie EoI au contrôleur d'interruption
out 20h,al
jmp fini ;et quitte l'interruption
pasde_reset: ;pas de Reset, teste break
cmp al,224d ;touche étendue ?
je evtl_break ;oui -> peut-être break
cmp al,46d ;touche 'C' ?
jne licite ;non -> touche licite
evtl_break:
test bl,4 ;teste l'état du clavier
jne bloque ;touche Ctrl, alors bloquer
licite: ;touche licite -> appeler l'ancien gestionnaire du clavier
pushf
call dword ptr [old_int9] ;gestionnaire d'origine
fini:
pop es
pop ds ;reprend les registres
pop bx
pop ax
iret
handler9 endp
start proc near
mov ax,data ;initialise ds
mov ds,ax
mov dx,offset start_message ;met en dx l'offset du message
mov ah,09h ;affiche le message
int 21h
mov ax,3509h ;lis l'ancien vecteur d'interruption
int 21h
mov word ptr old_int9,bx ;et le mémorise
mov word ptr old_int9 + 2, es
push ds ;sauvegarde ds
mov ax,cs ;et y charge cs
mov ds,ax
mov dx,offset handler9 ;charge aussi l'offset du gestionnaire
mov ax,2509h ;fixe le vecteur
int 21h
pop ds
;-------------------------------------------------------------------------
; Ici à la place de l'appel DOS vous pouvez mettre un
; call vers votre programme principal
mov ah,0ah ;lis une chaîne de caractères
lea dx,buffer ;à titre d'exemple
int 21h
;-------------------------------------------------------------------------
push ds
lds dx,old_int9 ;rétablit l'ancien vecteur
mov ax,2509h
int 21h
pop ds
mov ax,4c00h ;met fin au programme int 21h
start endp
code ends
end start