news 2026/6/15 18:23:08

nt!IopGetRootDevices函数的nt!PipApplyFunctionToSubKeys函数后面下断点可以查看根节点中建立的设备对象的数量context.DeviceCount

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
nt!IopGetRootDevices函数的nt!PipApplyFunctionToSubKeys函数后面下断点可以查看根节点中建立的设备对象的数量context.DeviceCount

nt!IopGetRootDevices函数的nt!PipApplyFunctionToSubKeys函数后面下断点可以查看根节点中建立的设备对象的数量context.DeviceCount

19 e Disable Clear 80cb096f [d:\srv03rtm\base\ntos\io\pnpmgr\pnpdd.c @ 905] 0001 (0001) nt!IopGetRootDevices+0x157


1: kd> kc
#
00 nt!IopInitializeDeviceKey
01 nt!PipApplyFunctionToSubKeys
02 nt!IopGetRootDevices
03 nt!IopPnPDispatch
04 nt!IofCallDriver
05 nt!IopSynchronousCall
06 nt!IopQueryDeviceRelations
07 nt!PipEnumerateDevice
08 nt!PipProcessDevNodeTree
09 nt!PiProcessReenumeration
0a nt!PipDeviceActionWorker
0b nt!PipRequestDeviceAction
0c nt!IopInitializePlugPlayServices
0d nt!IoInitSystem
0e nt!Phase1Initialization
0f nt!PspSystemThreadStartup
10 nt!KiThreadStartup
1: kd> kv
# ChildEBP RetAddr Args to Child
00 f789a1d8 80c87246 800004c0 f789a1f8 f789a23c nt!IopInitializeDeviceKey+0x48 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpdd.c @ 1008]
01 f789a210 80cb096f 800004b0 800004c0 000f003f nt!PipApplyFunctionToSubKeys+0xec (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpsubs.c @ 1976]
02 f789a26c 80cb0bc8 f789a29c 899c5d08 89994008 nt!IopGetRootDevices+0x157 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpdd.c @ 905]
03 f789a294 80a2675c 00000000 89994008 8999409c nt!IopPnPDispatch+0x92 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpdd.c @ 405]
04 f789a2b0 80c95e00 00000000 899c5bc8 899c5bc8 nt!IofCallDriver+0x62 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\io\iomgr\iosubs.c @ 2237]
05 f789a2e0 80a2e3f3 00000000 f789a2fc 899c5ca8 nt!IopSynchronousCall+0x1aa (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpirp.c @ 258]
06 f789a320 80c8d810 00000000 899c5d08 00000001 nt!IopQueryDeviceRelations+0x39 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpirp.c @ 1131]
07 f789a33c 80c94e01 899c5bc8 00000001 899c5bc8 nt!PipEnumerateDevice+0x56 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpenum.c @ 980]
08 f789a588 80c954e7 899c5bc8 00000000 00000000 nt!PipProcessDevNodeTree+0x273 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpenum.c @ 4699]
09 f789a5c0 80a2de90 89996df0 80b1f6f8 00000000 nt!PiProcessReenumeration+0xaf (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpenum.c @ 6115]
0a f789a5e8 80a2e161 00000000 e1278d82 00000000 nt!PipDeviceActionWorker+0x174 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpenum.c @ 801]
0b f789a600 80e68579 899c5d08 00000008 00000000 nt!PipRequestDeviceAction+0x139 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpenum.c @ 598]
0c f789a694 80e6554b 8000048c 80000494 00034000 nt!IopInitializePlugPlayServices+0x619 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\pnpmgr\pnpinit.c @ 762]
0d f789a838 80e632fd 80077000 00000000 899a1020 nt!IoInitSystem+0x68f (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\iomgr\ioinit.c @ 599]
0e f789adac 80d391f0 80077000 00000000 00000000 nt!Phase1Initialization+0x9b3 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\init\init.c @ 2221]
0f f789addc 80b00d52 80e6294a 80077000 00000000 nt!PspSystemThreadStartup+0x2e (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ps\create.c @ 2213]
10 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16 [d:\srv03rtm\base\ntos\ke\i386\threadbg.asm @ 81]
windbg> .open -a ffffffff80a2e3f3


