WDK开发环境构建驱动程序入门、Windows驱动程序的Check Build和Free Build
先安裝WDK 7;驅動開發包 7;
包含 build環境,調試工具,設備仿真和測試相關;
路徑;
DSF一時不知道是什么;
安裝過程;
完成;
開始菜單出來兩個一級菜單,調試工具,驅動開發包;
看一下構建環境,包含Checked和Free兩種;有何區別?
"Checked build" 有 traces和asserts,? "Free build" 沒有;基本上這兩者與我們傳統的 "Debug" 和 "Release" 相對應;
chk表示Checked,fre表示Free。主要的區別在于,checked build有traces和asserts,而free build沒有。
?
checked和free是怎么出現的呢?因為傳統的用詞一般是debug和retail(或者release)。
當Windows NT還處在開發階段的時候,開發組的人還在用“debug”和“retail”。Debug和Retail的不同在于編譯時的選項:
Compiler Optimization:開、關
Debug Traces:開、關
Assertions:開、關
Sanity checks:開、關
傳統來說,Debug是“Optimization:關,Traces:開,Assertions:開”,Retail是“O:開,T:關,A:關”。后來,NT團隊加入了Sanity checks的選項。本來,Sanity check在內部版本中有,在發布的時候會移除掉。
?
于是,NT的團隊就有了“O:開,T:開,A:開,S:開”,“O:開,T:關,A:關,S:開”和“O:開,T:關,A:關,S:關”三種Build。
最后一種是傳統的“retail” build。那么,前兩種叫什么build呢?第一種Optimization是開著的,所以不是傳統的“debug”,后一種Sanity check是開著的,所以不是傳統的“retail”。
?
為了區別這些build的不同。討論以后,NT團隊決定用“checked”表示“O:開,T:開,A:開,S:開”,“Free”表示“O:開,T:關,A:關,S:開”。Checked是因為所以的check都打開了,Free是因為“check free”。
?
后來,隨著NT 3.1項目進展,團隊認識到:
他們其實根本就不會去測試“retail” build,
他們對free build進行了性能測試,結果發現它能夠滿足性能要求。
于是,團隊把free build作為最終版本發布。
?
進到一個build環境命令提示符;輸入 build 命令; 我的本意是看一下 build 命令的幫助;結果一行行提示自己出來,看上去不停地在運行某個程序;原來在安裝的一級或二級目錄下直接打build命令,會自動構建WDK本身自帶的全部驅動程序例子;
? ? 先Ctrl-C終止;
做一個入門WDK驅動程序,代碼如下;存為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; }? ? 相關參考見此:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/writing-a-very-small-kmdf--driver
有關WDK驅動程序構建的參考見
? ??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 環境,切換到test.c所在目錄,輸入build test.c,看一下能否構建出一個test.sys的驅動程序;構建完成,Done;
沒有出來.sys為后綴的驅動程序;還不是很清楚這概念,可能到某一版本后,MS的構建應用程序的build和構建驅動程序的build,可能是一個,只是通過不同的參數和環境,來構建出不同的程序類型;
看一下安裝目錄的下面目錄,是一個wmi示例驅動程序;
adm64目錄下都是源文件;構建一下此驅動示例,看能否生成.sys驅動;amd64架構的驅動程序,構建成功以后,出現在amd64目錄下;如果是構建x86的驅動程序,則.sys出現在i386目錄下;
構建wmisamp示例;完畢后顯示 Done,wmisamp.sys,1 executable built;
看一下amd64目錄下,出來一個.sys驅動程序;
?
總結
以上是生活随笔為你收集整理的WDK开发环境构建驱动程序入门、Windows驱动程序的Check Build和Free Build的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言基本入门 - 1
- 下一篇: java信息管理系统总结_java实现科