获取中断描述符表IDT的信息
<pre name="code" class="cpp">//GetIDT.h文件
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifdef __cplusplus
extern "C"
{
#endif
#include <ntddk.h>
#include <ntddstor.h>
#include <mountdev.h>
#include <ntddvol.h>
#ifdef __cplusplus
}
#endif
//***************************************************************************************************************
//GetIDT.cpp文件
#include "GetIDT.h"
//#include <stdio.h>
//IDT表的最大项数为256
#define MAX_IDT_ENTRIES 0XFF
#define MAKELONG(a, b)\
((unsigned long) (((unsigned short) (a)) | ((unsigned long) ((unsigned short) (b))) << 16))
//SIDT返回的数据格式
typedef struct
{
unsigned short IDTLimit; //IDT表项的个数
unsigned short LowIDTBase; //地址低16位
unsigned short HiIDTBase; //地址高16位
}IDTINFO, *PIDTINFO;
#pragma pack(1)
typedef struct
{
unsigned short LowOffset; //地址低16位
unsigned short Selector; //段选择字
unsigned char unused_lo; //保留
unsigned char segment_type:4; //中断门类型
unsigned char system_segment_flag:1; //为0是中断门
unsigned char DPL:2; //特权级
unsigned char P:1; //现在是否是使用中断
unsigned short HiOffset; //地址高16位
}IDTENTRY, *PIDTENTRY;
#pragma pack()
//卸载例程
void GetIDTUnload(IN PDRIVER_OBJECT DriverObject);
//创建和关闭例程
NTSTATUS GetIDTCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
//默认处理例程
NTSTATUS GetIDTDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
//获取IDT表的例程函数
NTSTATUS Fun_GetIDT();
#ifdef __cplusplus
//驱动入口函数
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
#endif
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
//设备名称
UNICODE_STRING DeviceName;
//设备连接符
UNICODE_STRING Win32Device;
//设备对象
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS status;
unsigned i;
//DeviceName-设备对象名称
RtlInitUnicodeString(&DeviceName,L"\\Device\\GetIDT0");
//Win32Device-连接符
RtlInitUnicodeString(&Win32Device,L"\\DosDevices\\GetIDT0");
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
//设置默认的处理例程函数
DriverObject->MajorFunction[i] = GetIDTDefaultHandler;
}
//设置创建处理例程函数
DriverObject->MajorFunction[IRP_MJ_CREATE] = GetIDTCreateClose;
//设置关闭处理例程函数
DriverObject->MajorFunction[IRP_MJ_CLOSE] = GetIDTCreateClose;
//设置卸载处理例程函数
DriverObject->DriverUnload = GetIDTUnload;
//创建设备对象
status = IoCreateDevice(DriverObject,
0,
&DeviceName,
FILE_DEVICE_UNKNOWN, //设备类型
0,
FALSE,
&DeviceObject);
if (!NT_SUCCESS(status))
return status;
if (!DeviceObject)
return STATUS_UNEXPECTED_IO_ERROR;
//设置缓冲区通信方式
DeviceObject->Flags |= DO_DIRECT_IO;
//设置字对齐
DeviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT;
//创建连接符
status = IoCreateSymbolicLink(&Win32Device, &DeviceName);
//设备初始化完成
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
//获取IDT表
Fun_GetIDT();
return STATUS_SUCCESS;
}
//获取IDT表的例程函数
NTSTATUS Fun_GetIDT()
{
IDTINFO idtInfo;
PIDTENTRY pIdtEntry;
//获取IDT表的基地址
__asm sidt idtInfo
pIdtEntry = (PIDTENTRY)MAKELONG(idtInfo.LowIDTBase, idtInfo.HiIDTBase);
for (unsigned long i = 0; i < MAX_IDT_ENTRIES; i++)
{
//char szBuffer[255];
PIDTENTRY pTmpIdtEntry = &pIdtEntry[i];
//获取IDT表的每项的地址
unsigned long lgAddr = MAKELONG(pTmpIdtEntry->LowOffset, pTmpIdtEntry->HiOffset);
//_snprintf(szBuffer, 253, "中断号:%d,地址:%08X\r\n", i, lgAddr);
//显示
KdPrint(("中断号:%04d,地址:%08X\r\n", i, lgAddr));
}
return STATUS_SUCCESS;
}
//卸载例程
void GetIDTUnload(IN PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING Win32Device;
RtlInitUnicodeString(&Win32Device,L"\\DosDevices\\GetIDT0");
IoDeleteSymbolicLink(&Win32Device);
IoDeleteDevice(DriverObject->DeviceObject);
}
//创建关闭例程
NTSTATUS GetIDTCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
//默认处理例程
NTSTATUS GetIDTDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Irp->IoStatus.Status;
}
获取中断描述符表IDT的信息的更多相关文章
- Bran的内核开发教程(bkerndev)-07 中断描述符表(IDT)
中断描述符表(IDT) 中断描述符表(IDT)用于告诉处理器调用哪个中断服务程序(ISR)来处理异常或汇编中的"int"指令.每当设备完成请求并需要服务事, 中断请求也会调用I ...
- 中断描述符表 IDT
保护模式下三个重要的系统表——GDT.LDT和IDT 这里主要是解释中断描述符表 中断描述符表IDT将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT表类似,IDT也是由8字节长描述符 ...
- 中断描述符表(Interrupt Descriptor Table,IDT)
中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组. #pr ...
- IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表
原文: IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表 IDT,Interrupt Descriptor Table,中断描述符表是CPU用来处理中 ...
- LGDT/LIDT-加载全局/中断描述符表寄存器
将源操作数中的值加载到全局描述符表寄存器 (GDTR) 或中断描述符表寄存器 (IDTR).源操作数指定 6 字节内存位置,它包含全局描述符表 (GDT) 或中断描述符表 (IDT) 的基址(线性地址 ...
- Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类
相关学习资料 <深入理解计算机系统(原书第2版)>.pdf http://zh.wikipedia.org/zh/%E4%B8%AD%E6%96%B7 独辟蹊径品内核:Linux内核源代码 ...
- 中断——中断描述符表的定义和初始化(二) (基于3.16-rc4)
上篇博文对中断描述符表(IDT)中异常和非屏蔽中断部分的初始化做了说明,这篇文章将分析外部中断部分的初始化. 在上篇博文中,可以看到,内核在setup_once汇编片段中,对中断和异常部分做了初步的初 ...
- 中断——中断描述符表的定义和初始化(一) (基于3.16-rc4)
1.中断描述符表的定义(arch/x86/kernel/traps.c) gate_desc debug_idt_table[NR_VECTORS] __page_aligned_bss; 定义的描述 ...
- 【译】x86程序员手册32-9.4 中断描述符表
9.4 Interrupt Descriptor Table 中断描述符表 The interrupt descriptor table (IDT) associates each interrupt ...
随机推荐
- three.js cannon.js物理引擎之约束(二)
今天郭先生继续讲cannon.js的物理约束,之前的一篇文章曾简单的提及过PointToPointConstraint约束,那么今天详细的说一说cannon.js的约束和使用方法.在线案例请点击博客原 ...
- 基于Hi3559AV100的视频采集(VDEC-VPSS-VO)整体框图设计
下面给出基于Hi3559AV100的视频采集整体设计,具体设计将在后续给出: 图形采集端整体设计 Hi3559AV100软件程序按结构划分可分为4层,第一层是硬件驱动层,第二层是操作系统层,第三层是媒 ...
- PAT-1119(Pre- and Post-order Traversals)+前序和后序遍历确定二叉树+判断二叉树是否唯一
Pre- and Post-order Traversals PAT-1119 这题难度较大,主要需要考虑如何实现根据前序遍历和后序遍历来确定一颗二叉树 一篇好的文章: 题解 import java. ...
- CCF(消息传递口:80分):字符串相关+队列
消息传递口 201903-4 本题主要是利用队列进行模拟,因为一开始我没有注意到要按照顺序,所以一开始的解法错误. #include<iostream> #include<algor ...
- .net Core 上传文件详解
.net core 和.net framework上传文件有很多需要注意的地方 .net framework 上传文件用httppostedfilebase .net core 上传文件用 IForm ...
- Netty源码 新连接处理
上文我们阐述了Netty的Reactor模型.在Reactor模型的第二阶段,Netty会处理各种io事件.对于客户端的各种请求就是在这个阶段去处理的.本文便来分析一个新的连接是如何被处理的. 代码的 ...
- STM32F103VET6-keil工程配置-USART串口中断
1.新建一个标准空白工程 2.设置时钟源为外部HSE时钟 1 #ifndef __SYSCLK_CONFIG_H 2 #define __SYSCLK_CONFIG_H 3 #include &quo ...
- 进阶Java多线程
一.多线程创建方式 1.1.继承Thread类创建线程类 1.实现步骤 定义一个继承Thread类的子类,并重写该类的run()方法: 创建Thread子类的实例,即创建了线程对象: 调用该线程对象的 ...
- 【odoo14】第二章、管理odoo实例
本章主要介绍肖odoo实例添加用户自定义的模块.你可以从多个路径载入模块.但是建议你将自己的模块儿放在特定的目录当中,避免与odoo的核心模块混淆. 在这一章节,中我们主要涉及以下内容: 配置插件路径 ...
- 程序员必须搞懂的20个Java类库和API
本文总结了日志.JSON解析.单测.XML解析.字节码处理.数据库连接池.集合类.邮件.加密.嵌入式SQL数据库.JDBC故障诊断以及序列化等20个方面的常用类库.都是你日常开发经常可能要用到的,现在 ...