news 2026/3/14 14:19:39

PipSetDevNodeState函数的重要作用值从状态DeviceNodeStarted到状态DeviceNodeEnumerateCompletion到状态DeviceNodeStarted重要

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PipSetDevNodeState函数的重要作用值从状态DeviceNodeStarted到状态DeviceNodeEnumerateCompletion到状态DeviceNodeStarted重要

nt!PipSetDevNodeState函数的重要作用值从状态DeviceNodeStarted到状态DeviceNodeEnumerateCompletion到状态DeviceNodeStarted重要

第一部分:

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 DeviceNodeStarted:

nextNode = ChildNode;
if (!ProcessOnlyIntermediateStates) {

if ((currentNode->Flags & DNF_REENUMERATE)) {

status = PipEnumerateDevice(currentNode, Synchronous);
if (NT_SUCCESS(status)) {

//
// Remember the bus we just enumerated.
//

enumeratedBus = currentNode;
nextNode = SameNode;

} else if (status == STATUS_PENDING) {

nextNode = SiblingNode;
}
}
}
break;

NTSTATUS
PipEnumerateDevice(
IN PDEVICE_NODE DeviceNode,
IN BOOLEAN Synchronous
)
{
NTSTATUS status;

PAGED_CODE();

//
// Clear the flag before the query so we dont lose an enum request.
//
DeviceNode->Flags &= ~DNF_REENUMERATE;
status = IopQueryDeviceRelations(BusRelations,
DeviceNode->PhysicalDeviceObject,
Synchronous,
&DeviceNode->OverUsed1.PendingDeviceRelations
);

return status;
}

NTSTATUS
IopQueryDeviceRelations(
IN DEVICE_RELATION_TYPE Relations,
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN Synchronous,
OUT PDEVICE_RELATIONS *DeviceRelations
)
{
IO_STACK_LOCATION irpSp;
NTSTATUS status;
PDEVICE_NODE deviceNode = (PDEVICE_NODE)DeviceObject->DeviceObjectExtension->DeviceNode;

UNREFERENCED_PARAMETER (Synchronous);

//
// Initialize the stack location to pass to IopSynchronousCall()
//

RtlZeroMemory(&irpSp, sizeof(IO_STACK_LOCATION));

//
// Set the function codes.
//

irpSp.MajorFunction = IRP_MJ_PNP;
irpSp.MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;

//
// Set the pointer to the resource list
//

irpSp.Parameters.QueryDeviceRelations.Type = Relations;

//
// Make the call and return.
//
status = IopSynchronousCall(DeviceObject, &irpSp, (PULONG_PTR)DeviceRelations);

if (Relations == BusRelations) {

deviceNode->CompletionStatus = status;

PipSetDevNodeState( deviceNode, DeviceNodeEnumerateCompletion, NULL );

status = STATUS_SUCCESS;
}

return status;
}

第二部分:

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
)
{
PDEVICE_NODE childDeviceNode, nextChildDeviceNode;
PDEVICE_OBJECT childDeviceObject;
BOOLEAN childRemoved;
NTSTATUS status, allocationStatus;
ULONG i;

PAGED_CODE();

if (DeviceNode->OverUsed1.PendingDeviceRelations == NULL) {

PipSetDevNodeState(DeviceNode, DeviceNodeStarted, NULL);

return STATUS_SUCCESS;
}

//
// Walk all the child device nodes and mark them as not present
//

childDeviceNode = DeviceNode->Child;
while (childDeviceNode) {
childDeviceNode->Flags &= ~DNF_ENUMERATED;
childDeviceNode = childDeviceNode->Sibling;
}

//
// 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(DeviceNode->State == DeviceNodeEnumerateCompletion);
PipSetDevNodeState(DeviceNode, DeviceNodeStarted, NULL);

return status;
}

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

DeepSeek应用完全指南:从PPT制作到会议纪要,3个实用技巧助你高效工作

本文介绍了DeepSeek与三种第三方平台的结合使用技巧&#xff1a;与Kimi协作自动生成高质量PPT&#xff0c;与ChatExcel合作创建数据驱动型报告&#xff0c;以及与飞书妙记配合生成结构化会议纪要。这些组合应用极大地降低了AI使用门槛&#xff0c;使普通人也能轻松将AI技术应用…

作者头像 李华
网站建设 2026/3/12 2:29:54

CES 2026趋势展望:全球最大科技展五大热门话题预测

CES即将到来&#xff0c;将于1月4日对媒体开放&#xff08;大多数新闻在此期间发布&#xff09;&#xff0c;并于1月6日对公众开放。作为世界最大的科技会议&#xff0c;这个展会通过公司在全球舞台上展示最新创新成果来开启新的一年。结果就是为科技爱好者和普通大众带来大量的…

作者头像 李华
网站建设 2026/2/25 4:07:17

YOLOv8客户成功案例:某AI公司降本增效实践

YOLOv8客户成功案例&#xff1a;某AI公司降本增效实践 在智能制造工厂的巡检系统中&#xff0c;一个看似简单的技术选择——目标检测模型的部署方式&#xff0c;正悄然改变着整个项目的交付节奏。过去&#xff0c;新员工入职后往往需要耗费整整两天时间搭建Python环境、调试PyT…

作者头像 李华
网站建设 2026/3/13 0:02:39

LLM - 从 MCP 到 Skills:2025 年 AI Agent 的工程实践全景解析

文章目录一、引言&#xff1a;从“什么都会”到“能做成事”二、MCP 之后&#xff1a;为什么一定会走到 Skills2.1 MCP&#xff1a;让 Agent 真正“有手有脚”2.2 Skills&#xff1a;从“工具列表”到“可执行经验”三、上下文工程&#xff1a;从“多给点信息”到“精确地给对信…

作者头像 李华
网站建设 2026/3/13 12:34:00

YOLOv8日志审计功能:记录每次训练行为轨迹

YOLOv8日志审计功能&#xff1a;记录每次训练行为轨迹 在深度学习项目中&#xff0c;最让人头疼的不是模型跑不起来&#xff0c;而是当你发现某个实验效果突然变差时&#xff0c;根本记不清那次训练到底用了什么参数、数据集路径有没有改、图像尺寸是不是调小了。更糟的是&…

作者头像 李华
网站建设 2026/3/7 22:04:36

YOLOv8自动标注功能:减少人工标注成本

YOLOv8自动标注功能&#xff1a;减少人工标注成本 在智能视觉系统开发中&#xff0c;最让人头疼的往往不是模型训练本身&#xff0c;而是前期的数据准备——尤其是目标检测任务中繁琐的人工框选。一张图可能要花几分钟去标注几个物体&#xff0c;成千上万张图下来&#xff0c;…

作者头像 李华