首页
社区
课程
招聘
[求助]驱动中删除符号链接但没删除设备,如何处理
发表于: 2009-8-5 17:47 7419

[求助]驱动中删除符号链接但没删除设备,如何处理

2009-8-5 17:47
7419
在学习windows驱动开发技术详解的过程中
有一个例子是在DriverEntry中创建两个设备对象,其关系是水平向上的关系。
        // 创建驱动设备对象
  status = CreateDevice(pDriverObjcet);
  status = CreateDevice2(pDriverObjcet);

在Unload例程中执行如下操作(少删除了一个设备)
  RtlInitUnicodeString(&pLinkName, SYMLINKNAME);
  IoDeleteSymbolicLink(&pLinkName);
  RtlInitUnicodeString(&pLinkName2, SYMLINKNAME2);
  IoDeleteSymbolicLink(&pLinkName2);
  IoDeleteDevice(pDriverObject->DeviceObject);
用KDM加载执行的时候第一次都显示成功,但第二次就出问题了
点击运行的时候提示:系统找不到指定的文件

这种由同一个driver创建的设备,只删除一个那另一个以哪种形式存在?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
删除2那个不就得了
2009-8-5 18:30
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
可能我表达的有问题
驱动和设备的生命周期各是多久?
他们之间是一种什么关系?
我的理解是:
驱动加载的时候,系统进程启动新的线程,调用执行体组件中的对象管理器,创建一个驱动对象。
然后由驱动对象创建设备对象。
在驱动调用DriverUnload例程时,删除设备。
这时候设备和驱动的生命周期同时结束。

我按上述想法试验了下,由一个Driver创建两个同级的Device
Driver

Device

但删除的时候只删除一个
剩下的那个Device

符号链接

这时候用WinObj查看驱动,驱动已经不存在了
只剩下那个没删除的设备
这种情况下再加载驱动,就会出现上面那种找不到指定文件的情况
重启系统后,那个没删除的设备就自动消失了
按理来说设备不能脱离驱动而存在,所以再加载驱动的时候会失败
由于在DriverUnload中没有对设备2的资源进行回收,在内核模式他不会自动释放
所以重启后才自动释放。
不知道这种理解对不
上传的附件:
2009-8-6 11:19
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
4
看看WRK中的IoCreateDevice的流程吧(位于iosubs.c),它的流程就是ObCreateObject创建一个IoDeviceObjectType类型的对象,填充它的各个域,ObInsertObject把它加入对象表,最后把它的DriverObject域指向驱动对象,再调用IopInsertRemoveDevice把它加入DriverObject的DeviceObject的链表中。
IoDeleteDevice的流程,最后也同样调用IopInsertRemoveDevice把DeviceObject从DriverObject的DeviceObject链表中摘除。

VOID
IopInsertRemoveDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT DeviceObject,
    IN BOOLEAN Insert
    )

{
    KIRQL irql;

    irql = KeAcquireQueuedSpinLock( LockQueueIoDatabaseLock );
    if (Insert) {
        DeviceObject->NextDevice = DriverObject->DeviceObject;
        DriverObject->DeviceObject = DeviceObject;
        }
    else {
        PDEVICE_OBJECT *prevPoint;

        prevPoint = &DeviceObject->DriverObject->DeviceObject;
        while (*prevPoint != DeviceObject) {
            prevPoint = &(*prevPoint)->NextDevice;
        }
        *prevPoint = DeviceObject->NextDevice;
    }
    KeReleaseQueuedSpinLock( LockQueueIoDatabaseLock, irql );
}

可以看到,当第一个DriverObject->DeviceObject被Delete,原来其DeviceObject->NextDevice中保存的下一个设备对象就会被填入DriverObject->DeviceObject,所以只需要再原样调用一次:
IoDeleteDevice(pDriverObject->DeviceObject);//第一次
IoDeleteDevice(pDriverObject->DeviceObject);//第二次
就可以把两个设备都删除了。
如果要先删除特定的设备,只要通过DriverObject->DeviceObject开始,找DeviceObject->NextDevice找到相应的对象,对其调用IoDeleteDevice。
驱动对象及其创建的设备对象的水平层次结构如《windows驱动开发技术详解》第112页图4-14所示,楼主应该仔细看书。
2009-8-6 16:00
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢轩辕小聪回复
那个删除的问题上午解决了
是通过下面代码来删除的
IoDeleteDevice(pDriverObject->DeviceObject->NextDevice);
IoDeleteDevice(pDriverObject->DeviceObject);
刚开始学驱动,有时间把WRK拿来研究下
还有关于驱动和设备的生命周期的理解对吗?
2009-8-6 16:42
0
游客
登录 | 注册 方可回帖
返回
//