鱼C论坛

 找回密码
 立即注册
查看: 2684|回复: 1

郁金香驱动学习>第5课:卸载设备对象和符号

[复制链接]
发表于 2015-7-21 16:45:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有兴趣学习过游戏驱动保护的朋友,欢迎加我qq :2779535853  一起学习讨论

mini_ddk.h  代码如下

  1. //2015年7月20日 15:14:22


  2. #include <ntddk.h>

  3. //定义个INITCODE宏,这个宏表示 初始化的时候载入内存,然后可以从内存中卸载掉
  4. #define INITCODE code_seg("INIT") //;注意这里是不能加分号的
  5. #define PAGECODE code_seg("PAGE") //表示内存不够用时,可以置换到虚拟内存(硬盘)

  6. //驱动设备
  7. #pragma INITCODE //表示这个函数运行后,就从内存中释放掉
  8. NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject)
  9. {
  10.         NTSTATUS status; // NTSTATUS 等价于 LONG
  11.         PDEVICE_OBJECT pDevObj;/*用来返回创建设备*/

  12.         //UNICODE_STRING 类型为UNICODE的字符结构,里面包含3个成员,第一个Length 表示buffer字节的长度,不包含NULL,第二个MaximumLength:buffer总的字节大小,第三个Buffer:指向宽字符的指针
  13.         //创建设备名称
  14.         UNICODE_STRING devName;  
  15.         UNICODE_STRING symLinkName;

  16.         //会动态分配一块指向“\\Device\\yjxDDK_Device”的内存指针,赋值给devName.Buffer;
  17.         RtlInitUnicodeString(&devName,L"\\Device\\yjxDDK_Device");/*对devName初始化字串为 "\\Device\\yjxDDK_Device"*/

  18.         //IoCreateDevice 创建设备对象,并更新pDriverObject->DeviceObject 为新创建的设备对象
  19.         //介绍每个参数
  20.         // pDriverObject  该参数用于在驱动程序和新设备对象之间建立连接,
  21.         // 0              第二个参数是设备扩展结构的大小
  22.         // &devName       命名该设备对象的UNICODE_STRING串的地址
  23.         // &FILE_DEVICE_UNKNOWN       设备类型
  24.         // 0              为设备对象提供Characteristics标志
  25.         // TRUE           指出设备是否是排斥的
  26.         // &pDevObj       设备对象的名字,有了名字应用程序就可以访问该设备的驱动对象了
  27.         status = IoCreateDevice( pDriverObject,\
  28.                 0,\
  29.                 &devName,\
  30.                 FILE_DEVICE_UNKNOWN,\
  31.                 0, TRUE,\
  32.                 &pDevObj);

  33.         //NT_SUCCESS宏定义:表示判断 status>=0
  34.         if (!NT_SUCCESS(status)) //成功返回0  0>=0 吗 true 取反  false 不执行
  35.         {
  36.                 if(status == STATUS_INSUFFICIENT_RESOURCES)
  37.                 {
  38.                         KdPrint(("STATUS_INSUFFICIENT_RESOURCES 资源不足"));
  39.                 }
  40.                 if(status == STATUS_OBJECT_NAME_EXISTS)
  41.                 {
  42.                         KdPrint(("STATUS_OBJECT_NAME_EXISTS 指定对象不存在"));
  43.                 }
  44.                 if(status == STATUS_OBJECT_NAME_COLLISION)
  45.                 {
  46.                         KdPrint(("STATUS_INSUFFICIENT_RESOURCES 对象名有冲突"));
  47.                 }
  48.                 KdPrint(("创建设备错误,返回值是=%d ",status));
  49.                 return status;
  50.         }

  51.         KdPrint(("创建设备成功,返回值是=%d ",status));

  52.         //所创建设备被设定为直接缓冲I/O,这是设备读写三种方式中的一种
  53.         pDevObj->Flags |= DO_BUFFERED_IO;
  54.         //创建符号链接

  55.         RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888");

  56.         //创建一个设备链接。驱动程序虽然有了设备名称,但是这种设备名只能在内核状态可见,而对于应用程序是不可见的,因此,驱动需要要暴露一个符号链接,来方便应用程序的访问,该链接指向真正的设备名称
  57.         status = IoCreateSymbolicLink( &symLinkName,&devName );
  58.         if (!NT_SUCCESS(status))
  59.         {
  60.                 KdPrint(("创建符号连接错误,返回值是=%d ",status));
  61.                 //删除设备对象
  62.                 IoDeleteDevice( pDevObj );
  63.                 return status;
  64.         }
  65.         KdPrint(("创建符号连接成功,返回值是=%d ",status));
  66.         return STATUS_SUCCESS;
  67. }



  68. //卸载函数的前置说明
  69. VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject);
复制代码


mini_ddk.c  代码如下

  1. //注意在使用 windows 2000 checked buitd Environment 编译驱动的时候
  2. //如果遇到说磁盘空间不足或者文件路径错误,这样的异常的话
  3. //有可能是某个程序正在使用pdb文件,比如我就是因为windbg使用了pdb文件
  4. //所以才导致这样的错误
  5. #include "mini_ddk.h"
  6. #pragma INITCODE
  7. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING B)
  8. {
  9.         //        __asm int 3;
  10.         KdPrint(("驱动成功被加载..."));

  11.         //创建设备对象
  12.         CreateMyDevice(pDriverObject);

  13.         //卸载函数
  14.         pDriverObject->DriverUnload = DDK_Unload;
  15.         return 1;
  16. }


  17. VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject)
  18. {
  19.         PDEVICE_OBJECT pDev;//设备对象
  20.         UNICODE_STRING symLinkName;  //设备符号
  21.        

  22.         //初始化符号
  23.         RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888");
  24.         //删除符号
  25.         IoDeleteSymbolicLink(&symLinkName);
  26.         KdPrint(("删除符号成功..."));

  27.         //warning C4133: '=' : incompatible types - from 'PDEVICE_OBJECT' to 'PDRIVER_OBJECT'
  28.         //老是报上面这个错误,明明类型是一样的,没办法我只能加上强制转换

  29.         //***注意***
  30.         //PDRIVER_OBJECT  PDEVICE_OBJECT  2个是不一样的结构,一个是驱动程序的结构,一个是设备的结构,
  31.         //每个驱动程序都自带一个 PDRIVER_OBJECT 的结构, 这个结构里有一个 DeviceObject 成员 指向一个设备对象链表的首地址
  32.         //当调用IoCreateDevice的时候会自动赋予正确的设备对象指针,也就是说会更新PDRIVER_OBJECT->DeviceObject 成员
  33.         pDev = pDriverObject->DeviceObject;
  34.        
  35.         //删除设备对象
  36.         IoDeleteDevice(pDev);
  37.         KdPrint(("删除设备成功..."));

  38.         KdPrint(("驱动成功被卸载..."));

  39. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-4-6 19:46:22 | 显示全部楼层
跪求  郁金香 全套教程啊  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 20:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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