Win7 WDK 自带示例,wmi,wmisamp驱动程序,未构建之前,文件如下;
看一下其sources文件;
TARGETNAME=WmiSamp
TARGETTYPE=DRIVER
KMDF_VERSION_MAJOR=1
INF_NAME=WmiSamp
NTTARGETFILE1=$(OBJ_PATH)\$(O)\$(INF_NAME).inf
PASS1_BINPLACE=$(NTTARGETFILE1)
#
# List of source files to compile.
#
SOURCES= \
WmiSamp.mof \
WmiSamp.rc \
WmiSamp.c \
WmiHandler.c \
NTTARGETFILE0=\
$(OBJ_PATH)\$O\wmidata.h \
$(OBJ_PATH)\$O\wmisamp.x \
$(OBJ_PATH)\$O\wmisamp.vbs
TARGET_DESTINATION=wdf
头2句,指定驱动程序的名字和类型,没有问题;
看 SOURCES = ,列出要编译的源文件列表,其中包含一个 .mof文件,这是啥?
再看 NTTARGETFILE0=,列出的文件在当前目录下是没有的,其中还包含一个vbs脚本文件;$(OBJ_PATH),这是指哪个目录?这个应该是build以后出来的目录;
build成功以后,看一下;
objchk_win7_amd64\amd64,这是build以后出来的目录;NTTARGETFILE0= 列出的文件出现在amd64目录下;build以后还出来一个头文件,啥情况?
根据微软资料; 编译前的.mof文件和build以后的wmidata.h文件,是WMI驱动程序特有的;
微软言: 若要编译定义 WMI 数据和事件块的 MOF 文件,请使用 Microsoft Windows 操作系统随附的 MOF 编译器(称为 Mofcomp.exe);
可以通过在驱动程序的二进制文件中包含二进制 MOF 数据并在运行时返回选定的架构信息,来动态发布驱动程序的架构;
具体见:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/kernel/compiling-a-driver-s-mof-file;
下面找一个非WMI驱动,构建一下看一下;构建print下的emf驱动程序;完成后如下;
此驱动就不包含前面的MOF文件和wmidata.h;
看此驱动带的sources文件,
TARGETNAME=EmfDespooling
TARGETTYPE=PROGRAM
TARGETLIBS= $(SDK_LIB_PATH)\winspool.lib \
$(SDK_LIB_PATH)\kernel32.lib \
UMTYPE=console
UMENTRY=wmain
INCLUDES=
C_DEFINES=-D_UNICODE -DUNICODE
USE_MSVCRT=1
SOURCES=emf.c
没有了NTTARGETFILE0= 段;
因为指定 TARGETTYPE=PROGRAM,构建出的驱动程序是exe形式;
此驱动还调用到了win32的库,
TARGETLIBS= $(SDK_LIB_PATH)\winspool.lib \
$(SDK_LIB_PATH)\kernel32.lib \
构建另一个驱动看一下;
构建出cancel.sys;
看此驱动带的sources文件,
TARGETNAME=cancel
TARGETTYPE=DRIVER
TARGETLIBS= \
$(DDK_LIB_PATH)\wdmsec.lib\
$(DDK_LIB_PATH)\csq.lib
SOURCES=cancel.c cancel.rc
MSC_WARNING_LEVEL=/W4 /WX
TARGETNAME=cancel
TARGETTYPE=DRIVER
指定驱动程序名字和类别,因为指定TYPE为DRIVER,所以构建出.sys驱动;
此驱动用到了DDK的库,
TARGETLIBS= \
$(DDK_LIB_PATH)\wdmsec.lib\
$(DDK_LIB_PATH)\csq.lib
MSC_WARNING_LEVEL=/W4 /WX,这是MSC编译器的警告级别;