如何在win10+VS2017环境下新建一个简单的WDF示例程序
上一課我們在win10系統+VS2017開發環境下搭建了WDK驅動程序開發環境的搭建,詳見我的博客【如何在win10+VS2017環境下安裝USB驅動開發套件WDK】,今天我們來嘗試建立一個最簡單的KDM示例工程。
提前說明:本博客所建立的示例工程的源碼,我上傳在了CSDN里【https://download.csdn.net/download/leon1741/10957680】,大家可以自行去下載。不過遺憾的是,現在CSDN資源的下載積分規則改了,不能由上傳者來設置該資源的下載積分,而是由系統自動適配的。因此,這個資源的下載積分目前需要5分,有點多,我其實想設置成免費或者最多1分的,可是系統不讓我改。希望各位的積分值夠用,或者希望系統過段時間自動把下載積分值降下來吧…
第一步:新建工程
記得要選擇WDF模型下的空KMD驅動項目,項目名我輸的是KMD_Test,大家可以自己更改。
第二步、輸入代碼
在源代碼文件夾上右擊,選擇新建一個空白文件。
輸入文件名為Drive.c。請注意,不是Drive.cpp,而是Drive.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; }第三步:項目配置
首先切換到x64平臺下,選擇debug模式。
然后打開項目屬性的窗口,完成以下設置:
第四步、全文編譯
無需其他操作,點擊編譯按鈕即可!
1>------ Build started: Project: KMD_Test, Configuration: Debug x64 ------ 1>Building 'KMD_Test' with toolset 'WindowsKernelModeDriver10.0' and the 'Universal' target platform. 1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets(402,5): warning MSB8038: Spectre mitigation is enabled but Spectre mitigated libraries are not found. Verify that the Visual Studio Workload includes the Spectre mitigated libraries. See https://aka.ms/Ofhn4c for more information. 1>Stamping x64\Debug\KMD_Test.inf 1>Stamping [Version] section with DriverVer=02/14/2019,18.56.35.708 1>Drive.c 1>KMD_Test.vcxproj -> D:\A_Download\KMD_Test\x64\Debug\KMD_Test.sys 1>Done Adding Additional Store 1>Successfully signed: D:\A_Download\KMD_Test\x64\Debug\KMD_Test.sys 1> 1>Driver is a Universal Driver. 1>........................ 1>Signability test complete. 1> 1>Errors: 1>None 1> 1>Warnings: 1>None 1> 1>Catalog generation complete. 1>D:\A_Download\KMD_Test\x64\Debug\KMD_Test\kmd_test.cat 1>[0x7FF9F8B95140] ANOMALY: meaningless REX prefix used 1>[0x7FF9F8B95180] ANOMALY: meaningless REX prefix used 1>[0x7FF9F8B95380] ANOMALY: meaningless REX prefix used 1>[0x7FF9F8B935F0] ANOMALY: meaningless REX prefix used 1>[0x7FF9F8B91FD0] ANOMALY: meaningless REX prefix used 1>Done Adding Additional Store 1>Successfully signed: D:\A_Download\KMD_Test\x64\Debug\KMD_Test\kmd_test.cat 1> 1>Done building project "KMD_Test.vcxproj". ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========編譯出來的驅動程序,均放在”項目目錄\Debug\KMD_Test“目錄下:
- KMD_Test.sys – 最關鍵的內核模式驅動文件;
- KMD_Test.inf – 安裝驅動時提供給系統使用的信息文件;
- KMD_Test.cat – 安裝程序用來鑒別驅動簽名狀態的目錄文件;
注:以上全部過程,均是參考微軟官方的指導文檔執行下來,大家若有興趣可以自行參閱【Write a KMDF Hello World driver】。
另外,也可以參考微軟在github上提供的一份全套示例參考【https://github.com/Microsoft/Windows-driver-samples】。
OK,新建的工程已經順利編譯成功,驅動程序也已經生成完畢,本篇到此為止。下一篇我們將繼續研究如何進行驅動程序的調試和安裝。
篇后語:
這里補充一下,安裝完WDK之后,如果去編譯其他的C++工程,有可能會遇到【LINK : fatal error LNK1104: 無法打開文件“MSVCRTD.lib”】之類的問題,請不要慌張,不要去網上亂找,這個問題的原因其實很簡單,參考我的另一篇博客【如何解決win10+VS2017+WDK環境下編譯C++程序提示error LNK1104無法打開文件*.lib的問題】即可!
總結
以上是生活随笔為你收集整理的如何在win10+VS2017环境下新建一个简单的WDF示例程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spartan浏览器怎么清理缓存 Spa
- 下一篇: makefile如何减小可执行文件的大小