Таблица векторов - массив из дальних адресов обработчиков, те каждый из них по 4 байта: offset:seg.
Вот пример перехвата ветора int 13h "руками":
| Код | ; es=0, Хотим сделать направленным вектор ; int 13h на наш обработчик @@New13Handler mov di,13h*4 ; Hook int 13h mov ax,offset @@New13Handler - 100h xchg ax,word ptr es:[di] mov word ptr Old13h-100h,ax mov ax,cs xchg ax,word ptr es:[di+2] mov word ptr Old13h-100h+2,ax ... ; Вызов старого обработчика: mov si,offset Old13h-100h ... pushf call dword ptr ds:[si]; Execute It !
|
Вот пример перехвата вектора через ДОС:
| Код | ; Обработчик (новый) вектора 9H: KEYb:PUSH DS ; Entry Point For 09h PUSH CS POP DS PUSHF CALL DWORD PTR OLD_9H ... ; Обработчик (новый) вектора 10H: MESSAGE PROC NEAR PUSH DS ; Entry Point For 10h PUSH CS POP DS MOV BIOS_FLAG,0 ... ; Перехватывем вектора int 9h (keyboard) ; и 10h (bios, display services) MOV AL,09H MOV DI,OFFSET OLD_9H MOV DX,OFFSET KEYB MOV SI,OFFSET LOAD_VECTOR CALL SI MOV AL,10H MOV DX,OFFSET MESSAGE CALL SI ... ; Код процедуры LOAD_VECTOR LOAD_VECTOR PROC NEAR MOV AH,35H INT 21H MOV [DI],BX INC DI INC DI MOV [DI],ES INC DI INC DI MOV AH,25H INT 21H RET LOAD_VECTOR ENDP
|
А вот как можно реализовать перехват вектора 1C (вспомогательный user-таймер) на языке Паскаль:
| Код | {Обработчик прерывания} procedure curs(flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp:word); interrupt; begin asm @@new: push ax; push ds mov ax,seg @Data; mov ds,ax; mov ax,3 int 33h ... {Установка нового вектора} var old,new1:pointer; n:byte; begin N:=(12+16); getintvec(n,old); {Запомнить старый в old} asm mov word ptr new1,offset curs mov word ptr new1+2,seg curs end; setintvec(n,new1); {Установить новый} ... {Программа закочена, вернуть все назад} n:=12+16; setintvec(n,old);
|
|