寻找一个空闲的中断槽

Find a free interrupt slot

一些小丑 (BIOS/DOS/TSR...) 在中断向量 Table 中写入了随机数据。我知道这一点,因为拆卸告诉我的。

通常在占用中断向量之前,我会验证所选的 IVT 插槽是否为空。但是有了所有这些 left-behind-data,一个不起眼的应用程序如何知道挂钩特定中断向量仍然是安全的?

尽管我的程序员参考将 DOS 函数 25h SetInterruptVector 描述为

"Safely modifies an interrupt vector to point to a specified interrupt handler"

我认为它不会太在意这个已经存在的虚假内容。到目前为止安全


是否有一些巧妙的方法可以绝对确定中断向量是空闲的?

不,没有绝对可靠的巧妙方法来检查向量是否空闲。

这是因为中断的 232 个可能值中的每一个都可能是有效值。

某些值可能非常可疑,但有效:

  • 0ffffh:0ffffh可以有效(指向0ffefh,A20被屏蔽)。
  • 0000h:0000h 可以有效,即使在向量 0 上也是如此。值为零的 DWORD 解码为一对有效的 add [bx+si], al
  • 0b800h:0000h 和其他类似的 ROM 地址可以有效,因为扩展 ROM 可用于携带代码。尽管标准视频内存不太可能。
  • 保留 BIOS 区域中的地址,如 (E)BDA,如果数据被特制为有效代码和有效信息,理论上是有效的。

当然,上面的一些内容非常复杂,涉及将数据作为代码执行,但您不应该相信向量指针的主要原因是 BIOS 可能会用至少一个虚拟 ISR 填充每个向量槽。
这不会让无意中制作的糟糕 int 指令挂起系统。


您可以做几件事:

  1. 链接
    选择一个不拥挤的中断号N。选取一组尚未使用的输入值 I(比如 AH=d0-ff)。将你的 ISR 附加到 N 并处理 only 那些 I 值,将其他输入委托给以前的 ISR .

  2. 针对特定平台
    一些中断向量,如 int EA,仅在特定系统中使用。由于这些系统中的大部分都已消失,您可以回收它们的中断。
    如果您窃取了一个中断向量并且一切正常并且没有人抱怨,那么这就是您的中断。只需仔细检查场所。

  3. 使用中断2F
    Int 2F and its variant Alternate Multiplex Interrupt Specification (AMIS) at Int 2D 可用作 shared/multiplexed 中断。
    然而,AMIS 并没有获得太多人气。

  4. 随便找个空位
    作为第一次尝试,您可以尝试在 IVT 中搜索空条目 1,尽管理论上有效,但它们可能是空槽。
    您也可以尝试找到一个出现超过一两次的指针,这表明存在虚拟 ISR(因为 ISR 无法轻易识别其向量编号)。

我会选择n。 1 就个人而言,如果不可能,我会实施 n。 3. 如果不可能,我会使用 n。 4 回退到 n。 2.


1 捕获所有“可疑”值是不切实际的,只会带来一点收获,所以只追求大的。