驱动插入中断描述符示例代码
最近做实验,每次在应用层代码写测试代码的时候都要手动挂一个中断描述符,很不方便所以就想着写个驱动挂一个中断门比较省事
驱动测试效果如下:
下面的代码是个架子,用的时候找个驱动历程传递你要插入的中断门描述符或者是函数地址进来然后在根据这个架子插入idt就可以了
样例代码如下:
#include <ntddk.h>
#define NTSTRSAFE_LIB
#include <ntstrsafe.h>
#include <intrin.h>
VOID Unload(PDRIVER_OBJECT pDriver) {
KdPrint(("unload"));
}
typedef struct _IDTR {
UINT16 limit;
UINT16 base_low;
UINT16 base_hight;
}IDTR, *PIDTR;
#define MAKE_WORD(a,b) ((a) + (b << 16))
#define MAKE_BASE(a) (DWORD32)(((a >> 32) & 0x00000000ffff0000) + ((a & 0x000000000000ffff)))
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegPath) {
NTSTATUS status = STATUS_SUCCESS;
pDriver->DriverUnload = Unload;
KdPrint(("begin\r\n"));
// 获取idt表
IDTR idtr = { 0 };
__sidt(&idtr);
KdPrint(("idt base=0x%x, limit=0x%x\r\n", MAKE_WORD(idtr.base_low, idtr.base_hight), idtr.limit));
// 构造中断描述符
UINT64 new_idte = 0x1234567812345678;
// 寻找未使用的位置插入描述符
PDWORD64 idteArr = (PDWORD64)MAKE_WORD(idtr.base_low, idtr.base_hight);
for (size_t i = 0; i < (idtr.limit >> 3); i++)
{
//这边可以根据类型或者是看里面村的是不是0x0然后直接插入
//我这里懒得写了,我的环境上8003f500的位置刚好能用
if (MAKE_BASE(idteArr[i]) == 0x0) {
idteArr[i] = new_idte;
KdPrint(("中断号:0x%x", i));
break;
}
}
return status;
}