上一课我们在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示例程序相关推荐

  1. Linux环境下实现一个简单socket通信

    大二学计算机网络时留下的一个坑,具体API的实现不太清楚,但照着做程序运行成功了 编写服务端SERVER程序 #include <sys/types.h> #include <sys ...

  2. 在Ubuntu下实现一个简单的C语言程序

    1.首先鼠标右键进入终端(Terminal) 2.安装编辑器(vim)输入:sudo apt-get install vim 安装编译器(gcc)输入:sudo apt-get install g++ ...

  3. ACT5.6 动手实验手册 如何在工作组模式下对客户端进行数据收集 如何在AD域环境下对...

    ACT5.6 动手实验手册 实验的目标 这个实验的目的是: · 了解如何部署ACT5.6 · 了解如何在工作组模式下对客户端进行数据收集 · 了解如何在AD域环境下对客户端进行数据收集 本次试验大约6 ...

  4. 【win10 windows环境下qt6.4.1+vs2019开发环境搭建】

    win10 qt6.4.1+vs2019环境搭建 在wind10 64位操作系统下搭建Qt6.4.1 + Visual Studio 2019 MSVC开发环境,软件下载说明一下,VS,QT都可以去官 ...

  5. windows环境下新建.txt文件,使其默认以UTF-8编码

    问题的引出: windows环境下新建.txt文件,默认以ANSI格式编码.这种格式编码的文件,放到ubuntu上很可能会乱码. 于是我就想,如何设置windows,才能使新建的.txt文件默认以UT ...

  6. 如何在Linux桌面环境下自动启动程序?

    2019独角兽企业重金招聘Python工程师标准>>> 如何在Linux桌面环境下自动启动程序? 2014-01-06 11:24 布加迪编译 51CTO.com 字号:T | T ...

  7. Keil环境下完成一个基于STM32汇编程序的编写

    本文内容:\color{red}{本文内容:}本文内容: 1)记录build生成的 hex文件各段的大小,了解Hex文件格式及其前8个字节内容含义: 2)学习在没有硬件条件下进行仿真调试的方法,观察A ...

  8. oracle standby rac,同一环境下新建Standby RAC库

    需求:在同一个环境下新建Standby RAC库,即和Primary RAC在相同的磁盘组. 说明:生产环境一般不建议这样配置DG,因为存储层面是相同磁盘组,灾备的实际意义不大.我这里是用作读写分离. ...

  9. 嵌入式:Keil uvision5环境下创建一个工程模板(步骤超详细)

    嵌入式:Keil uvision5环境下创建一个工程模板(步骤超详细) 1.创建一个空的文件夹,命名为"test"(可以为任何名字) 2.打开test文件夹,在该目录下依次创建两个 ...

最新文章

  1. ((void *) 0)的含义和void的一些细节
  2. Supervisor重新加载配置启动新的进程
  3. powerdesigner箭头如何画_用Scratch编程画几何图形:如何画多边形
  4. c++中的变量作用范围
  5. SAP UI5 如何通过 manifest.json 文件定义第三方库依赖关系
  6. 后端技术:Web安全常见漏洞和修复建议,值得收藏!
  7. c#url拼接方法名_C# 从1到Core委托与事件
  8. uniapp手写_【uniapp 开发】手绘签名组件
  9. C语言编程中 提取运行时间的函数,C语言中用于修改文件的存取时间的函数使用...
  10. Awvs 12.x安装及使用教程
  11. Tomcat乱码解决方法
  12. 听说你要删库跑路了?这篇Linux脚本请收好
  13. 冬奥探秘:那些隐匿在冬奥中的“绿科技”
  14. RN vivo访问相册失败 warning : User cancelled image selection
  15. Java 开发flink流/批处理程序
  16. 阿里云云计算助理工程师认证(ACA)
  17. 标签打印机打印亚马逊外箱FBA标签
  18. 有道linux安装路径,Ubuntu 16.04下安装有道词典出错的解决方法
  19. 中划线与下划线的区别
  20. ISCC2018 Misc WriteUp

热门文章

  1. kali换源无法保存_Kali Linux 2.0更新源无法正常使用(解决)
  2. ios8 定位问题解决思路
  3. iOS7下隐藏status bar的详细研究
  4. JQuery中serialize()、serializeArray()和param()的使用方法
  5. JavaScript 总结几个提高性能知识点
  6. 与JSP的初次邂逅……
  7. Linux下SVN安装配置全程实录(转)
  8. 将关闭窗口的按钮放在窗口右边
  9. linux的ftp下载假死,记一次commons-net FTP上传下载卡死
  10. 工作流引擎的五大接口