Hook Int 10h导致Window加载失败

时间:2016-10-25 17:16:06

标签: x86 operating-system kernel bootloader x86-emulation

我尝试编写一个非常简单的引导代码,用于挂接INT 10,如下所示:

New_int10:

Pushf
Cli
Call [CS:old_Int10]
Iret

代码适用于所有情况,但是当我尝试启动到Window时。系统挂起。我在 Bochs 中调试并注意操作系统尝试切换v8086模式然后调用Int10和我的新Int10处理程序(在{{ 1}})执行失败(它不会导致导致系统挂起的处理程序,看起来保护模式下的某些映射不正确)。

如果不更改address 0x97400,我可以进入INT10int10 handler处的原始处理程序)。

我错过了什么吗?

我已经挂钩address 0xC0152以使用Int15h

注册新处理程序的区域

更新:我做了更多调试并找出...当Window(它只在Windows启动到安全模式时发生)切换到v8086模式时,它设置VME(在CR4中)= 1 ,IPOL = 3,程序跳转到0x97400。不幸的是,页面映射当前将此地址映射到另一个物理地址0x7dd2000 ...因此应用程序变得疯狂。地址0xC0000仍然映射到0xC0000,这解释了为什么如果我们不更改INT10,窗口可以启动。

我的问题:有没有办法通知Window Boot Loader不重映射地址0x97400?

由于

1 个答案:

答案 0 :(得分:0)

好吧,最后我解决了这个问题。

我必须将edba从0x9fc00复制到0x97400并将0x40e调整到新位置0x97400。然后我将代码重新定位到EDBA旁边并更新EDBA大小。然后代码可以运行。

我猜Window Boot Loader尝试将640K映射到一个新的位置,即0x7dd2000。然后它只复制bda(从0到4ff)和ebda(从0x9fc00到0xa000)到新位置......所以重新定位edba并更新edba的大小。