编译和调试
使用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. Jquery DataTable控制显示列,导出EXCEL

    1.初始化 var table = $('#table').DataTable({ "data": data[0].DATA, "columns": data[ ...

  2. Laravel (5.5.33) 加载过程(一)

    说明:  由于公司项目使用Laravel 框架  也是第一次接触此框架  作为一个新手 记录使用过程的一些事情  以及对于框架源码分析的记录  整理自己的思路 也希望对大家有帮助  如果那里不对的地方 ...

  3. BZOJ 1176: [Balkan2007]Mokia [CDQ分治]

    题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...

  4. HDU 1724 Ellipse [辛普森积分]

    Ellipse Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  5. 浅析Xilinx 三速以太网MAC IP核

    之前在使用Altera的三速以太网MAC IP的基础上,完成了UDP协议数据传输.此次为了将设计移植到xilinx FPGA上,需要用到xilinx的三速以太网MAC IP核,当然也可以自己用HDL编 ...

  6. linux目录结构 简单讲解

    1./- 根每一个文件和目录从根目录开始.只有root用户具有该目录下的写权限.请注意,/root是root用户的主目录,这与/.不一样 2./bin中 - 用户二进制文件包含二进制可执行文件.在单用 ...

  7. Angular+ionic2+Echarts 实现图形制作,以饼图为例

    step1:添加插件echart; npm install echarts --save package.json文件中会在dependencies中添加echarts,如下图: step2:运行cm ...

  8. 微信小程序模板发送,openid获取,以及api.weixin.qq.com不在合法域名内解决方法

    主要内容在标题三,老手可直接跳到标题三. 本文主要解决个人开发者模板消息发送的问题(没有服务器,不能操作服务器的情况) 针对api.weinxin.qq.com不在以下合法域名列表内的问题提出的解决方 ...

  9. 给Linux系统/网络管理员的nmap的29个实用例子

    Nmap亦称为Network Mapper(网络映射)是一个开源并且通用的用于Linux系统/网络管理员的工具.nmap用于探查网络.执行安全扫描.网络核查并且在远程机器上找出开放端口.它可以扫描在线 ...

  10. 使用scp从远程服务器下载文件到本地

    [下载远程文件到本地] scp -P 6008 root@192.168.1.123:/usr/data/1.zip   /Users/abc/www [上传本地文件到远程] scp -P 6008  ...