1. <pre name="code" class="cpp">//GetIDT.h文件
  2. #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
  3. #define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
  4. #endif
  5. #ifdef __cplusplus
  6. extern "C"
  7. {
  8. #endif
  9. #include <ntddk.h>
  10. #include <ntddstor.h>
  11. #include <mountdev.h>
  12. #include <ntddvol.h>
  13. #ifdef __cplusplus
  14. }
  15. #endif
  16. //***************************************************************************************************************
  17. //GetIDT.cpp文件
  18. #include "GetIDT.h"
  19. //#include <stdio.h>
  20. //IDT表的最大项数为256
  21. #define MAX_IDT_ENTRIES 0XFF
  22. #define MAKELONG(a, b)\
  23. ((unsigned long) (((unsigned short) (a)) | ((unsigned long) ((unsigned short) (b))) << 16))
  24. //SIDT返回的数据格式
  25. typedef struct
  26. {
  27. unsigned short IDTLimit; //IDT表项的个数
  28. unsigned short LowIDTBase; //地址低16位
  29. unsigned short HiIDTBase; //地址高16位
  30. }IDTINFO, *PIDTINFO;
  31. #pragma pack(1)
  32. typedef struct
  33. {
  34. unsigned short LowOffset; //地址低16位
  35. unsigned short Selector; //段选择字
  36. unsigned char unused_lo; //保留
  37. unsigned char segment_type:4; //中断门类型
  38. unsigned char system_segment_flag:1; //为0是中断门
  39. unsigned char DPL:2; //特权级
  40. unsigned char P:1; //现在是否是使用中断
  41. unsigned short HiOffset; //地址高16位
  42. }IDTENTRY, *PIDTENTRY;
  43. #pragma pack()
  44. //卸载例程
  45. void GetIDTUnload(IN PDRIVER_OBJECT DriverObject);
  46. //创建和关闭例程
  47. NTSTATUS GetIDTCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
  48. //默认处理例程
  49. NTSTATUS GetIDTDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
  50. //获取IDT表的例程函数
  51. NTSTATUS Fun_GetIDT();
  52. #ifdef __cplusplus
  53. //驱动入口函数
  54. extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
  55. #endif
  56. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
  57. {
  58. //设备名称
  59. UNICODE_STRING DeviceName;
  60. //设备连接符
  61. UNICODE_STRING Win32Device;
  62. //设备对象
  63. PDEVICE_OBJECT DeviceObject = NULL;
  64. NTSTATUS status;
  65. unsigned i;
  66. //DeviceName-设备对象名称
  67. RtlInitUnicodeString(&DeviceName,L"\\Device\\GetIDT0");
  68. //Win32Device-连接符
  69. RtlInitUnicodeString(&Win32Device,L"\\DosDevices\\GetIDT0");
  70. for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
  71. {
  72. //设置默认的处理例程函数
  73. DriverObject->MajorFunction[i] = GetIDTDefaultHandler;
  74. }
  75. //设置创建处理例程函数
  76. DriverObject->MajorFunction[IRP_MJ_CREATE] = GetIDTCreateClose;
  77. //设置关闭处理例程函数
  78. DriverObject->MajorFunction[IRP_MJ_CLOSE] = GetIDTCreateClose;
  79. //设置卸载处理例程函数
  80. DriverObject->DriverUnload = GetIDTUnload;
  81. //创建设备对象
  82. status = IoCreateDevice(DriverObject,
  83. 0,
  84. &DeviceName,
  85. FILE_DEVICE_UNKNOWN, //设备类型
  86. 0,
  87. FALSE,
  88. &DeviceObject);
  89. if (!NT_SUCCESS(status))
  90. return status;
  91. if (!DeviceObject)
  92. return STATUS_UNEXPECTED_IO_ERROR;
  93. //设置缓冲区通信方式
  94. DeviceObject->Flags |= DO_DIRECT_IO;
  95. //设置字对齐
  96. DeviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT;
  97. //创建连接符
  98. status = IoCreateSymbolicLink(&Win32Device, &DeviceName);
  99. //设备初始化完成
  100. DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
  101. //获取IDT表
  102. Fun_GetIDT();
  103. return STATUS_SUCCESS;
  104. }
  105. //获取IDT表的例程函数
  106. NTSTATUS Fun_GetIDT()
  107. {
  108. IDTINFO idtInfo;
  109. PIDTENTRY pIdtEntry;
  110. //获取IDT表的基地址
  111. __asm sidt idtInfo
  112. pIdtEntry = (PIDTENTRY)MAKELONG(idtInfo.LowIDTBase, idtInfo.HiIDTBase);
  113. for (unsigned long i = 0; i < MAX_IDT_ENTRIES; i++)
  114. {
  115. //char szBuffer[255];
  116. PIDTENTRY pTmpIdtEntry = &pIdtEntry[i];
  117. //获取IDT表的每项的地址
  118. unsigned long lgAddr = MAKELONG(pTmpIdtEntry->LowOffset, pTmpIdtEntry->HiOffset);
  119. //_snprintf(szBuffer, 253, "中断号:%d,地址:%08X\r\n", i, lgAddr);
  120. //显示
  121. KdPrint(("中断号:%04d,地址:%08X\r\n", i, lgAddr));
  122. }
  123. return STATUS_SUCCESS;
  124. }
  125. //卸载例程
  126. void GetIDTUnload(IN PDRIVER_OBJECT DriverObject)
  127. {
  128. UNICODE_STRING Win32Device;
  129. RtlInitUnicodeString(&Win32Device,L"\\DosDevices\\GetIDT0");
  130. IoDeleteSymbolicLink(&Win32Device);
  131. IoDeleteDevice(DriverObject->DeviceObject);
  132. }
  133. //创建关闭例程
  134. NTSTATUS GetIDTCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  135. {
  136. Irp->IoStatus.Status = STATUS_SUCCESS;
  137. Irp->IoStatus.Information = 0;
  138. IoCompleteRequest(Irp, IO_NO_INCREMENT);
  139. return STATUS_SUCCESS;
  140. }
  141. //默认处理例程
  142. NTSTATUS GetIDTDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  143. {
  144. Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
  145. Irp->IoStatus.Information = 0;
  146. IoCompleteRequest(Irp, IO_NO_INCREMENT);
  147. return Irp->IoStatus.Status;
  148. }

  1.  

