makefile总是一句话不变:
!INCLUDE $(NTMAKEENV)\makefile.def
意味着直接使用DDK目录下的makefile.def,一般在DDK安装目录的bin文件夹下.
1.TARGETNAME:指定build将生成的文件名(不带后缀)
2.TARGETTYPE:指定build将生成的文件后缀名(DRIVER),如下:
值
|
定义
|
生成文件后缀
|
PROGRAM
|
应用层程序,不输出任何函数.
|
.EXE
|
PROGLIB
|
应用层程序,同时也有输出函数
|
.EXE
|
DYNLINK
|
动态库文件可以输出函数,
其它二进制文件可以引用这些函数,
标记这不是一个独立的.EXE文件.
|
.dll
|
LIBRARY
|
生成一个静态库,这个文件中包含了函数的内容,其它程序在静态LINK时把这些函数都编译进对应的文件.
当你要生成一个动态库时,同时也会生成一个LIB.
但当你想生成一个静态库时,那么只生成一个LIB文件.
|
.LIB
|
EXPORT_DRIVER
|
一个内核下的DLL,
相当于应用层的DLL,同时生成LIB文件
要有对应的DriverEntry函数
否则出错.
|
.Sys
|
DRIVER_LIBRARY
|
内核状态下的静态库,
包含了函数说明和代码.
相当于应用层的静态库
不能有DriverEntry函数,
否则在LINK时会出现DriverEntry重复的错误.
|
.Lib
|
DRIVER
|
驱动程序
|
.sys
|
MINIPORT
|
驱动程序但不连接
Ntoskrnl.lib或hal.lib
|
.sys
|
GDI_DRIVER
|
图像驱动程序
连接win32k.sys
|
.dll
|
3.TARGETPATH: 指定build将生成的obj文件存放的文件夹(可使用相对路径)
4.TARGETLIBS:指定必须链接的文件列表
5.INCLUDES:指定增加的文件夹路径
6.SOURCE:指定build需编译的源码文件
source语法中可以使用大量的环境变量,查看环境变量可以通过打开cmd–>set即可:(使用环境变量无非是%path%或$(path))
而驱动自身的环境变量是通过setenv.bat来设置的,这个文件一般在DDK目录bin文件夹中存在(其实文件内部就是一些设置环境变量的set操作)
你这样调:setenv d:\ddk chk (set checked environment)驱动在不同的编译中通过它来设置不同的环境变量,所以sources中可以使用:
!if $(FREEBUILD) #----------if free-------------------------------- !if $(AMD64) #----------if X64--------- !else !endif
如果你需要生成map文件可以通过
LINKER_FLAGS=/map:..\Bin\Free\i386\Loader.map
这样来指定
最后贴个自己的小示例:
TARGETTYPE=DRIVER !if $(FREEBUILD) #----------------------free--------------------- !if $(AMD64) TARGETNAME=Loader64 TARGETPATH=..\Bin\Free64 LINKER_FLAGS=/map:..\Bin\Free64\amd64\Loader.map !else TARGETNAME=Loader TARGETPATH=..\Bin\Free LINKER_FLAGS=/map:..\Bin\Free\i386\Loader.map !endif #----------------------chk--------------------- !else !if $(AMD64) TARGETNAME=Loader64 TARGETPATH=..\Bin\Chk64 LINKER_FLAGS=/map:..\Bin\Chk64\amd64\Loader.map !else TARGETNAME=Loader TARGETPATH=..\Bin\Chk LINKER_FLAGS=/map:..\Bin\Chk\i386\Loader.map !endif !endif SOURCES=Driver.cpp
简单说明
TARGETNAME=HelloWDM //编译出来的驱动程序的名称 TARGETTYPE=DRIVER //编译的类型是驱动程序编译 DRIVERTYPE=WDM //驱动程序的类型是WDM驱动程序 TARGETPATH=OBJ //生成的文件存放在OBJ目录中 INCLUDES=$(BASEDIR)\inc;\ //这是需要引入的头文件 $(BASEDIR)\inc\ddk;\ TARGETLIBS=$(BASEDIR)\lib\*\free\usbd.lib\ //这是需要引入的库文件 SOURCES=HelloWDM.cpp\ //这是源码文件
TARGETNAME=HelloWDM //编译出来的驱动程序的名称 TARGETTYPE=DRIVER //编译的类型是驱动程序编译 DRIVERTYPE=WDM //驱动程序的类型是WDM驱动程序 TARGETPATH=OBJ //生成的文件存放在OBJ目录中 INCLUDES=$(BASEDIR)\inc;\ //这是需要引入的头文件 $(BASEDIR)\inc\ddk;\ TARGETLIBS=$(BASEDIR)\lib\*\free\usbd.lib\ //这是需要引入的库文件 SOURCES=HelloWDM.cpp\ //这是源码文件
LINKER_FLAGS=/map:..\Bin\Free\i386\Loader.map
如果你需要生成map文件可以通过