找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5555|回复: 3

怎么删除多个设备对象还有他的符号链接?

[复制链接]

2

主题

2

回帖

0

精华

初来乍到

积分
38
发表于 2017-5-29 14:46:37 | 显示全部楼层 |阅读模式
就是 只会删除第二个设备对象 和符号连接,而第一个创建的设备对象和他符号连接不会被删除 ,
这是什么原因啊?


不清楚 是否能这样写(那本 windows驱动开发详解 我都没看多少页,就是看到了那个卸载例程我就有这想法,去写2个设备对象 用循环的方式卸载)

对了:写驱动 c或者c++ 他们调用约定不同吗?
我用c++ 的方式写的
extern "C"
NTSTATUS DriverEntry(
                                         IN PDRIVER_OBJECT pDrivObj,
                                         PUNICODE_STRING pRegistryPath)
请问 其他函数 需要加这个 extern "C"吗?
-----------------------------------------------
2个创建设备对象 函数 分别是:1 。2
1创建设备对象后 调用2函数(再次创建设备对象)
通过 驱动对象 去找到这个 第一个设备对象的扩展地址,然后赋值给 2函数的设备扩展
pDevExt = (PDEVICE_EXTENSION)(pDriverObject->DeviceObject->DeviceExtension);

pDevExt->pNexDeviceObj = pDevObj;
------------------------------
1函数

pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
        pDevExt->pDeviceObj = pDevObj;
        pDevExt->ustrDeviceName = ustrDevName;
        pDevExt->ustrSymLinkName = SymLinkName;
        pDevExt->pNexDeviceObj = NULL;

        // 在创造一个设备
        CreateDevices(pDriverObject);
-------------------------------------------------
2函数
NTSTATUS CreateDevices(IN PDRIVER_OBJECT pDriverObject)
{

。。。。。。。。。。
前面省略吧
。。。。。。。。。。
pDevObj->Flags |= DO_BUFFERED_IO;
        pDevExt = (PDEVICE_EXTENSION)(pDriverObject->DeviceObject->DeviceExtension);
        pDevExt->pNexDeviceObj = pDevObj;
        //.....................
        pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
        pDevExt->pDeviceObj = pDevObj;
        pDevExt->ustrDeviceName = ustrDevName;
        pDevExt->ustrSymLinkName = SymLinkName;
        pDevExt->pNexDeviceObj =NULL;
}



对了 卸载例程 我是模仿 WINDOWS驱动开发技术详解的(最前面的那个卸载例程)

VOID MyDDKUnload(IN PDRIVER_OBJECT pDriverObj)
{
        PDEVICE_OBJECT pNexDev;
        pNexDev = pDriverObj->DeviceObject;
        while(pNexDev != NULL)
        {
                PDEVICE_EXTENSION pDevExt;
                pDevExt =(PDEVICE_EXTENSION)(pNexDev->DeviceExtension);

                //删除符号链接
                IoDeleteSymbolicLink(&(pDevExt->ustrSymLinkName));
                pNexDev = pDevExt->pNexDeviceObj;
                IoDeleteDevice(pDevExt->pDeviceObj);
        }
        KdPrint(("卸载成功!"));
}



还有这个结构体
typedef struct DEVICE_EXTENSION
{
        PDEVICE_OBJECT pDeviceObj;
        PDEVICE_OBJECT pNexDeviceObj;
        UNICODE_STRING ustrDeviceName;
        UNICODE_STRING ustrSymLinkName;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2017-5-29 17:22:04 | 显示全部楼层
删除设备对象和符号链接的函数分别是:
IoDeleteDevice
IoDeleteSymbolicLink
输入什么参数就删除哪个,没有什么第一个第二个第三个第N个。

此外,提问直接说问题即可,不需要加上“新手”之类的词语彰显身份。

2

主题

2

回帖

0

精华

初来乍到

积分
38
 楼主| 发表于 2017-5-30 12:29:40 | 显示全部楼层
本帖最后由 APshaco 于 2017-5-30 12:31 编辑
Tesla.Angela 发表于 2017-5-29 17:22
删除设备对象和符号链接的函数分别是:
IoDeleteDevice
IoDeleteSymbolicLink


不是 我是刚学,
那个 我知道是这两个删除,我创建2个设备对象,我想通过 那个设备扩展的形式,删除(应该说是一个循环
的形式去删除 驱动对象拥有的设备对象,但我怎么删都只能删除第二次创建的设备对象,而第一个先创建的设备对象 却不能删除

简单说:我创建两个设备对象,只能删除一个,我想通过循环设备扩展删除多个设备对象

至于新手,我是性格问题,我不会的东西怕说错话,被笑话
头像被屏蔽

0

主题

37

回帖

0

精华

铜牌会员

积分
75
发表于 2017-6-15 23:32:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表