Windbg
+ -

虚拟总线创建子设备返回无效ID

2023-12-20 6 0

虚拟了一个虚拟总线设备,从设备管理器中看来是正常的,但从功能上来看是不正常的。
在设备管理器中提示如下:
设备管理器
设备管理器
这个设备运转正常。Windows 无法识别与该硬件连接的一个次要设备,原因使该设备没有有效的硬件标识号。
请与硬件制造商联系取得协助。

从上面的提示来看,是因为无一个有效的硬件标识号。
什么是硬件标识号呢?其实就是硬件ID,一般也有写作为设备ID.
在Windows系统中一般会有几个设备ID需要标识,其都是通过IRP_MN_QUERY_ID来获取的,其主要几个子分,分别为:

  • BusQueryDeviceID
  • BusQueryInstanceID
  • BusQueryHardwareIDs
  • BusQueryCompatibleIDs

这里明确提示硬件IDs,只是自己这里的代码写的有误。虽然通过Irp->IoStatus.Information 返回了硬件的ID的有效指针,但因STATUS没有置STATUS_SUCCCESS,而是代码默认的STATUS_NOT_SUPPORTED。故才会有一问题。

我们修改代码后再加载驱动,可以看到,子节点因正确返回了有效的ID,出现并显示:
200639528483
200845844541

使用WINDBG查看设备信息:

0: kd> dt _DEVICE_OBJECT 0XFFFF890DAA06C2D0
nt!_DEVICE_OBJECT
   +0x000 Type             : 0n3
   +0x002 Size             : 0x190
   +0x004 ReferenceCount   : 0n0
   +0x008 DriverObject     : 0xffff890d`b1690e10 _DRIVER_OBJECT
   +0x010 NextDevice       : 0xffff890d`aad126a0 _DEVICE_OBJECT
   +0x018 AttachedDevice   : (null) 
   +0x020 CurrentIrp       : (null) 
   +0x028 Timer            : (null) 
   +0x030 Flags            : 0x3044
   +0x034 Characteristics  : 0x180
   +0x038 Vpb              : (null) 
   +0x040 DeviceExtension  : 0xffff890d`aa06c420 Void
   +0x048 DeviceType       : 0x2a
   +0x04c StackSize        : 1 ''
   +0x050 Queue            : <unnamed-tag>
   +0x098 AlignmentRequirement : 0
   +0x0a0 DeviceQueue      : _KDEVICE_QUEUE
   +0x0c8 Dpc              : _KDPC
   +0x108 ActiveThreadCount : 0
   +0x110 SecurityDescriptor : 0xffffce88`56bfc1a0 Void
   +0x118 DeviceLock       : _KEVENT
   +0x130 SectorSize       : 0
   +0x132 Spare1           : 0
   +0x138 DeviceObjectExtension : 0xffff890d`aa06c460 _DEVOBJ_EXTENSION
   +0x140 Reserved         : (null) 
0: kd> DT  _DEVOBJ_EXTENSION 0xffff890d`aa06c460
nt!_DEVOBJ_EXTENSION
   +0x000 Type             : 0n13
   +0x002 Size             : 0
   +0x008 DeviceObject     : 0xffff890d`aa06c2d0 _DEVICE_OBJECT
   +0x010 PowerFlags       : 0
   +0x018 Dope             : (null) 
   +0x020 ExtensionFlags   : 0x10
   +0x028 DeviceNode       : 0xffff890d`ac0c6c00 Void
   +0x030 AttachedTo       : (null) 
   +0x038 StartIoCount     : 0n0
   +0x03c StartIoKey       : 0n0
   +0x040 StartIoFlags     : 0
   +0x048 Vpb              : (null) 
   +0x050 DependencyNode   : (null) 
   +0x058 InterruptContext : (null) 
   +0x060 VerifierContext  : (null) 
