bloggerads

2016年1月14日 星期四

Hook my own interrupt vector in DOS

因為工作上需要驗證中斷的tool, 所以把塵封已久的Watcom DOS程式拿出來改。以下是一個基本的掛中斷、呼叫中斷、移除中斷的範例
// Author: Martin Lee  

 #include <stdio.h>
 #include <conio.h>
 #include <dos.h>

 #define getvect(n) _dos_getvect(n)

 #define setvect(n,v) {\
   _disable();\
   _dos_setvect(n,v);\
   _enable();\
 }

 #define HOOKVECTOR 0x7F

 int sig;

 void interrupt  (*origin_int)();

 void interrupt handle_7Fh(void)
 {
     sig=1;
     //_chain_intr( origin_int); // not execute original vector
 }

 void hook_int(void)
 {
     origin_int = getvect(HOOKVECTOR);
     setvect (HOOKVECTOR, handle_7Fh);
 }

 void restore_int(void)
 {
     setvect(HOOKVECTOR,origin_int);
 }

 void main()
 {
     sig = 0;

     hook_int();

     printf("Before int 7fh, sig = %d\n", sig);

     __asm  int 7Fh    
   
     printf("After int 7fh, sig = %d\n", sig);
       
     restore_int();
   
 }

----------------------執行結果-----------------------------
Before int 7fh, sig = 0
After int 7fh, sig = 1


3 則留言:

  1. 您好,偶然的機會看到您的 Blog,冒昧想請問一下,是否有經驗在 UEFI 環境下使用 IRQ 中斷 ?
    主要是因為想開發一個在 Shell 下的 UART 測試軟體,但對於在 UEFI 環境下使用中斷的作法沒有相關經驗,剛好看到您有類似經驗,故想請教一下 ~ 謝謝

    Fox

    回覆刪除
  2. 在shell下理論上只能使用timer中斷,除非事先在Bios打開其他種中斷, 不過我沒實際實驗過

    回覆刪除