NT式驱动和WDM式驱动
刚开始学习驱动,没什么基础,对于好多名词也不是很理解,感觉每天学的驱动都不一样。。。。。。。今天看了书之后才知道,原来驱动分为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文件进行安装即可。
最新文章
- 我的android学习经历38
- CALayer的使用
- 317.	Shortest Distance from All Buildings
- struts2文件下载 火狐浏览器的文件名乱码问题
- [转]IoC框架
- 第一篇:python高级之函数
- Pseudoprime numbers(POJ 3641 快速幂)
- Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0
- latch相关视图整理
- Oracle官方非托管Odac驱动与Oracle官方托管odac驱动
- jframe 对象(GroupedAction)传递无法调用对象的方法解决办法
- Python——day11 函数(对象、名称空间、作用域、嵌套、闭包)
- 使用ffmpeg视频切片并加密
- 关闭linux服务器防火墙
- easyUI添加修改tab页(toolbar)
- 在Windows下查看Java的JRE路径
- python中impyla包报'TSocket' object has no attribute 'isOpen'错误
- Linux进程内存分析pmap命令
- 使用Vuex来处理Authentication token
- 2015-09-21 css学习1