一直很好奇双击ddk的Checked/free Build Environment跳出的cmd对话框能运行build编译驱动(其实App也行),直接用cmd运行build,却提示找不到可运行的命令。开始时,怀疑环境变量Path没有包含build所在的路径导致不能工作,可是向Path追加了build的路径,虽然可以执行build但仍然不能生成sys。
于是换个思路驱动程序所在的目录下都少不了source/makefile文件,看看这些文件里有没有隐藏什么信息:
source
TARGETNAME=echo TARGETTYPE=DRIVER INF_NAME=echo SOURCES=echo.c
makefile:
!INCLUDE $(NTMAKEENV)\makefile.def
source文件貌似和路径不沾边,倒是makefile隐约跟环境变量有关,到Build Environment看看环境变量NTMAKEENV的值。先声明我把wdk7600安装在C盘根目录下。
NTMAKEENV是ddk根目录的一个子目录,看来是ddk安装时设置了一些脚本,并在双击Build Environment时include进来(个人觉得用linux中source比较贴切)。搜索%DDKROOT%/bin目录下哪个文件设置了这个变量:
如图,NTMAKEENV由setenv.bat设置。如法炮制,看看有谁引用了setenv.bat这个脚本:
然而很可惜,并没有找到谁引用了这个脚本。看来只能在Build Environment这个快捷方式上找门路了。右键快捷方式
目标中的值为"C:\Windows\System32\cmd.exe /k C:\WinDDK\7600.16385.1\bin\setenv.bat C:\WinDDK\7600.16385.1\ chk x86 WXP"
查看ms 对cmd /k的解释:
如果指定了cmd /C 或 /K,命令行开关后的命令行其余部分将作为命令行处理
按他的意思就是由cmd启动C:\WinDDK\7600.16385.1\bin\setenv.bat,并把参数C:\WinDDK\7600.16385.1\ chk x86 WXP传给它。那好,找到设置NTMAKEENV环境变量的入口了。跟到setenv.bat中看看它做了哪些事(仅罗列一些重要的环境变量):
在文件的开头有一行
set BASEDIR=%1 这里%1就是C:\WinDDK\7600.16385.1\
于是set BASEDIR=%1变成了set BASEDIR=C:\WinDDK\7600.16385.1\
命令行参数有chk x86 WXP,因此脚本依次执行
if /I "%1"=="chk" set _FreeBuild=false
...
if /I "%1"=="WXP" set DDK_TARGET_OS=WinXP
...
if /I "%DDK_TARGET_OS%"=="WinXP" goto WXP
:WXP
set _ddkspec=wxp
set _IA32bit=true
这些变量设置了编译版本,编译后二进制文件的文件结构
然后进入:checked分支,
设置优化选项,
set MSC_OPTIMIZATION=/Od /Oi
设置编译相关的变量:
set PROJECT_ROOT=%BASEDIR%\src
set PUBLIC_ROOT=%BASEDIR%
设置头文件包含路径
set Lib=%BASEDIR%\lib
set Include=%BASEDIR%\inc\api
set WPP_CONFIG_PATH=%BASEDIR%\bin\wppconfig
设置编译连接工具路径
set NTMAKEENV=%BASEDIR%\bin
set BUILD_MAKE_PROGRAM=nmake.exe
设置crt,sdk,ddk,wdk头文件路径
set CRT_INC_PATH=%BASEDIR%\inc\crt
set SDK_INC_PATH=%BASEDIR%\inc\api
set DDK_INC_PATH=%BASEDIR%\inc\ddk
set WDM_INC_PATH=%BASEDIR%\inc\ddk
设置lib库路径
set SDK_LIB_DEST=%BASEDIR%\lib\%_ddkspec% --->C:\WinDDK\7600.16385.1\lib\wxp\i386\lib\wxp\i386
set DDK_LIB_DEST=%SDK_LIB_DEST%
set CRT_LIB_PATH=%BASEDIR%\lib\crt\*
正是因为设置了这些inc/lib的路径,因此当我们执行build -cez时不仅能编译驱动程序,还能正确生成native App(有机会会写blog)/win32 App等工程
当一切环境变量设置完成setenv.bat退出,正式进入到cmd交互环境。这时的cmd环境,由于还在同一个终端中,环境变量仍然有效,因此它是一个具有编译环境的强大cmd环境!