news 2026/4/23 12:26:02

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/4/23 12:21:47

微软CEO萨提亚·纳德拉称AI并非为取代人类而生 援引乔布斯观点佐证

微软CEO萨提亚纳德拉称AI并非为取代人类而生 援引乔布斯观点佐证 未来工作方式将被重新定义&#xff1f; 2025年人工智能主导了全球对话&#xff0c;这种趋势短期内不会消退。但微软CEO萨提亚纳德拉希望2026年能将焦点从"取代恐惧"转向"智能协作"。他援引苹…

作者头像 李华
网站建设 2026/4/23 12:14:02

YOLOv8 Web前端展示:Flask + OpenCV整合示例

YOLOv8 Web前端展示&#xff1a;Flask OpenCV整合示例 在智能安防、工业质检和科研演示中&#xff0c;一个训练好的目标检测模型如果只能跑在Jupyter Notebook里&#xff0c;那它的实际价值大打折扣。真正让AI“落地”的关键一步&#xff0c;是把它变成普通人也能用的工具——…

作者头像 李华
网站建设 2026/4/21 10:15:46

第23篇 QT qxorm连接oracle查询数据

前提,编译通过 第22篇 QT creator 5.15.2编译oracle sql驱动qsqloci.dll https://txwtech.blog.csdn.net/article/details/156422815 第1步:编译库放在plugins的sqldrivers 第2步:环境变量设置: path添加路径: 如:压缩包下载后,解压到D:\instantclient_19_29,则…

作者头像 李华