A.使用DDK编译驱动程序

1.在源程序目录创建文本文件"sources",其中的内容是build工具的环境变量和宏定义,其格式如下:
MACRONAME=MacroValue

例(例子中的这几个宏是必须的):
TARGETNAME=MyDriver              //编译生成的文件名
TARGETPATH=MyDriverFolder   //编译生成的文件存放位置
TARGETTYPE=DRIVER                  //编译的目标程序类型
SOURCES=MyDriver.cpp\            
//当前目录下的源文件列表
                      helper.cpp

具体可以参考DDK文档:
Build Utility Environment Variables
Build Utility Macros

2.创建文本文件"makefile",其内容如下(不必修改):
!INCLUDE $(NTMAKEENV)\makefile.def

3.执行开始菜单DDK中Build Environments下的编译环境设置快捷方式,并在命令行窗口中切换至源程序目录,输入build即可。

B.用Compuware DriverStudio直接编译驱动程序
1.用DDK sources to vcproj Converter打开sources文件;
2.执行"Build" -> "Build Environment...",添加开始菜单中的Build Environments路径;

3.选择平台,单击"OK";
4.执行"Build" -> "Build -ceD"即可。

C.用Visual Studio打开源程序项目,并编译
对于可以用DDK正常编译的项目,可以转换为Visual Studio解决方案/项目,方便编写代码/编译。
1.用DDK sources to vcproj Converter打开sources文件;
2.执行"Convert" -> "Convert DDK dirs/sources...",选择自己的Visual Studio版本;
3.用Visual Studio打开转换成功的项目后,执行"工具" -> "DriverStudio" -> "Build ...."即可编译。
需要注意的是,这种编译方式的目标操作系统类型要在Visual Studio选项下的DDK Build Settings中选择。


D.用Visual Studio直接创建Win32项目,并编译
需要根据驱动程序的要求,设置许多种宏与编译选项(可以参考《Windows驱动开发技术详解》),建议直接使用方法C。

当然,方法C的编译那一步可以直接使用Visual Studio的生成功能来编译。

要注意的问题:先安装Visual Studio,再安装DDK/WDK,最后安装DriverStudio3.2

E.学习Windows驱动开发可选的中文书籍:
《Programming the Microsoft Windows Driver Model》 (Walter Oney著 马少华译)
《Windows 驱动开发技术详解》(张帆等著)
《Windows 2000/XP WDM设备驱动程序开发 第二版》(张帆编著)


本文链接地址: 驱动编程.1 驱动程序的编译
https://blog.qingfengju.com/index.asp?id=185

分类:Win32/C++ 查看次数:7930 发布时间:2009/12/19 10:44:58

测试所用的源程序a.cpp如下:
 
//extern "C"
//{
int /*__stdcall*/ foo(int a,int b)
{
    return a+b;
}
//}
 
int main()
{
    return 0;
}
 
1.将源文件当做C语言程序代码编译:
cl a.cpp /TC /Faa.asm
 
当调用约定为__cdecl时:
_foo
 
当调用约定为__stdcall时:
_foo@8
 
当调用约定为__fastcall时:
@foo@8
 
2.将源文件当做C++语言程序代码编译:
cl a.cpp /TP /Faa.asm
 
当调用约定为__cdecl时:
?foo@@YAHHH@Z
 
当调用约定为__stdcall时:
?foo@@YGHHH@Z
 
当调用约定为__fastcall时:
?foo@@YIHHH@Z
 
3.将源文件当做C++语言程序代码编译,并加上extern "C"修饰时:
cl a.cpp /TP /Faa.asm
 
当调用约定为__cdecl时:
_foo
 
当调用约定为__stdcall时:
_foo@8
 
当调用约定为__fastcall时:
@foo@8
 
这说明使用了extern "C"修饰之后,与将源文件当做C语言程序代码编译生成的符号是相同的。
 
备注:
没有声明调用约定,默认情况下编译器使用__cdecl调用约定,当然也可以使用/Gd,/Gr,/Gz来指定调用约定。

_cdecl :按从右至左的顺序压参数入栈,由调用者把参数弹出栈。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。
_stdcall :按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。
_ fastcall :是把函数参数列表的前三个参数放入寄存器eax,edx,ecx,其他参数压栈。


本文链接地址: VC++中不同的调用约定与编译方式所生成符号的不同
https://blog.qingfengju.com/index.asp?id=184

分类:Win32/C++ 查看次数:6525 发布时间:2009/12/16 10:50:26