WDF驱动的编译、调试、安装
编译和调试
使用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驱动的编译、调试、安装的更多相关文章
- Windows驱动程序开发基础(四)驱动的编译调试和安装
Windows驱动程序开发基础,转载标明出处:http://blog.csdn.net/ikerpeng/article/details/38793995 以下说一下开发出来驱动程序以后怎样编译.一般 ...
- 用Visual Studio 2015 编译张帆的第一个NT式驱动,并且成功安装到Windows XP里面!!!
开发工具:Visual Studio 2015 企业版 目 标 机:Windows XP X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...
- 用Visual Studio 2015 编译张帆的第一个WDM驱动,并且成功安装到Windows 10里面!!!
开发工具:Visual Studio 2015 企业版 目 标 机:Windows 10 X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...
- 【转载】Windows下VSCode编译调试c/c++
懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Windows下VSCode便携式c/c++环境 http://blog.csdn.net/c_duoduo/article/de ...
- 【菜鸟玩Linux开发】在Linux中使用VS Code编译调试C++项目
最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...
- VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...
- [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件
在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么 ...
- 【转载】在Linux中使用VS Code编译调试C++项目
原文:在Linux中使用VS Code编译调试C++项目 最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS ...
- 在Linux中使用VS Code编译调试C++项目
最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...
随机推荐
- Install MongoDB on Linux Systems 速记
下载mongodb最新版本: 下载链接:http://pan.baidu.com/s/1kTDnkyz curl -O http://downloads.mongodb.org/linux/mongo ...
- iOS-状态栏字体颜色【白色】【Xcode9.1】
Xcode9之前 设置状态栏颜色首先在info.plist文件中,加入UIViewControllerBasedStatusBarAppearance = false: <key>UIVi ...
- notify丢失、虚假唤醒
notify丢失: 假设线程A因为某种条件在条件队列中等待,同时线程B因为另外一种条件在同一个条件队列中等待,也就是说线程A/B都被同一个Object.wait()挂起,但是等待的条件不同. 现在假设 ...
- UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库
在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...
- 静态成员static
静态成员分为静态数据成员和静态函数成员: 静态数据成员: 1.用关键字static来声明: 2.该类的所有对象维护改成员的同一份拷贝:(就是说所有的对象看到的是同一份数据) 3.必须在类外定义和初始化 ...
- UITableView 的使用小点
1.系统默认的颜色设置//无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = ...
- ps色彩范围抠章
1.在photoshop打开需要抠公章的图像文件2.使用椭圆形选区工具,ALT+SHIFT+鼠标左键,选择章的范围 2.CTRL+J,复制图层,得到图层1,隐藏背景 3.CTRL+L,调整色阶,拖动两 ...
- dedecms调用文章内容
使用织梦建站时,有时候需要调用某一文档的内容,但织梦默认没有相应的标签,这时就需要我们使用sql语句去抓取了. {dede:sql sql="SELECT aid,typeid,body F ...
- Spring Boot - Font Awesome OTS parsing error: Failed to convert 字体加载失败
字体文件,加载不出来 解决方案 一 问题是Maven正在过滤字体文件并破坏它们. <resource> <directory>${project.basedir}/src/m ...
- abp允许跨域代码,时间转换为固定格式,本地时间
在Global的 Application_BeginRequest方法中: Thread.CurrentThread.CurrentCulture = new CultureInfo("z ...