news 2026/6/10 11:47:07

PipProcessDevNodeTree之状态DeviceNodeUninitialized下调用PiProcessNewDeviceNode建立DeviceNode->InstancePath

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PipProcessDevNodeTree之状态DeviceNodeUninitialized下调用PiProcessNewDeviceNode建立DeviceNode->InstancePath

nt!PipProcessDevNodeTree函数分析之状态DeviceNodeUninitialized下调用PiProcessNewDeviceNode建立DeviceNode->InstancePath

然后进入状态DeviceNodeInitialized


PipSetDevNodeState(DeviceNode, DeviceNodeInitialized, NULL);


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
)
{


switch (currentNode->State) {

case DeviceNodeUninitialized:

if (!ProcessOnlyIntermediateStates) {

if (currentNode->Parent == enumeratedBus && startRoot == NULL) {

startRoot = currentNode;
}
if((!ReallocateResources && EnumType == EnumTypeNone) || startRoot) {

status = PiProcessNewDeviceNode(currentNode);
if (NT_SUCCESS(status)) {

nextNode = SameNode;
}
}
}
break;


NTSTATUS
PiProcessNewDeviceNode(
IN PDEVICE_NODE DeviceNode
)
{

}
}
//
// Build the device instance path and create the instance key.
//
status = PiBuildDeviceNodeInstancePath(DeviceNode, busID, deviceID, instanceID);


。。。。。。


//
// ISSUE: Should not mark the state if the IDs were invalid.
//
PipSetDevNodeState(DeviceNode, DeviceNodeInitialized, NULL);

NTSTATUS
PiBuildDeviceNodeInstancePath(
IN PDEVICE_NODE DeviceNode,
IN PWCHAR BusID,
IN PWCHAR DeviceID,
IN PWCHAR InstanceID
)

/*++

Routine Description:

This function builds the instance path (BusID\DeviceID\InstanceID). If
successful, it will free the storage for any existing instance path and
replace with the new one.

Arguments:

DeviceNode - DeviceNode for which the instance path will be built.

BusID - Bus ID.

DeviceID - Device ID.

InstanceID - Instance ID.

Return Value:

NTSTATUS.

--*/

{
ULONG length;
PWCHAR instancePath;

PAGED_CODE();

if (BusID == NULL || DeviceID == NULL || InstanceID == NULL) {

ASSERT( PipIsDevNodeProblem(DeviceNode, CM_PROB_INVALID_DATA) ||
PipIsDevNodeProblem(DeviceNode, CM_PROB_OUT_OF_MEMORY) ||
PipIsDevNodeProblem(DeviceNode, CM_PROB_REGISTRY));

return STATUS_UNSUCCESSFUL;
}

length = (ULONG)((wcslen(BusID) + wcslen(DeviceID) + wcslen(InstanceID) + 2) * sizeof(WCHAR) + sizeof(UNICODE_NULL));
instancePath = (PWCHAR)ExAllocatePool(PagedPool | POOL_COLD_ALLOCATION, length);
if (!instancePath) {

return STATUS_INSUFFICIENT_RESOURCES;
}
//
// Construct the instance path as <BUS>\<DEVICE>\<INSTANCE>. This should always be NULL terminated
// since we have precomputed the length that we pass into this counted routine.
//
StringCbPrintfW(instancePath, length, L"%s\\%s\\%s", BusID, DeviceID, InstanceID);
//
// Free old instance path.
//
if (DeviceNode->InstancePath.Buffer != NULL) {

IopCleanupDeviceRegistryValues(&DeviceNode->InstancePath);
ExFreePool(DeviceNode->InstancePath.Buffer);
}

RtlInitUnicodeString(&DeviceNode->InstancePath, instancePath);

return STATUS_SUCCESS;

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

YOLOv8在智能安防领域的落地实践

YOLOv8在智能安防领域的落地实践 在城市级监控系统日益普及的今天&#xff0c;一个尴尬的事实依然存在&#xff1a;成千上万的摄像头每天产生海量视频数据&#xff0c;但真正被“看见”的却少之又少。安保人员盯着屏幕数小时&#xff0c;可能只为捕捉几秒的关键画面——这种低效…

作者头像 李华
网站建设 2026/6/10 11:05:11

办理UN38.3认证需要什么材料?流程是什么样的?

UN38.3 是锂电池运输安全的强制测试&#xff08;联合国《危险货物运输建议书》&#xff09;&#xff0c;用于空运 / 海运 / 陆运清关与收运&#xff0c;通常以第三方实验室出具的测试报告形式呈现&#xff0c;而非统一 “证书”&#xff1b;出口常需搭配 MSDS、货物运输条件鉴定…

作者头像 李华
网站建设 2026/6/10 1:11:37

Gemini为STOC 2026大会理论计算机科学家提供自动化反馈

我们介绍了一个使用Gemini帮助科学家严格验证其会议投稿论文正确性的新工具&#xff0c;该工具在STOC 2026大会上进行了测试。理论计算机科学和数学对真理的追求依赖于最高标准的证明、严谨性和清晰度。虽然同行评议是关键的最终检查&#xff0c;但起草和完善复杂理论工作的过程…

作者头像 李华
网站建设 2026/6/7 18:24:24

Java面试复习大纲:ZK+Redis+MySQL+Java基础+架构

多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础知识点考核算法题这个流程下来的。有些公司可能还会问几个实际的场景类的问题&#xff0c;这个环节阿里是必问的&#xff0c;这种问题通常是没有正确答案的&#xff0c;就看个人的理解&#xff0c;个人的积累了…

作者头像 李华
网站建设 2026/5/28 18:19:29

YOLOv8镜像集成Prometheus监控组件

YOLOv8镜像集成Prometheus监控组件 在现代AI系统日益复杂、部署规模不断扩大的背景下&#xff0c;一个常见的困境浮出水面&#xff1a;我们能轻松跑通模型训练和推理流程&#xff0c;却很难回答“它运行得怎么样&#xff1f;”这个问题。尤其在多用户共享GPU服务器或生产环境部…

作者头像 李华