真的好牛
我第一次真正见识了程序自己构造调用gate
我觉得它牛B的地方:
未公开API的调用,那么随意,飘逸!
对物理内在的操作,那么简洁,
!
自己修改GDT,对保护模式好熟识!
不过这个程序并没有真正地修改IDT,他只是在GDT里加了一个描述符。
真正修改IDT的代码在lkbr0.cpp里,不过不知道为什么他并没有使用这份代码(把lkbr0.cpp删了程序也能正常编译和运行)。
而且它没有真正的查询页表的操作,转物理内在的操作是靠VirtualToPhysicalAddress这个函数完成的(神奇的函数
)
我印象中,好像看过有资料说GDT、IDT、页目录表等等重要的表都是不会被切换出物理内存的(即不会被切换到硬盘上去),但不知为什么
DWORD VirtualToPhysicalAddress( DWORD dw_virtual_address )
{
if( dw_virtual_address<0x80000000 || dw_virtual_address >= 0xA0000000 )
{
return 0;
}
else
{
return dw_virtual_address&0x1FFFF000;
}
}
这么简单的转换居然可以正常工作。
跟这个程序没必要使用WinDbg,我用VC跟了一遍,gdt等内核东东的地址都是可以看到的。