刚开始学习驱动,没什么基础,对于好多名词也不是很理解,感觉每天学的驱动都不一样。。。。。。。今天看了书之后才知道,原来驱动分为NT式驱动和WDM式驱动两种。大概总结一下它们之间的区别。

对于NT式驱动来说,主要的函数是DriverEntry函数,卸载函数,以及各个IRP的派遣函数,不支持即插即用功能,要导入的头文件是ntddk.h.

其入口函数DriverEntry主要进行初始化工作,驱动加载时,系统进程创建新的线程,调用对象管理器,创建驱动对象。它创建设备对象是通过IoCreateDevice内核函数完成的。

NTSTATUS IoCreateDevice(
_In_     PDRIVER_OBJECT  DriverObject, //指向驱动对象的指针
_In_     ULONG           DeviceExtensionSize, //设备扩展的大小
_In_opt_ PUNICODE_STRING DeviceName, //设备对象名
_In_     DEVICE_TYPE     DeviceType, //设备对象类型
_In_     ULONG           DeviceCharacteristics,//设备对象特征
_In_     BOOLEAN         Exclusive, //是否在内核下使用
_Out_    PDEVICE_OBJECT  *DeviceObject //返回设备对象地址
); 卸载函数删除创建的设备对象,还负责一些资源的回收。

而对于WDM式驱动来说,它支持即插即用功能要导入的头文件为wdm.h.

这是Windows2000后加入的新的驱动模型,比NT式驱动更加复杂一些,完成一个设备操作,至少要两个驱动设备共同完成,分别是物理设备对象(PDO)和功能设备对象(FDO),FDO会附加在PDO上。

WDM的入口函数也是DriverEntry,但创建设备对象的责任交给了AddDevice函数,而且必须加载IRP_MJ_PNP派遣回调函数。

而且在WDM驱动中,大部分卸载工作都不是由DriverUnload来处理,而是放在对IRP_MN_REMOVE_DEVICE的IRP的处理函数中处理。

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
KdPrint(("Enter DriverEntry\n"));

pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
pDriverObject->MajorFunction[IRP_MJ_CREATE] =
pDriverObject->MajorFunction[IRP_MJ_READ] =
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloWDMDispatchRoutine;
pDriverObject->DriverUnload = HelloWDMUnload;

KdPrint(("Leave DriverEntry\n"));
return STATUS_SUCCESS;
}

WDM式驱动不是按照服务来加载,安装WDM式驱动需要一个inf文件。inf文件描述了WDM驱动程序的操作硬件设备的信息和驱动程序的一些信息。
可以直接右击这个inf文件进行安装即可。

最新文章

  1. 我的android学习经历38
  2. CALayer的使用
  3. 317. Shortest Distance from All Buildings
  4. struts2文件下载 火狐浏览器的文件名乱码问题
  5. [转]IoC框架
  6. 第一篇:python高级之函数
  7. Pseudoprime numbers(POJ 3641 快速幂)
  8. Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0
  9. latch相关视图整理
  10. Oracle官方非托管Odac驱动与Oracle官方托管odac驱动
  11. jframe 对象(GroupedAction)传递无法调用对象的方法解决办法
  12. Python——day11 函数(对象、名称空间、作用域、嵌套、闭包)
  13. 使用ffmpeg视频切片并加密
  14. 关闭linux服务器防火墙
  15. easyUI添加修改tab页(toolbar)
  16. 在Windows下查看Java的JRE路径
  17. python中impyla包报'TSocket' object has no attribute 'isOpen'错误
  18. Linux进程内存分析pmap命令
  19. 使用Vuex来处理Authentication token
  20. 2015-09-21 css学习1

热门文章

  1. localStorage简析
  2. 51单片机实现定时器中断0-F
  3. Wordpress 从 MySQL 获取文章链接 permalinks
  4. (转)简述47种Shader Map的渲染原理与制作方法
  5. HDU 4569 Special equations(枚举+数论)(2013 ACM-ICPC长沙赛区全国邀请赛)
  6. for循环再探
  7. ajax中用jsonp接收json数据
  8. tomcat中配置JNDI方法
  9. uva 11526 H(n) (数论)
  10. 搭建springmvc项目没扫描到mapper和service