记录一下-Windows内核会话和内核调试引擎
2016-03-25 14:18
435 查看
Windows启动内核调试后,主要做了以下几个工作
1. 建立连接
2. 调试器读取目标系统信息,初始化调试引擎(目标机)。
3. 内核调试引擎通过状态变化信息包通知调试器加载初始模块的调试符号(目标机)。
4. 调试器端发送中断包,将目标系统中断到调试器,交互调试后又恢复执行的过程。
5. 因断点命中,目标系统中断到调试器的过程。
6. 内核中的模块输出调试字符串(DbgPrint)到调试器
内核调试引擎:
内核调试引擎相当于再目标系统中进行调试的一个代理,调试引擎代表调试器来访问和控制目标系统。
内核调试的几个关键函数:
KdEnterDbugger
它用于冻结内核,调用后首先会禁止中断,对于多处理器的系统,它会将当前CPU的IRQL升高到HIGH_LEVEL并冻结所有的其他的CPU。锁定调试调试通信端口,调用KdSave让通信扩展模块保存通信状态,并将全局变量KdEnteredDebugger设置为真。当KdEnterDebugger执行后,整个系统进入一种简单的单任务状态,当前的CPU只执行当前的线程,其他CPU处于冻结状态。
KdExitDebugger 恢复内核运行,主要工作有调用KdRestore让通信扩展模块恢复通信状态,对锁定的通信端口解锁。调用KeThawExecution来恢复系统进入正常的运行状态,包括恢复中断,降低当前CPU的IRQL,对多CPU系统,恢复其他CPU。
KdpReportExceptionStateChange CPU报告异常类状态变化
KdpReportLoadSymbolsStateChange CPU报告符号加载类异常
KdpSendWaitContinue 函数用来发送信息包,与调试器对话。
KeUpdateSystemTime函数在每次更新系统时间时会检查全局变量KdDebuggerEnable来判断内核调试引擎是否被启动,如果为真则调用KdPollBreakIn函数来查看调试器是否发送了终端命令,如果是,则调用DbgBreakPointWithStatus触发断点异常,中断到调试器。
kdpTrap来处理内核态的异常。当内核态中发生异常时,KiDispatchException函数会调用全局变量KiDebugRoutine所指向的函数。当调试引擎启用时,这个变量的值是函数KdpTrap的地址。所以一旦异常发生时,系统就会调用KdpTrap。KdpTrap调用KdpReport向调试器报告异常。
KiSaveProcessorControlState保存CPU的控制状态
KiRestoreProcessorControlState恢复CPU状态
DbgPrint,DbgPrintEx,vDbbgPirntEx打印调试信息
1. 建立连接
2. 调试器读取目标系统信息,初始化调试引擎(目标机)。
3. 内核调试引擎通过状态变化信息包通知调试器加载初始模块的调试符号(目标机)。
4. 调试器端发送中断包,将目标系统中断到调试器,交互调试后又恢复执行的过程。
5. 因断点命中,目标系统中断到调试器的过程。
6. 内核中的模块输出调试字符串(DbgPrint)到调试器
内核调试引擎:
内核调试引擎相当于再目标系统中进行调试的一个代理,调试引擎代表调试器来访问和控制目标系统。
内核调试的几个关键函数:
KdEnterDbugger
它用于冻结内核,调用后首先会禁止中断,对于多处理器的系统,它会将当前CPU的IRQL升高到HIGH_LEVEL并冻结所有的其他的CPU。锁定调试调试通信端口,调用KdSave让通信扩展模块保存通信状态,并将全局变量KdEnteredDebugger设置为真。当KdEnterDebugger执行后,整个系统进入一种简单的单任务状态,当前的CPU只执行当前的线程,其他CPU处于冻结状态。
KdExitDebugger 恢复内核运行,主要工作有调用KdRestore让通信扩展模块恢复通信状态,对锁定的通信端口解锁。调用KeThawExecution来恢复系统进入正常的运行状态,包括恢复中断,降低当前CPU的IRQL,对多CPU系统,恢复其他CPU。
KdpReportExceptionStateChange CPU报告异常类状态变化
KdpReportLoadSymbolsStateChange CPU报告符号加载类异常
KdpSendWaitContinue 函数用来发送信息包,与调试器对话。
KeUpdateSystemTime函数在每次更新系统时间时会检查全局变量KdDebuggerEnable来判断内核调试引擎是否被启动,如果为真则调用KdPollBreakIn函数来查看调试器是否发送了终端命令,如果是,则调用DbgBreakPointWithStatus触发断点异常,中断到调试器。
kdpTrap来处理内核态的异常。当内核态中发生异常时,KiDispatchException函数会调用全局变量KiDebugRoutine所指向的函数。当调试引擎启用时,这个变量的值是函数KdpTrap的地址。所以一旦异常发生时,系统就会调用KdpTrap。KdpTrap调用KdpReport向调试器报告异常。
KiSaveProcessorControlState保存CPU的控制状态
KiRestoreProcessorControlState恢复CPU状态
DbgPrint,DbgPrintEx,vDbbgPirntEx打印调试信息
相关文章推荐
- 动态链接库中的.symtab和.dynsym
- 把一个英语句子中的单词次序颠倒后输出。例如输入“how are you”,输出“you are how”
- 写一个程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示。(单词之间用空格隔开,如“Hello World My First Unit Test”)
- HTML学习笔记2
- Linux内核分析(第五周)
- Apache Maven 入门篇 ( 上 )
- Android系统性能优化备忘
- COM三大接口:IUnknown、IClassFactory、IDispatch
- 几种经典排序算法的JS实现方法
- 2.一对一双向主键关联(人对身份证) 工具类
- Android程序中输入法弹出的时候如何不遮挡输入,与布局相配
- Gulp使用指南
- Win8.1如何删除美式键盘?Win8.1系统删除美式键盘的方法
- VC中单文件和多文档文件的创建流程和打开流程
- 唱吧免费导出歌曲mp3和MV
- ACCP 结业考试
- 服务器出现500错误,报el表达式错误
- spark集群安装与配置
- android eclipse 开发工具的使用
- 海量数据top K问题