NTSTATUS
IopGetRootDevices (
PDEVICE_RELATIONS *DeviceRelations
)
{

//
// Enumerate all subkeys under the System\CCS\Enum\Root.
//

context.Status = STATUS_SUCCESS;
context.KeyName = &workName;

status = PipApplyFunctionToSubKeys(baseHandle,
NULL,
KEY_ALL_ACCESS,
FUNCTIONSUBKEY_FLAG_IGNORE_NON_CRITICAL_ERRORS,
IopInitializeDeviceKey,
&context
);
//这里下断点:
ZwClose(baseHandle);

//
// Build returned information from ROOT_ENUMERATOR_CONTEXT.
//


status = context.Status;
if (NT_SUCCESS(status) && context.DeviceCount != 0) {
deviceRelations = (PDEVICE_RELATIONS) ExAllocatePool(
PagedPool,
sizeof (DEVICE_RELATIONS) + sizeof(PDEVICE_OBJECT) * context.DeviceCount
);
if (deviceRelations == NULL) {
status = STATUS_INSUFFICIENT_RESOURCES;
} else {
deviceRelations->Count = context.DeviceCount;
RtlCopyMemory(deviceRelations->Objects,
context.DeviceList,
sizeof (PDEVICE_OBJECT) * context.DeviceCount);

*DeviceRelations = deviceRelations;
}


第二种方式:在nt!PipEnumerateCompleted函数下断点,查看DeviceNode->OverUsed1.PendingDeviceRelations->Count

表示当前节点子节点的数量:
查看DeviceNode->OverUsed1.PendingDeviceRelations


1: kd> dt _DEVICE_NODE -r
nt!_DEVICE_NODE
+0x000 Sibling : Ptr32 _DEVICE_NODE
+0x0e0 OverUsed1 : __unnamed


+0x000 PendingDeviceRelations : Ptr32 _DEVICE_RELATIONS
+0x000 Count : Uint4B
+0x004 Objects : [1] Ptr32 _DEVICE_OBJECT

NTSTATUS
PipProcessDevNodeTree(
IN PDEVICE_NODE SubtreeRootDeviceNode,
IN BOOLEAN LoadDriver,
IN BOOLEAN ReallocateResources,
IN ENUM_TYPE EnumType,
IN BOOLEAN Synchronous,
IN BOOLEAN ProcessOnlyIntermediateStates,
IN PADD_CONTEXT AddContext,
IN PPI_DEVICE_REQUEST Request
)
{


case DeviceNodeEnumerateCompletion:

status = PipEnumerateCompleted(currentNode);
nextNode = ChildNode;
break;


NTSTATUS
PipEnumerateCompleted(
IN PDEVICE_NODE DeviceNode
)
{


//
// Check all the PDOs returned see if any new one or any one disappeared.
//

for (i = 0; i < DeviceNode->OverUsed1.PendingDeviceRelations->Count; i++) {

childDeviceObject = DeviceNode->OverUsed1.PendingDeviceRelations->Objects[i];

ASSERT_INITED(childDeviceObject);


ExFreePool(DeviceNode->OverUsed1.PendingDeviceRelations);
DeviceNode->OverUsed1.PendingDeviceRelations = NULL;

这里赋值为NULL,自此以后就看不到了。以后也用不到了。信息已经跑到设备数里面了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:49:48

LabelImg图片标注工具:Windows免安装终极指南

LabelImg图片标注工具&#xff1a;Windows免安装终极指南 【免费下载链接】LabelImg标注图片工具windows免安装版本 LabelImg是一款专为深度学习设计的图片标注工具&#xff0c;能够高效、便捷地标注图片中的物体位置与名称。本仓库提供的是Windows免安装版本&#xff0c;用户只…

作者头像 李华
网站建设 2026/6/15 13:46:43

深入解析HAL_UART_RxCpltCallback触发条件

深入解析HAL_UART_RxCpltCallback的触发机制&#xff1a;从原理到实战优化在嵌入式开发中&#xff0c;串口通信几乎无处不在。无论是调试信息输出、传感器数据采集&#xff0c;还是与上位机或外设模块交互&#xff0c;UART 都是开发者最熟悉的“老朋友”。而在基于 STM32 和 HA…

作者头像 李华
网站建设 2026/6/15 12:27:10

XiYan-SQL:AI驱动SQL生成完全指南

XiYan-SQL&#xff1a;AI驱动SQL生成完全指南 【免费下载链接】XiYan-SQL A MULTI-GENERATOR ENSEMBLE FRAMEWORK FOR NATURAL LANGUAGE TO SQL 项目地址: https://gitcode.com/gh_mirrors/xiy/XiYan-SQL 项目概览与核心优势 XiYan-SQL是一个基于AI技术的智能SQL生成工…

作者头像 李华
网站建设 2026/6/15 13:48:27

完整kbar命令面板教程:3步快速构建现代化搜索功能

完整kbar命令面板教程&#xff1a;3步快速构建现代化搜索功能 【免费下载链接】kbar fast, portable, and extensible cmdk interface for your site 项目地址: https://gitcode.com/gh_mirrors/kb/kbar 想要为你的React应用添加类似VSCode命令面板的智能搜索体验吗&…

作者头像 李华
网站建设 2026/6/15 13:43:13

FastGPT API开发终极指南:从零构建企业级AI应用

为什么你的FastGPT API项目总是失败&#xff1f; 【免费下载链接】FastGPT labring/FastGPT: FastGPT 是一个基于PyTorch实现的快速版GPT&#xff08;Generative Pretrained Transformer&#xff09;模型&#xff0c;可能是为了优化训练速度或资源占用而设计的一个实验性项目&a…

作者头像 李华
网站建设 2026/6/8 0:45:08

libwebkit2gtk-4.1-0安装与嵌入式Linux桌面浏览器开发关联解析

嵌入式Linux中的Web革命&#xff1a;从libwebkit2gtk-4.1-0安装到高性能HMI开发你有没有遇到过这样的场景&#xff1f;一台工业触摸屏设备&#xff0c;界面还是十年前的按钮风格&#xff1b;一个车载中控系统&#xff0c;加载个网页慢得像在等开水烧开&#xff1b;或者一款智能…

作者头像 李华