0: kd> dt _DEVICE_NODE 0xffff890d`ac0c6c00
nt!_DEVICE_NODE
   +0x000 Sibling          : (null) 
   +0x008 Child            : (null) 
   +0x010 Parent           : 0xffff890d`ab399660 _DEVICE_NODE
   +0x018 LastChild        : (null) 
   +0x020 PhysicalDeviceObject : 0xffff890d`aa06c2d0 _DEVICE_OBJECT
   +0x028 InstancePath     : _UNICODE_STRING "VUSB\PHCI\1&79f5d87&8&0"
   +0x038 ServiceName      : _UNICODE_STRING ""
   +0x048 PendingIrp       : (null) 
   +0x050 FxDevice         : (null) 
   +0x058 FxDeviceLock     : 0n0
   +0x060 FxRemoveEvent    : _KEVENT
   +0x078 FxActivationCount : 0n0
   +0x07c FxSleepCount     : 0n0
   +0x080 Plugin           : (null) 
   +0x088 Level            : 2
   +0x08c CurrentPowerState : _POWER_STATE
   +0x090 Notify           : _PO_DEVICE_NOTIFY
   +0x0f8 PoIrpManager     : _PO_IRP_MANAGER
   +0x118 UniqueId         : _UNICODE_STRING ""
   +0x128 PowerFlags       : 0
   +0x12c State            : 302 ( DeviceNodeInitialized )
   +0x130 PreviousState    : 301 ( DeviceNodeUninitialized )
   +0x134 StateHistory     : [20] 301 ( DeviceNodeUninitialized )
   +0x184 StateHistoryEntry : 1
   +0x188 CompletionStatus : 0n0
   +0x18c Flags            : 0x2230
   +0x190 UserFlags        : 0
   +0x194 Problem          : 0x1c
   +0x198 ProblemStatus    : 0n-1073740656
   +0x1a0 ResourceList     : (null) 
   +0x1a8 ResourceListTranslated : (null) 
   +0x1b0 DuplicatePDO     : (null) 
   +0x1b8 ResourceRequirements : 0xffffce88`5a2afe10 _IO_RESOURCE_REQUIREMENTS_LIST
   +0x1c0 InterfaceType    : 0xffffffff (No matching name)
   +0x1c4 BusNumber        : 0xffffffff
   +0x1c8 ChildInterfaceType : f ( PNPBus )
   +0x1cc ChildBusNumber   : 0xa
   +0x1d0 ChildBusTypeIndex : 5
   +0x1d2 RemovalPolicy    : 0x1 ''
   +0x1d3 HardwareRemovalPolicy : 0x1 ''
   +0x1d8 TargetDeviceNotify : _LIST_ENTRY [ 0xffff890d`ac0c6dd8 - 0xffff890d`ac0c6dd8 ]
   +0x1e8 DeviceArbiterList : _LIST_ENTRY [ 0xffff890d`ac0c6de8 - 0xffff890d`ac0c6de8 ]
   +0x1f8 DeviceTranslatorList : _LIST_ENTRY [ 0xffff890d`ac0c6df8 - 0xffff890d`ac0c6df8 ]
   +0x208 NoTranslatorMask : 0
   +0x20a QueryTranslatorMask : 0
   +0x20c NoArbiterMask    : 0
   +0x20e QueryArbiterMask : 0
   +0x210 OverUsed1        : <unnamed-tag>
   +0x218 OverUsed2        : <unnamed-tag>
   +0x220 BootResources    : (null) 
   +0x228 BootResourcesTranslated : (null) 
   +0x230 CapabilityFlags  : 0
   +0x238 DockInfo         : <unnamed-tag>
   +0x258 DisableableDepends : 0
   +0x260 PendedSetInterfaceState : _LIST_ENTRY [ 0xffff890d`ac0c6e60 - 0xffff890d`ac0c6e60 ]
   +0x270 LegacyBusListEntry : _LIST_ENTRY [ 0xffff890d`ac0c6e70 - 0xffff890d`ac0c6e70 ]
   +0x280 DriverUnloadRetryCount : 0
   +0x288 PreviousParent   : (null) 
   +0x290 DeletedChildren  : 0n0
   +0x294 NumaNodeIndex    : 0xffffffff
   +0x298 ContainerID      : _GUID {00000000-0000-0000-ffff-ffffffffffff}
   +0x2a8 OverrideFlags    : 0x1 ''
   +0x2ac DeviceIdsHash    : 0x4dad0bec
   +0x2b0 RequiresUnloadedDriver : 0 ''
   +0x2b8 PendingEjectRelations : (null) 
   +0x2c0 StateFlags       : 0
   +0x2c8 RebalanceContext : (null) 
   +0x2d0 IommuExtension   : (null) 
   +0x2d8 DirectedDripsState : _PO_DIRECTED_DRIPS_STATE

0 篇笔记 写笔记

