Windows 内核Hook之IOAPIC编程

简介: Windows 内核Hook之IOAPIC编程 HOOK系列中,包括应用程序HOOK编程、IDT和IOAPIC编程,其中IOPIC顾名思义I/O ADVANCED PROGRAMMABLE INTERRUPT CONTROLLER中断控制器。

Windows 内核HookIOAPIC编程

HOOK系列中,包括应用程序HOOK编程、IDTIOAPIC编程,其中IOPIC顾名思义I/O ADVANCED PROGRAMMABLE INTERRUPT CONTROLLER中断控制器。在Windows 中有固定的两个地址进行操作,第一、I/O寄存器选择寄存器,其地址是0xfec00000;另一个是I/O窗口寄存器,地址是0xfec00010。这两个地址不像通用寄存器一样能直接访问,必须映射大一片虚拟内存中操作。

IDT是中断描述符列表,IOAPIC的目的就是告诉指定的CPUIRQ号,用于IDT查询中断服务地址。

因此如果想修改中断的处理过程,首先需要修改IOAPIC的中断号,在通过IDT修改中断服务函数,这样就可以达到过滤和获取数据的目的,如下代码;

// 选择寄存器。选择寄存器虽然是32位的寄存器,但是只使用

         // 8位,其他的位都被保留。

         P2C_U8 *io_reg_sel;

 

         // 窗口寄存器,用来读写被选择寄存器选择的值,是32位的。

         P2C_U32 *io_win;

         P2C_U32 ch,ch1;

 

         // 定义一个物理地址,这个地址为0xfec00000。正是IOAPIC

         // 寄存器组在Windows上的开始地址

         PHYSICAL_ADDRESS      phys ;

         PVOID paddr;

         RtlZeroMemory(&phys,sizeof(PHYSICAL_ADDRESS));

         phys.u.LowPart = 0xfec00000;

 

         // 物理地址是不能直接读写的。MmMapIoSpace把物理地址映射

         // 为系统空间的虚拟地址。0x14是这片空间的长度。

         paddr = MmMapIoSpace(phys, 0x14, MmNonCached);

 

         // 如果映射失败了就返回0.

         if (!MmIsAddressValid(paddr))

                   return 0;

 

         // 选择寄存器的偏移为0

         io_reg_sel = (P2C_U8 *)paddr;

 

         // 窗口寄存器的偏移为0x10.

         io_win = (P2C_U32 *)((P2C_U8 *)(paddr) + 0x10);

 

         // 选择第0x12,刚好是irq1的项

         *io_reg_sel = 0x12;

         ch = *io_win;

 

         // 如果new_ch不为0,我们就设置新值。并返回旧值。

         if(new_ch != 0)

         {

                   ch1 = *io_win;

                   ch1 &= 0xffffff00;

                   ch1 |= (P2C_U32)new_ch;

                   *io_win = ch1;

                   KdPrint(("p2cSeachOrSetIrq1: set %2x to irq1./r/n",(P2C_U8)new_ch));

         }

 

         // 窗口寄存器里读出的值是32位的,但是我们只需要

         // 一个字节就可以了。这个字节就是中断向量的值。

         // 一会我们要修改这个值。

         ch &= 0xff;

         MmUnmapIoSpace(paddr, 0x14);

         KdPrint(("p2cSeachOrSetIrq1: the old vec of irq1 is %2x./r/n",(P2C_U8)ch));

         return (P2C_U8)ch;

目录
相关文章
|
消息中间件 C++ Windows
02 MFC - Windows 编程模型
02 MFC - Windows 编程模型
75 0
|
4月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
4月前
|
Windows
[原创]用MASM32编程获取windows类型
[原创]用MASM32编程获取windows类型
|
4月前
|
JavaScript 前端开发 API
MASM32编程通过WMI获取Windows计划任务
MASM32编程通过WMI获取Windows计划任务
|
4月前
|
API Windows
MASM32编程获取Windows当前桌面主题名
MASM32编程获取Windows当前桌面主题名
|
5月前
|
编译器 开发工具 C语言
解锁QtCreator跨界神技!Windows下轻松驾驭OpenCV动态库,让你的跨平台开发如虎添翼,秒变视觉编程大师!
【8月更文挑战第4天】QtCreator是一款强大的跨平台IDE,便于创建多平台应用。本教程教你如何在Windows环境下集成OpenCV库至Qt项目。首先,下载匹配MinGW的OpenCV预编译版并解压。接着,在QtCreator中新建或打开项目,并在.pro文件中添加OpenCV的头文件和库文件路径。确保编译器设置正确。随后编写测试代码,例如加载和显示图片,并进行编译运行。完成这些步骤后,你就能在QtCreator中利用OpenCV进行图像处理开发了。
272 6
|
5月前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
379 0
|
7月前
|
Java C++
jni编程(windows+JDK11+clion)
jni编程(windows+JDK11+clion)
111 1
|
7月前
|
Windows
【Windows内核驱动函数(1)】IoCreateSymbolicLink()-----创建符号链接函数
【Windows内核驱动函数(1)】IoCreateSymbolicLink()-----创建符号链接函数
|
8月前
|
API C++ Windows
windows编程入门_链接错误的配置
windows编程入门_链接错误的配置
62 0