鱼C论坛

 找回密码
 立即注册
查看: 2489|回复: 0

郁金香驱动学习>第三课:添加设备对象

[复制链接]
发表于 2015-7-20 17:53:52 | 显示全部楼层 |阅读模式

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

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

x




  1. #include <ntddk.h>

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

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

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

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

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

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

  70. //设置函数代码存放的代码段,这是是放在init段中
  71. #pragma INITCODE
  72. //NTSTATUS 等价与 LONG  
  73. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING B)
  74. {
  75.         KdPrint(("驱动成功被加载..."));

  76.         //创建设备对象
  77.         CreateMyDevice(pDriverObject);

  78.         //Driverunload 回调函数的一个指针,这里的回调函数是卸载驱动的函数
  79.         pDriverObject->DriverUnload = DDK_Unload;
  80.         return 1;
  81. }
  82. VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject)
  83. {
  84.        
  85.         //KdPrint使用方法类似printf,注意KdPrint((" ",  ));使用的是双括号。
  86.         //这个比DbgPrint 调用要稍好。因为在free 版不被编译。
  87.         KdPrint(("驱动成功被卸载..."));

  88.         DbgPrint("DbgPrint功能与KdPrint相同");
  89. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 17:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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