WDK开发环境构建驱动程序入门、Windows驱动程序的Check Build和Free Build
先安裝WDK 7;驅(qū)動(dòng)開(kāi)發(fā)包 7;
包含 build環(huán)境,調(diào)試工具,設(shè)備仿真和測(cè)試相關(guān);
路徑;
DSF一時(shí)不知道是什么;
安裝過(guò)程;
完成;
開(kāi)始菜單出來(lái)兩個(gè)一級(jí)菜單,調(diào)試工具,驅(qū)動(dòng)開(kāi)發(fā)包;
看一下構(gòu)建環(huán)境,包含Checked和Free兩種;有何區(qū)別?
"Checked build" 有 traces和asserts,? "Free build" 沒(méi)有;基本上這兩者與我們傳統(tǒng)的 "Debug" 和 "Release" 相對(duì)應(yīng);
chk表示Checked,fre表示Free。主要的區(qū)別在于,checked build有traces和asserts,而free build沒(méi)有。
?
checked和free是怎么出現(xiàn)的呢?因?yàn)閭鹘y(tǒng)的用詞一般是debug和retail(或者release)。
當(dāng)Windows NT還處在開(kāi)發(fā)階段的時(shí)候,開(kāi)發(fā)組的人還在用“debug”和“retail”。Debug和Retail的不同在于編譯時(shí)的選項(xiàng):
Compiler Optimization:開(kāi)、關(guān)
Debug Traces:開(kāi)、關(guān)
Assertions:開(kāi)、關(guān)
Sanity checks:開(kāi)、關(guān)
傳統(tǒng)來(lái)說(shuō),Debug是“Optimization:關(guān),Traces:開(kāi),Assertions:開(kāi)”,Retail是“O:開(kāi),T:關(guān),A:關(guān)”。后來(lái),NT團(tuán)隊(duì)加入了Sanity checks的選項(xiàng)。本來(lái),Sanity check在內(nèi)部版本中有,在發(fā)布的時(shí)候會(huì)移除掉。
?
于是,NT的團(tuán)隊(duì)就有了“O:開(kāi),T:開(kāi),A:開(kāi),S:開(kāi)”,“O:開(kāi),T:關(guān),A:關(guān),S:開(kāi)”和“O:開(kāi),T:關(guān),A:關(guān),S:關(guān)”三種Build。
最后一種是傳統(tǒng)的“retail” build。那么,前兩種叫什么build呢?第一種Optimization是開(kāi)著的,所以不是傳統(tǒng)的“debug”,后一種Sanity check是開(kāi)著的,所以不是傳統(tǒng)的“retail”。
?
為了區(qū)別這些build的不同。討論以后,NT團(tuán)隊(duì)決定用“checked”表示“O:開(kāi),T:開(kāi),A:開(kāi),S:開(kāi)”,“Free”表示“O:開(kāi),T:關(guān),A:關(guān),S:開(kāi)”。Checked是因?yàn)樗缘腸heck都打開(kāi)了,Free是因?yàn)椤癱heck free”。
?
后來(lái),隨著NT 3.1項(xiàng)目進(jìn)展,團(tuán)隊(duì)認(rèn)識(shí)到:
他們其實(shí)根本就不會(huì)去測(cè)試“retail” build,
他們對(duì)free build進(jìn)行了性能測(cè)試,結(jié)果發(fā)現(xiàn)它能夠滿(mǎn)足性能要求。
于是,團(tuán)隊(duì)把free build作為最終版本發(fā)布。
?
進(jìn)到一個(gè)build環(huán)境命令提示符;輸入 build 命令; 我的本意是看一下 build 命令的幫助;結(jié)果一行行提示自己出來(lái),看上去不停地在運(yùn)行某個(gè)程序;原來(lái)在安裝的一級(jí)或二級(jí)目錄下直接打build命令,會(huì)自動(dòng)構(gòu)建WDK本身自帶的全部驅(qū)動(dòng)程序例子;
? ? 先Ctrl-C終止;
做一個(gè)入門(mén)WDK驅(qū)動(dòng)程序,代碼如下;存為test.c;
#include <ntddk.h> #include <wdf.h> DRIVER_INITIALIZE DriverEntry; EVT_WDF_DRIVER_DEVICE_ADD KmdfHelloWorldEvtDeviceAdd;NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath ) {// NTSTATUS variable to record success or failureNTSTATUS status = STATUS_SUCCESS;// Allocate the driver configuration objectWDF_DRIVER_CONFIG config;// Print "Hello World" for DriverEntryKdPrintEx(( DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: DriverEntry\n" ));// Initialize the driver configuration object to register the// entry point for the EvtDeviceAdd callback, KmdfHelloWorldEvtDeviceAddWDF_DRIVER_CONFIG_INIT(&config, KmdfHelloWorldEvtDeviceAdd);// Finally, create the driver objectstatus = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE);return status; }NTSTATUS KmdfHelloWorldEvtDeviceAdd(_In_ WDFDRIVER Driver, _Inout_ PWDFDEVICE_INIT DeviceInit ) {// We're not using the driver object,// so we need to mark it as unreferencedUNREFERENCED_PARAMETER(Driver);NTSTATUS status;// Allocate the device objectWDFDEVICE hDevice; // Print "Hello World"KdPrintEx(( DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: KmdfHelloWorldEvtDeviceAdd\n" ));// Create the device objectstatus = WdfDeviceCreate(&DeviceInit, WDF_NO_OBJECT_ATTRIBUTES,&hDevice);return status; }? ? 相關(guān)參考見(jiàn)此:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/writing-a-very-small-kmdf--driver
有關(guān)WDK驅(qū)動(dòng)程序構(gòu)建的參考見(jiàn)
? ??https://docs.microsoft.com/zh-cn/windows-hardware/drivers/devtest/tools-for-building-drivers
? ? https://www.baidu.com/link?url=gofQddvm4cFhKAFxAD1iH0_YNCjokCmRwhWT5SEKaaWhbkQPew_4nTGZRiuBBX9bK8r98rY4F-FZuzSfC7o-SPME2VHxHqYizvD8EV7M7Ly&wd=&eqid=a98c2ec5000d4902000000065fef218a
?
從Checked Build 環(huán)境,切換到test.c所在目錄,輸入build test.c,看一下能否構(gòu)建出一個(gè)test.sys的驅(qū)動(dòng)程序;構(gòu)建完成,Done;
沒(méi)有出來(lái).sys為后綴的驅(qū)動(dòng)程序;還不是很清楚這概念,可能到某一版本后,MS的構(gòu)建應(yīng)用程序的build和構(gòu)建驅(qū)動(dòng)程序的build,可能是一個(gè),只是通過(guò)不同的參數(shù)和環(huán)境,來(lái)構(gòu)建出不同的程序類(lèi)型;
看一下安裝目錄的下面目錄,是一個(gè)wmi示例驅(qū)動(dòng)程序;
adm64目錄下都是源文件;構(gòu)建一下此驅(qū)動(dòng)示例,看能否生成.sys驅(qū)動(dòng);amd64架構(gòu)的驅(qū)動(dòng)程序,構(gòu)建成功以后,出現(xiàn)在amd64目錄下;如果是構(gòu)建x86的驅(qū)動(dòng)程序,則.sys出現(xiàn)在i386目錄下;
構(gòu)建wmisamp示例;完畢后顯示 Done,wmisamp.sys,1 executable built;
看一下amd64目錄下,出來(lái)一個(gè).sys驅(qū)動(dòng)程序;
?
總結(jié)
以上是生活随笔為你收集整理的WDK开发环境构建驱动程序入门、Windows驱动程序的Check Build和Free Build的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言基本入门 - 1
- 下一篇: C#二维和多维数组编程实例