進一步學習WDK驅動程式的SOURCES檔案、WMI驅動程式的mof檔案和wmidata.h標頭檔案

bcbobo21cn發表於2021-01-03

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編譯器的警告級別;

相關文章