鱼C论坛

 找回密码
 立即注册
查看: 514|回复: 2

[已解决]windows如何注册中断ISR

[复制链接]
发表于 2022-12-8 20:12:00 | 显示全部楼层 |阅读模式
30鱼币
windows通过APIC给cpu捅中断,请问如何注册中断服务程序来响应这个中断呢?

详细点就是,在windows驱动里,我通过写msr寄存器的方式给某个cpu发送硬中断,然后为该硬中断注册ISR,现在的问题就是,不知道怎么为这个硬中断注册ISR,我是X64环境,为IDT添加中断门会触发PG吧?

有没有通用的、合法的方式?
请路过的大佬指点下
最佳答案
2022-12-8 20:12:01
小甲鱼的二师兄 发表于 2023-11-28 05:40
windows通过APIC给cpu捅中断,请问如何注册中断服务程 ...

在Windows中为特定的硬中断注册ISR(中断服务程序),需要编写驱动程序来完成。下面是一个简单的示例,展示了如何使用WDM(Windows Driver Model)框架来注册中断服务程序。

首先,创建一个驱动程序项目,并添加以下代码:
  1. #include <ntddk.h>
  2. // 定义中断服务程序
  3. BOOLEAN MyISR(PKINTERRUPT Interrupt, PVOID ServiceContext)
  4. {
  5.     // 中断处理代码
  6.     // TODO: 在这里添加你的中断处理逻辑
  7.     // 返回值表示是否成功处理中断
  8.     return TRUE;
  9. }
  10. // 驱动入口函数
  11. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
  12. {
  13.     UNREFERENCED_PARAMETER(RegistryPath);
  14.     NTSTATUS status = STATUS_SUCCESS;
  15.     // 创建设备对象
  16.     UNICODE_STRING devName;
  17.     RtlInitUnicodeString(&devName, L"\\Device\\MyDriver");
  18.     PDEVICE_OBJECT devObj;
  19.     status = IoCreateDevice(DriverObject, 0, &devName, FILE_DEVICE_UNKNOWN, 0, FALSE, &devObj);
  20.     if (!NT_SUCCESS(status))
  21.     {
  22.         return status;
  23.     }
  24.     // 创建符号链接
  25.     UNICODE_STRING symLink;
  26.     RtlInitUnicodeString(&symLink, L"\\??\\MyDriver");
  27.     status = IoCreateSymbolicLink(&symLink, &devName);
  28.     if (!NT_SUCCESS(status))
  29.     {
  30.         IoDeleteDevice(devObj);
  31.         return status;
  32.     }
  33.     // 注册中断服务程序
  34.     PINTERRUPT_OBJECT interruptObj;
  35.     status = IoConnectInterruptEx(&interruptObj, devObj, (PKSERVICE_ROUTINE)MyISR, NULL, 0, 0, 0, 0, IO_CONNECT_INTERRUPT_FULLY_SPECIFIED);
  36.     if (!NT_SUCCESS(status))
  37.     {
  38.         IoDeleteSymbolicLink(&symLink);
  39.         IoDeleteDevice(devObj);
  40.         return status;
  41.     }
  42.     // 驱动程序工作完成后的清理
  43.     DriverObject->DriverUnload = [](PDRIVER_OBJECT DriverObject) {
  44.         UNICODE_STRING symLink;
  45.         RtlInitUnicodeString(&symLink, L"\\??\\MyDriver");
  46.         IoDeleteSymbolicLink(&symLink);
  47.         PDEVICE_OBJECT devObj = DriverObject->DeviceObject;
  48.         while (devObj)
  49.         {
  50.             PDEVICE_OBJECT nextDevObj = devObj->NextDevice;
  51.             IoDeleteDevice(devObj);
  52.             devObj = nextDevObj;
  53.         }
  54.     };
  55.     return status;
  56. }
复制代码

此示例中,我们在驱动程序入口函数`DriverEntry`中创建了一个设备对象,并使用`IoConnectInterruptEx`函数来注册中断服务程序`MyISR`。其中,`devName`和`symLink`分别表示设备名称和符号链接的名称,可以根据实际需要进行修改。

编译并加载驱动程序,即可将`MyISR`注册为硬中断的中断服务程序,以响应中断。

注意:这是一个简单示例,实际情况可能更复杂,需要针对具体的硬件和操作系统版本进行适配。在实际开发中,请参考相关文档和技术资料进行详细学习和调试。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

最佳答案

查看完整内容

