本博客为Windows驱动开发的基础。转载标明出处:http://blog.csdn.net/ikerpeng/article/details/38776407
一个简单的Windows驱动程序一般包括:头文件(决定NT,WDM;定义宏。。。),入口函数(相当于main),创建设备例程(相当于函数的实现),驱动的卸载,默认派遣。
知识点:
1. 两种驱动:NT和WDM:前者不支持即插即用;头文件分别是:NTDDK.h, WDM.h ;
2.DriverEntry才是函数的入口,包括两个参数:pDriverObject(I/O管理器传过来的驱动对象),pRegistryPath(指向驱动负责的注册表);
3. 设备扩展结构体:负责补充定义设备的相关信息;
4.用#pragma INITCODE 将程序加载到INIT内存区域;INIT标志标明该程序成功加载后可以卸载;
5.加入extern“c”才能保证用C++写的时候不会出错;
6.驱动程序会注册一些回调函数供操作系统调用(都在pDriverObject里面),通过指针的方式将地址告诉操作系统;
7. CreateDevice(pDriverObject)是一个帮助函数,辅助DriverEntry创建一个设备对象;
构造一个Unicode字符串存储设备对象名称;
IoCreateDevice创建设备对象;
填写设备的扩展结构体;
创建符号链接;()
创建成功则返回,不成功则删除。
8.卸载驱动处理驱动被卸载时的情况:第一个设备对象的地址存储于DeviceObject域中,每一个设备对象中的NextDevice域记录着下一个设备对象的地址,这样形成一个链表,会用到:#pragma PAGEDCODE:
由驱动对象得到设备对象;
删除设备对象的符号链接;
遍历设备对象,并删除。
9. 默认派遣中指定了对设备对象的创建,关闭和读写的操作,和IRP的状态有关。
参考书目:
《 Windows 驱动开发技术详解 》