Windows驱动程序开发基础,转载标明出处:http://blog.csdn.net/ikerpeng/article/details/38793995
下面说一下开发出来驱动程序以后如何编译。一般有以下几种方式:
1. 建立Makefile文件,用nmake工具进行编译和链接;
2. 建立Makefile,sources, dirs文件,用build工具编译。
3. 用集成开发环境进行编译链接。
我采用的是第三种方式,通过VS2010+wdk配置Windows驱动程序开发环境。地址: http://blog.csdn.net/ikerpeng/article/details/38761441
但是接下来要说的是那样配置的部分原因:
编译函数的过程中有4种调用约定:c语言调用约定:函数用_cdecl修饰;标准调用约定:函数用_stdcall 修饰;快速调用约定:函数用_fastcall 修饰;C++类成员函数调用约定:函数用 thiscall 修饰。
其中的前两种是经常用到的。c语言调用约定中,会在目标文件中产生一个符号来代替这个函数:下划线+函数名的形式;而标准调用约定的形式是:下划线+函数名+@X,同时返回X。其中X代表需要清理堆栈是需要的数字。例如:
Windows驱动程序需要使用到标准调用约定,对于DriverEntry函数,系统会寻找_DriverEntry@8作为驱动程序的入口,但是VS2010默认的是C语言调用约定。所以只存在_DriverEntry,因此调用的时候就会出错。所以要将C/C++中的调用设置为_stdcall 修饰。
Tips:
1. 很多C/C++的的使用技巧都要慎重的使用,甚至C语言中的malloc函数和C++中new操作都不要使用。因为在内核模式下,程序无法调用用户模式下面的API。
2. 最后安调试驱动程序可以使用:DbgView,装驱动可以使用DriverMonitor。
本小节完。
参考书籍:
《Windows驱动开发技术详解》