大理寺少卿 发表于 2025-6-12 23:43:50

驱动开发与系统原理-CPU控制块KPCR

介绍
----

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220118225953.png)

表示插了1个CPU,里面有4个物理核心,还有8个逻辑处理器(模拟核心),也就是常说的四核八线程

每个核都有一套寄存器cr0-cr8,IDT,GDT等,而KPCR结构则是用来描述这些寄存器的

dt _KPCR查看结构体
![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220118230316.png)

查看核心数
----------

dd KeNumberProcessors//包含模拟核心

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220118232858.png)

获取每个核心KPRCB基地址
-----------------------

dd KIPROCESSORBLOCK

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220118235153.png)

因此我们可以通过计算偏移获得每个核心KPCR的基地址

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220118235331.png)

dt _KPCR (0x83f4ad20-0x120)
![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220118235340.png)

结构中常用成员
--------------

+0x000 Used_ExceptionList : 0x83f4713c _EXCEPTION_REGISTRATION_RECORD //异常链表 SEH链表
+0x004 Used_StackBase   : (null) //栈基址
+0x010 ContextSwitches: 0x32bd6c //统计内核与应用层切换次数
+0x01c SelfPcr          : 0x83f4ac00 _KPCR //指向KPCR自己
+0x020 Prcb             : 0x83f4ad20 _KPRCB //指向KPRCB
+0x024 Irql             : 0x1f
+0x034 KdVersionBlock   : 0x83f49c00 Void//0号核心才有
+0x038 IDT            : 0x80b95400 _KIDTENTRY
+0x03c GDT            : 0x80b95000 _KGDTENTRY
+0x040 TSS            : 0x801e4000 _KTSS
+0x051 Number         : 0 '' //CPU编号

再查看KPRCB
+0x004 CurrentThread    : Ptr32 _KTHREAD //当前线程
+0x008 NextThread       : Ptr32 _KTHREAD //下一个线程
+0x00c IdleThread       : Ptr32 _KTHREAD //系统空闲线程
0号CPU专有的结构——_DBGKD_GET_VERSION64
----------------------------------------

+0x010 KernBase         : 0xffffffff`83e1f000 //内核文件基地址

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220119000940.png)

+0x018 PsLoadedModuleList : 0xffffffff`83f69850 //遍历驱动的结构地址

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220119001308.png)

读取当前驱动有些问题,我们可以通过驱动链表,读取下一个驱动的相关结构信息,是可以正常显示的

+0x020 DebuggerDataList : 0xffffffff`8418ffec //调试的相关信息

ldljlzw 发表于 3 天前

膜拜神贴,后面的请保持队形~
页: [1]
查看完整版本: 驱动开发与系统原理-CPU控制块KPCR