YJX_Driver_015_DDK_HelloWorld卸载例程细化
Posted DebugSkill
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YJX_Driver_015_DDK_HelloWorld卸载例程细化相关的知识,希望对你有一定的参考价值。
1、
【178】复制第12课的代码,用vs2003(VC7.0)打开
【360】把部分代码 放到新建的头文件(mini_ddk.h)里面,然后项目再 "添加现有项"
【592】此时 "重新生成解决方案",OK
ZC: 可以将“L"\\Device\\yjxDDK_Device"”和“L"\\??\\yjx888"” 做成全局变量,统一管理
ZC: 或者 将 devName 和 symLinkName 做成全局变量,统一管理
【1125】IoDeleteSymbolicLink 函数
【1445】卸载例程 中有一个传入参数 PDRIVER_OBJECT,但是它是一个驱动对象指针,但是它下面就有一个设备对象 它也是一个链表
【1500】先删除 读好连接,再删除 设备对象
VOID DDK_Unload(IN PDRIVER_OBJECT _pDrvierObject)
{
PDEVICE_OBJECT pDev; // 用来取得要删除的设备对象
UNICODE_STRING symLinkName;
pDev = _pDrvierObject->DeviceObject;
IoDeleteDevice(pDev); // 删除设备
// 取得符号链接的名字
RtlInitUnicodeString(&symLinkName, L"\\??\\yjx888");
IoDeleteSymbolicLink(&symLinkName);
KdPrint(("驱动成功被卸载...OK----------"));
}
【1800】_pDrvierObject->DeviceObject; 取得设备链表的头部。它是一个链表,如果有多个设备的话,用 DEVICE_OBJECT.NextDevice 来遍历(ZC: 具体是使用 设备名 还是别的东西(属性)来匹配,他没说... 用不着匹配,∵是在下载驱动,所以该驱动对象下面的所有设备对象/符号链接 都要删掉,直接全部遍历删掉即可)。
∵ 我们这里只创建了一个设备,于是不需要遍历查找,直接删除第一个就成
【2460】有多个设备的情况下,我们一般是把它保存到设备扩展项(IoCreateDevice时分配空间)里面,把符号链接和设备对象都存在设备扩展项里面,然后通过遍历循环 来删除所有的符号链接和设备对象
【2690】再用DDK编译一下
【2727】驱动文件改名
【2755】DriverMonitor载入驱动 【2816】看到驱动能够被反复的加载/运行/卸载 【2870】再用"Kernel Detecive v1.3.0"看一下,已经没有 该驱动了,已经被正常的卸载了。再用DriverMonitor运行驱动,再看"Kernel Detecive"驱动在列表里面。用DriverMonitor卸载驱动,再看"Kernel Detecive"驱动没有在列表里面,被正常的卸载了。
【3100】再用DDK编译 第12课 的驱动,测试 看现象
【3205】虽然 DriverMonitor 提示卸载成功,但是 看"Kernel Detecive" 驱动还是在列表里面(没有真正的卸载成功),再用 DriverMonitor运行驱动,就报错了
2、
以上是关于YJX_Driver_015_DDK_HelloWorld卸载例程细化的主要内容,如果未能解决你的问题,请参考以下文章