获取中断描述符表IDT的信息的更多相关文章

  1. Bran的内核开发教程(bkerndev)-07 中断描述符表(IDT)

    中断描述符表(IDT)   中断描述符表(IDT)用于告诉处理器调用哪个中断服务程序(ISR)来处理异常或汇编中的"int"指令.每当设备完成请求并需要服务事, 中断请求也会调用I ...

  2. 中断描述符表 IDT

    保护模式下三个重要的系统表——GDT.LDT和IDT 这里主要是解释中断描述符表 中断描述符表IDT将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT表类似,IDT也是由8字节长描述符 ...

  3. 中断描述符表(Interrupt Descriptor Table,IDT)

    中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组. #pr ...

  4. IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表

    原文:  IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表 IDT,Interrupt Descriptor Table,中断描述符表是CPU用来处理中 ...

  5. LGDT/LIDT-加载全局/中断描述符表寄存器

    将源操作数中的值加载到全局描述符表寄存器 (GDTR) 或中断描述符表寄存器 (IDTR).源操作数指定 6 字节内存位置,它包含全局描述符表 (GDT) 或中断描述符表 (IDT) 的基址(线性地址 ...

  6. Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类

    相关学习资料 <深入理解计算机系统(原书第2版)>.pdf http://zh.wikipedia.org/zh/%E4%B8%AD%E6%96%B7 独辟蹊径品内核:Linux内核源代码 ...

  7. 中断——中断描述符表的定义和初始化(二) (基于3.16-rc4)

    上篇博文对中断描述符表(IDT)中异常和非屏蔽中断部分的初始化做了说明,这篇文章将分析外部中断部分的初始化. 在上篇博文中,可以看到,内核在setup_once汇编片段中,对中断和异常部分做了初步的初 ...

  8. 中断——中断描述符表的定义和初始化(一) (基于3.16-rc4)

    1.中断描述符表的定义(arch/x86/kernel/traps.c) gate_desc debug_idt_table[NR_VECTORS] __page_aligned_bss; 定义的描述 ...

  9. 【译】x86程序员手册32-9.4 中断描述符表

    9.4 Interrupt Descriptor Table 中断描述符表 The interrupt descriptor table (IDT) associates each interrupt ...

随机推荐

  1. 用go实现常见的数据结构

    目录 1 golang常见数据结构实现 1.1 链表 1.2 可变数组 1.3 栈和队列 1.3.1 原生切片实现栈和队列 1.3.1.1 切片原生栈实现 1.3.1.2 切片原生队列实现 1.3.2 ...

  2. 剑指 Offer 67. 把字符串转换成整数 + 字符串

    剑指 Offer 67. 把字符串转换成整数 Offer_67 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGa ...

  3. 理解C#泛型运作原理

    前言  我们都知道泛型在C#的重要性,泛型是OOP语言中三大特征的多态的最重要的体现,几乎泛型撑起了整个.NET框架,在讲泛型之前,我们可以抛出一个问题,我们现在需要一个可扩容的数组类,且满足所有类型 ...

  4. 聊聊IT技术人的知识体系

    我在我的2020年终总结中提到技术人需要建立自己的知识体系,那么怎么建立自己的知识体系呢?技术人的知识体系又是什么样的呢?今天,和你一一分享. 1 关于我的12字方针 我在我的<2020年终回顾 ...

  5. 漏洞复现-CVE-2014-3120-ElasticSearch 命令执行漏洞

        0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 < ElasticSearch 1.2的版本 ...

  6. PHP中一些常用的安全类函数

      (1) htmlspecialchars() 表单验证(验证表单中的数据是否为空以及提交的数据是否合法) htmlspecialchars() //该函数将预定义的字符转化为html实体,预定义的 ...

  7. Tomcat8弱口令+后台getshell

    漏洞原因 用户权限在conf/tomcat-users.xml文件中配置: <?xml version="1.0" encoding="UTF-8"?&g ...

  8. 追洞小组 | 实战CVE-2020-7471漏洞

    出品|MS08067实验室(www.ms08067.com) 本文作者:守拙(Ms08067实验室追洞小组成员) 一.漏洞名称: 通过StringAgg(分隔符)的潜在SQL注入漏洞 二.漏洞编号: ...

  9. jqgrid 实现表格随select框内容改变而刷新

    要实现的功能如下:当选择框选择数据源由原始数据切换到组合后数据时,界面左侧jqgrid表格随之改变.效果如下: 实现代码: 界面顶部select选择框:要点是用localStory将选择框的选择信息记 ...

  10. 常用开发库 - MapStruct工具库详解

    常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...