WDM驱动调试
+ -

WDM 驱动中创建的设备链表

2022-02-23 144 0

一个驱动加载后,可以根据需要创建多个设备,这些设备会以链表的形式连接起来,并且第一个设备的指针存放在DRIVER_OJECT的DeviceObject成员中。后续的设备会依次按DEVICE_OJBECT的NextDevice进行链表连接,直到最后一个为NULL.

3: kd> dt _DEVICE_OBJECT
usbip_vhci!_DEVICE_OBJECT
   +0x000 Type             : Int2B
   +0x002 Size             : Uint2B
   +0x004 ReferenceCount   : Int4B
   +0x008 DriverObject     : Ptr64 _DRIVER_OBJECT     //驱动对象指针
   +0x010 NextDevice       : Ptr64 _DEVICE_OBJECT     //下一个同级设备
   +0x018 AttachedDevice   : Ptr64 _DEVICE_OBJECT      //下一个子级设备
   +0x020 CurrentIrp       : Ptr64 _IRP
   +0x028 Timer            : Ptr64 _IO_TIMER
   +0x030 Flags            : Uint4B
   +0x034 Characteristics  : Uint4B
   +0x038 Vpb              : Ptr64 _VPB
   +0x040 DeviceExtension  : Ptr64 Void
   +0x048 DeviceType       : Uint4B
   +0x04c StackSize        : Char
   +0x050 Queue            : <unnamed-tag>
   +0x098 AlignmentRequirement : Uint4B
   +0x0a0 DeviceQueue      : _KDEVICE_QUEUE
   +0x0c8 Dpc              : _KDPC
   +0x108 ActiveThreadCount : Uint4B
   +0x110 SecurityDescriptor : Ptr64 Void
   +0x118 DeviceLock       : _KEVENT
   +0x130 SectorSize       : Uint2B
   +0x132 Spare1           : Uint2B
   +0x138 DeviceObjectExtension : Ptr64 _DEVOBJ_EXTENSION
   +0x140 Reserved         : Ptr64 Void

在以前的NT驱动卸载时,会在其卸载回调函数中会枚举该驱动中所有的DeviceOjbect,然后再删除。当然如果该DRIVER_OJBECT中创建了一个DEVICE_OBJECT,那DROVER_OJBECT中的DeviceObject就是该设备。

VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
    PDEVICE_OBJECT    pNextObj = pDriverObject->DeviceObject;
    while (pNextObj != NULL) 
    {
        PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;

        //删除符号链接
        UNICODE_STRING pLinkName = pDevExt->wstrSymbolicLinkName;
        KdPrint(("%wZ\n",pLinkName));

        IoDeleteSymbolicLink(&pLinkName);
        pNextObj = pNextObj->NextDevice;
        IoDeleteDevice( pDevExt->pDeviceObject );
    }
}

0 篇笔记 写笔记

WDM 驱动中创建的设备链表
一个驱动加载后,可以根据需要创建多个设备,这些设备会以链表的形式连接起来,并且第一个设备的指针存放在DRIVER_OJECT的DeviceObject成员中。后续的设备会依次按DEVICE_OJBECT的NextDevice进行链表连接,直到最后一个为NULL.3: kd> dt _DEVI......
驱动入口函数DriverEntry
DriverEntry是Windows内核驱动的入口函数,其函数原型如下:NTSTATUS DriverEntry(__in PDRIVER_OBJECT drvobj, __in PUNICODE_STRING RegistryPath);其包括两个参数,一个为该驱动的对象结构体指针,另一个是......
DEVICE_OBJECT、DEVOBJ_EXTENSION、DEVICE_NODE的关系
有一种设备,叫做Docking外设备。当时也把我给dock住了,其实就是扩展坞之类的设备,对于USB来说,就是广义的USB集线器HUB。Windows内核对此设备在内核对象中做了明确的区别。这里我们就路遥十万八千里,取个尖尖小经。首先打开OSR出口的神器DeviceTree。这里我选择一个USB集线......
驱动对象DRIVER_OBJECT结构体定义
DRIVER_OBJECT结构体在Windows内核中代表着一个驱动对象。WDK中其结构体定义如下:typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; // // The following link......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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