编译和调试
使用WDK编译,源代码应包括wdf.h,ntddk.h以及KMDF_VERSION=1,编译使用/GS。
KMDF包括以下库:
1). WdfDriverEntry.lib(编译时绑定):驱动入口,调用驱动的DriverEntry。

2). WdfMM000.sys:DDI库,安装驱动时候,由co-installer来完成该sys的安装,驱动运行时动态绑定之。

3). Wdfldr.sys:引导库,加载DDI库,绑定到驱动中,由co-installer来完成该sys的安装。
KMDF发布一些调试工具和符号文件以便于调试驱动。

安装
使用co-install和inf文件安装KMDF驱动,因此安装包包括:Inf文件,co-install的DLL,驱动sys,可选安装程序。
1). Inf文件包括WDF段(指定服务名以及KMDF的版本),并引用co-install,co-install包括cab资源包。该cab包括DDI库和引导库。
2). DLL,导出cab文件,cab的所有内容都是签名过的组件。如果co-install验证失败,驱动不能被安装。

版本和动态绑定
OS加载KMDF驱动时,驱动动态绑定到WdfMM000.sys,多个驱动共享相应的DLL,相同主版本的DLL可以同时存在。当编译KMDF时候,链接了WdfDriverEntry.lib,该lib包含KMDF的版本信息,并链接进入驱动sys文件,其中的FxDriverEntry封装了驱动的DriverEntry函数,而成为驱动的入口点。驱动加载步骤如下:
1). FxDriverEntry调用WdfVersionBind传WdfMM000.sys的版本信息。
2). OS检测相同版本的库是否加载,如果没有,启动代表该库的服务,然后加载库和驱动。如果加载,OS把驱动增加为该服务的客户,返回相关信息给FxDriverEntry。如果驱动需要和已经加载的库版本不一样的库,那么加载失败,并写入系统事件日志。
3). FxDriverEntry调用DriverEntry,后者又调用KMDF去创建驱动对象。
不同主版本号的KMDF库可以同时运行,但是同主版本号不同次版本的库不能同时运行。驱动安装时,次版本号最新的库将覆盖旧的库,如果此时旧的库已经被加载,那么需要重启OS。
对于OS启动时加载的驱动,情况不同,因为KMDF库必须先于驱动加载,所以安装的时候,co-installer从Inf文件中先判断驱动是否是启动加载型的,如果是,必须改变KMDF服务的启动类型(使得OS启动时候启动该服务)和设定其加载次序(使得其先于客户驱动而被加载)。

WDF驱动的编译、调试、安装的更多相关文章

  1. Windows驱动程序开发基础(四)驱动的编译调试和安装

    Windows驱动程序开发基础,转载标明出处:http://blog.csdn.net/ikerpeng/article/details/38793995 以下说一下开发出来驱动程序以后怎样编译.一般 ...

  2. 用Visual Studio 2015 编译张帆的第一个NT式驱动,并且成功安装到Windows XP里面!!!

    开发工具:Visual Studio 2015 企业版 目 标 机:Windows XP X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...

  3. 用Visual Studio 2015 编译张帆的第一个WDM驱动,并且成功安装到Windows 10里面!!!

    开发工具:Visual Studio 2015 企业版 目 标 机:Windows 10 X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...

  4. 【转载】Windows下VSCode编译调试c/c++

    懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Windows下VSCode便携式c/c++环境 http://blog.csdn.net/c_duoduo/article/de ...

  5. 【菜鸟玩Linux开发】在Linux中使用VS Code编译调试C++项目

    最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...

  6. VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...

  7. [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件

    在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么 ...

  8. 【转载】在Linux中使用VS Code编译调试C++项目

    原文:在Linux中使用VS Code编译调试C++项目 最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS ...

  9. 在Linux中使用VS Code编译调试C++项目

    最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...

随机推荐

  1. ASP.NET控件GridView的使用& Xml操作注意事项

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢!   原文链接:http://www.cnblogs.com/zishi/p/6729478.html 文章主要内容 ...

  2. Nginx负载均衡搭建(Window与Linux)

    windows上搭建nginx负载均衡 1.准备几台http服务器软件,这里选用一台apache一台tomcat apache(windows)下载链接:https://www.apachehaus. ...

  3. 关于node的基础理论,书上看来的

    最近看了一本书,说了一些Node.js的东西,现在来记录一下,让自己记得更牢靠一点. 在书上,是这样介绍的:Node.js模型是源于Ruby的Event Machine 和 Python的Twiste ...

  4. SSM项目手动分页详解

    环境:idea+mysql 首先,既然是mysql,那肯定会用到limit,用这个分页的确很方便. 第一步,编写sql语句 <select id="selectImages" ...

  5. VirtualDOM与diff(Vue实现)

    写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/an ...

  6. 阿里云maven仓库配置

    1.在maven的setting.xml配置文件中<mirrors>标签下添加以下配置 <mirror> <id>nexus-aliyun</id> & ...

  7. EntityFrameWork实现部分字段获取和修改(含源码)

    EntityFrameWork类库,是微软推出的ORM组件,它是基于Ado.Net的,个人感觉还是非常 好用的.以下介绍的2个功能点分别是部分字段更新和获取 解决部分字段Update.本方案采用仓储模 ...

  8. Visual Studio 2017 Enterprise 发布 15.3.3 版,附离线安装包百度网盘下载。

    Visual Studio 2017 Enterprise 发布 15.3.3 版,附离线安装包百度网盘下载. Visual Studio 2017 Enterprise 更新至 15.3.3 ,本安 ...

  9. CSS 圣杯布局升级版---多个固定宽度一个自适应宽度

    1.一个div固定,一个div自适应宽度.两种情况,固定在左或者在右. HTML: <div class="box1"> <div class="mai ...

  10. Nginx和php是怎么通信的?

    先来看一下搭建好PHP运行环境的Nginx配置文件. 非常重要的就是 fastcgi_pass 指令了,这个指令用于指定 fpm 进程监听的地址,Nginx 会把所有的 php 请求翻译成 fastc ...