Windbg 跟踪句柄泄漏(!htrace)
!htrace(Handle Trace) 扩展用于显示一个或多个句柄的堆栈回溯信息。直接用!htrace -?可以看到简单使用说明:0:000> !htrace -? !htrace [handle [max_traces]] !htrace -enable [max_traces......
Windbg 断点命令BP
断点指令:BP,BM,BA,BL,BC,BD,BEBP 在指定的地址设置断点bp notepad!WinMain,在Notepad的WinMain函数处下断点。断点的位置可以用符号表示,也以直接使用地址及Windbg的Pseudo-Register(虚拟寄存器),如$exentry表示进程的入口点,......
Windbg 符号查找命令x
x 查看模块的符号,如x nt!KeServiceDescriptorTable**,显示所有与 nt!KeServiceDescriptorTable匹配的符号列表kd> x nt!KeServiceDescriptorTable*8046e100 nt!KeServiceDescrip......
Windbg 符号库及源文件设置
Windbg设置一般分为符号库路径设置和源文件路径设置符号库路径设置打开菜单栏,选择“Symbol File Path …”,在弹出的对话框栏中填入可载的入符号库,多个路径以分号“;”分隔。微软提供了操作系统的全部符号库,所以如果要进行windows系统自带的内核模块或应用模块进行调试,也可以只需......
Windbg 进程环境块!peb
!peb 查看当前进程环境块(PEB)注意:在64位操作系统下,使用64位和32windbg调试32位进程时,看到的地址不一样。如64位下的notepad内容如下:0:001> !pebPEB at 000007fffffd3000 InheritedAddressSpace:......
Windbg 自动分析!analyze
调试一个当机的目标计算机或应用程序,第一步是使用 !analyze 扩展命令。该扩展执行大量的自动分析。分析结果在调试器命令窗口中显示。若要数据的全冗长模式显示,你应该使用 -v 选项。例如: !analyze -v用户模式 !analyze -v 示例本例中,调试器被附加到一个已遭遇异常......
Windbg 反汇编命令u/uf
反汇编指令u,uf对指令的地址进行反汇编或对某一个函数进行反汇编u @$exentry L10L10表示控制显示0x10行反汇编,即16行0:001> u @$exentry L10notepad!WinMainCRTStartup:01006420 55 ......
Windbg 内存属性(!address)
!address!address 扩展显示目标进程或目标机使用的内存信息在调试时, 对象和栈都包含了大量的指针, 我们无法很快地猜测出他们所表示的数据. 虽然我们可以很容易地将内核空间的地址与用户态空间的地址分开, 但要把一个表示栈的地址和一个表示堆的地址区分开却不容易. 我们可以使用一个很有用的......
Windbg 结构体命令dt
dt 查看类型数据,还可用于查看模块类型的符号列表,如 dt _IMAGE_DOS_HEADER 00000000ff800000 从00000000ff800000处查看_IMAGE_DOS_HEADER类型的数据0:001> dt _IMAGE_DOS_HEADER 0000000......
Windbg 简介
Windbg是Microsoft公司免费调试器调试集合中的GUI的调试器,支持源代码和汇编两种模式的调试,也可以对软件运行过程中的dumpy文件进行分析。Windbg不仅可以调试应用程序,还可以进行Kernel Debug,同时结合Microsoft的Symbol Server调试应用程序和K......
Windbg 寄存器命令r
Windbg中r指令除了可以显示修改CPU寄存器之外,Pseudo-Register可使用这个命令来修改。对eax 操作,r eax 显示其值,r eax=2,修改其值;r $t2=10,修改Pseudo-Register的值,r @$t2显示其值。0:001> rrax=000007f......
Windbg 搜索命令s
在内存中搜索某个值 - 命令s命令s(表示搜索search), 是一个非常有用的命令, 可以用来在调试目标内找出已知的值.这个命令的参数包括素要搜索的类型和值.s –d 0012ff40 L1024 c0000005其中-d代表双字DWORD, 是搜索的类型. 其他类型例举如下:b – B......
Windbg 模块列表命令lm
lm,显示当前加系统(内核)或进程加载的模块如x64记事本下:0:001> lmstart end module name00000000`77410000 00000000`7750a000 USER32 (defe......
Windbg 格式化命令.formats
以多种格式显示表达式的值windbg默认为16进制.formats 1000:001> .formats 100Evaluate expression: Hex: 00000000`00000100 Decimal: 256 Octal: 0000000000......
Windbg 打开源文件命令open
当配置了源文件路径后,可以通过.open命令打开源文件。如.open hello.c......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!