在Windows中为特定的硬中断注册ISR(中断服务程序),需要编写驱动程序来完成。下面是一个简单的示例,展示了如何使用WDM(Windows Driver Model)框架来注册中断服务程序。 首先,创建一个驱动程序项目,并添加以下代码: 此示例中,我们在驱动程序入口函数`DriverEntry`中创建了一个设备对象,并使用`IoConnectInterruptEx`函数来注册中断服务程序`MyISR`。其中,`devName`和`symLink`分别表示设备名称和符号链接的名称, ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-8 20:12:01 | 显示全部楼层    本楼为最佳答案   
小甲鱼的二师兄 发表于 2023-11-28 05:40
windows通过APIC给cpu捅中断,请问如何注册中断服务程 ...

在Windows中为特定的硬中断注册ISR(中断服务程序),需要编写驱动程序来完成。下面是一个简单的示例,展示了如何使用WDM(Windows Driver Model)框架来注册中断服务程序。

首先,创建一个驱动程序项目,并添加以下代码:
  1. #include <ntddk.h>
  2. // 定义中断服务程序
  3. BOOLEAN MyISR(PKINTERRUPT Interrupt, PVOID ServiceContext)
  4. {
  5.     // 中断处理代码
  6.     // TODO: 在这里添加你的中断处理逻辑
  7.     // 返回值表示是否成功处理中断
  8.     return TRUE;
  9. }
  10. // 驱动入口函数
  11. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
  12. {
  13.     UNREFERENCED_PARAMETER(RegistryPath);
  14.     NTSTATUS status = STATUS_SUCCESS;
  15.     // 创建设备对象
  16.     UNICODE_STRING devName;
  17.     RtlInitUnicodeString(&devName, L"\\Device\\MyDriver");
  18.     PDEVICE_OBJECT devObj;
  19.     status = IoCreateDevice(DriverObject, 0, &devName, FILE_DEVICE_UNKNOWN, 0, FALSE, &devObj);
  20.     if (!NT_SUCCESS(status))
  21.     {
  22.         return status;
  23.     }
  24.     // 创建符号链接
  25.     UNICODE_STRING symLink;
  26.     RtlInitUnicodeString(&symLink, L"\\??\\MyDriver");
  27.     status = IoCreateSymbolicLink(&symLink, &devName);
  28.     if (!NT_SUCCESS(status))
  29.     {
  30.         IoDeleteDevice(devObj);
  31.         return status;
  32.     }
  33.     // 注册中断服务程序
  34.     PINTERRUPT_OBJECT interruptObj;
  35.     status = IoConnectInterruptEx(&interruptObj, devObj, (PKSERVICE_ROUTINE)MyISR, NULL, 0, 0, 0, 0, IO_CONNECT_INTERRUPT_FULLY_SPECIFIED);
  36.     if (!NT_SUCCESS(status))
  37.     {
  38.         IoDeleteSymbolicLink(&symLink);
  39.         IoDeleteDevice(devObj);
  40.         return status;
  41.     }
  42.     // 驱动程序工作完成后的清理
  43.     DriverObject->DriverUnload = [](PDRIVER_OBJECT DriverObject) {
  44.         UNICODE_STRING symLink;
  45.         RtlInitUnicodeString(&symLink, L"\\??\\MyDriver");
  46.         IoDeleteSymbolicLink(&symLink);
  47.         PDEVICE_OBJECT devObj = DriverObject->DeviceObject;
  48.         while (devObj)
  49.         {
  50.             PDEVICE_OBJECT nextDevObj = devObj->NextDevice;
  51.             IoDeleteDevice(devObj);
  52.             devObj = nextDevObj;
  53.         }
  54.     };
  55.     return status;
  56. }
复制代码

此示例中,我们在驱动程序入口函数`DriverEntry`中创建了一个设备对象,并使用`IoConnectInterruptEx`函数来注册中断服务程序`MyISR`。其中,`devName`和`symLink`分别表示设备名称和符号链接的名称,可以根据实际需要进行修改。

编译并加载驱动程序,即可将`MyISR`注册为硬中断的中断服务程序,以响应中断。

注意:这是一个简单示例,实际情况可能更复杂,需要针对具体的硬件和操作系统版本进行适配。在实际开发中,请参考相关文档和技术资料进行详细学习和调试。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-28 05:40:37 | 显示全部楼层
windows通过APIC给cpu捅中断,请问如何注册中断服务程序来响应这个中断呢?

详细点就是,在windows驱动里,我通过写msr寄存器的方式给某个cpu发送硬中断,然后为该硬中断注册ISR,现在的问题就是,不知道怎么为这个硬中断注册ISR,我是X64环境,为IDT添加中断门会触发PG吧?

有没有通用的、合法的方式?

@FishC_GPT

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 15:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表