news 2026/6/10 12:18:05

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/6/10 12:14:15

YOLOv8文档自动生成:Sphinx+ReadTheDocs实践

YOLOv8文档自动生成&#xff1a;SphinxReadTheDocs实践 在现代AI项目开发中&#xff0c;一个常见的困境是&#xff1a;代码已经迭代到第三版&#xff0c;但文档还停留在初稿阶段&#xff1b;团队新人花三天才配好环境&#xff0c;只因少装了一个依赖&#xff1b;生产部署时发现…

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

谷歌相册和Nano Banana将登陆三星电视

谷歌相册和Nano Banana将登陆三星电视 三星希望你的电视能兼作家庭相册。 这家公司对客厅人工智能有着更富情感色彩的构想。在周一的新闻稿中&#xff0c;三星宣布计划将谷歌相册引入其AI电视产品线&#xff0c;将电视变成展示珍贵记忆的超大数码相框。这项目前定于2026年开始推…

作者头像 李华
网站建设 2026/6/2 19:05:59

YOLOv8目标检测实战:如何利用GPU算力加速模型训练

YOLOv8目标检测实战&#xff1a;如何利用GPU算力加速模型训练 在智能摄像头自动识别行人、无人机实时追踪移动目标、工业产线快速定位缺陷产品的背后&#xff0c;都离不开一个核心技术——目标检测。而今天&#xff0c;如果你还在用CPU训练深度学习模型&#xff0c;那可能连一轮…

作者头像 李华
网站建设 2026/6/1 3:25:05

PHP能否胜任工业控制系统的实时性要求?实测10万点/秒处理能力真相曝光

第一章&#xff1a;PHP能否胜任工业控制系统的实时性要求&#xff1f;在工业自动化与控制系统领域&#xff0c;实时性是衡量系统性能的核心指标之一。这类系统通常要求在确定的时间内完成关键任务&#xff0c;延迟超过毫秒级就可能导致设备故障或生产事故。而PHP作为一种广泛用…

作者头像 李华
网站建设 2026/6/6 2:24:52

我用鸿蒙开发了一个爆款小游戏,7天赚了10万 - 我的完整开发日记

说出来你可能不信,我人生第一个真正意义上"爆款"的应用,是一个简单到不能再简单的小游戏。而且,它让我在一周内赚了10万。 更关键的是,这个游戏从构思到上线,只用了5天时间。 故事要从一次失恋说起 去年10月,我刚和女朋友分手。原因很简单 - 她觉得我"…

作者头像 李华
网站建设 2026/5/28 16:25:55

Arbess速成手册(6) - 集成GitLab系统实现Vue.js项目自动化部署

Arbess 是一款开源免费的 CI/CD 工具&#xff0c;支持免费私有化部署&#xff0c;一键安装零配置&#xff0c;简洁易用等特点。本文将详细介绍如何安装Arbess、GitLab&#xff0c;并创建配置流水线实现 Vue.Js 项目构建并主机部署。 1、GitLab 安装与配置 本章节将介绍如何使…

作者头像 李华