проблема с подменой прерывания
- первая делает подмену прерывания 20h, ждет нажатия кнопки, проверяет работу подмененного прерывания и восстанавливает это прерывание, после чего завершается int 20h
- вторая прога содержит сначала int 20h, а потом ожидание нажатия клавиши
теперь в чем проблема:
в одном досовском окошке запускаю первую прогу, когда прерывание заменяется, запускаю в другом окошке вторую прогу и вот тут непонятки! почему вторая прога завершается не требуя нажатия клавиши? ведь прерывание подменено!
выкладываю коды, чтоб понятнее было:
---------------------- прога номер 1----------------------------
org 100h
cli ;подмена прерывания
push ax
push es
xor ax,ax
mov es,ax
mov ax,[es:20h*4]
mov [cs:int_old],ax
mov ax,[es:20h*4+2]
mov [cs:int_old2],ax
mov ax,int_new
mov [es:20h*4],ax
mov [es:20h*4+2],cs
pop es
pop ax
sti
mov ax,10h ;проверка того, что прерывание подменено
int 16h ;и тут все как надо
mov ax,0
int 20h
int 16h
cli ;восстановка прерывания
push ax
push es
xor ax,ax
mov es,ax
mov ax,[cs:int_old]
mov [es:20h*4],ax
mov ax,[cs:int_old2]
mov [es:20h*4+2],ax
pop es
pop ax
sti
mov ax,10h ;завершение проги
int 16h
int 20h
int_new: ;само прерывание (новое)
mov ax,10h
iret
int_old dw 0
int_old2 dw 0
symbol db ' :) $'
-------------------------прога номер 2-------------------------
org 100h
int 20h ;прога завершается как всегда, как будто
mov ah,10 ;прерывание не подменяли :(
int 16h
писал все на NASM. подскажите, как сделать, чтобы прерывание подменивалось нормально для всей винды, а не для одного окошка и как это объяснить...
непонятки, потому что в винде для каждой досовской проги запускается своя витруальная машина доса (ntdvm) и когда ты делаешь что-либо, все это остается только в этой ВМ. Для всей винды сменить не получиться, там надо со всякими хуками разбираться и уж тем более не из досовской проги (: (KeyboardHook)