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启动时候启动该服务)和设定其加载次序(使得其先于客户驱动而被加载)。

时间: 2024-09-28 15:56:11

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

HEVD内核攻击:驱动程序的编译、安装、加载及调试(一)

本文讲的是HEVD内核攻击:驱动程序的编译.安装.加载及调试(一), HEVD是HackSys的一个Windows的训练项目,是一个存在漏洞的内核的驱动,里面存在多个漏洞,通过ControlCode控制漏洞类型,这个项目的驱动里几乎涵盖了内核可能存在的所有漏洞,从最基础的栈溢出,到池溢出,释放后重用等等类型,是一个非常好的项目.非常适合我们熟悉理解Windows内核漏洞的原理,利用技巧等等. 项目地址:https://github.com/hacksysteam/HackSysExtremeVu

亲测VS2010纯静态编译QT4.8.2,实现VS2010编译调试Qt程序

      下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.2.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0-vs2010.exe,这些版本都只是动态编译的,不是我们所需要的.只有用源码包才能做真正的纯静态编译,如果用Qt官网已编译的标准库.exe文件进行编译,有可能出现各种错误,而且编译后的文件巨大,我当时就在这里绕了很大的弯子,请童鞋们注意啦!!可能有些老鸟会笑话,但我本着最严肃的态度告诉菜

基于avd7181c解决视频输入效果差的问题<一>---驱动移植、调试手记

基于avd7181c解决视频输入效果差的问题<一>---驱动移植.调试手记             做过全志A10平台的人都知道,在视频输入方面,虽然有4路TV Decoder,但是做的效果真的不敢恭维.笔者基于全志平台做车载互动娱乐系统以及车载导航主机,客户对视频输入效果有强烈要求,怎么办呢? 加芯片弥补平台的不足.笔者选用的是AVD7181C芯片,可以支持CVBS\S-Video\YPbPr\RGB等多种输入格式,通过该芯片可以输出YUV 4:2:2信号.656信号.YPbPr输入信号的情

KVM 下 libvirt的编译、安装、配置教程

6.1.2 libvirt的编译.安装和配置 1. 从源代码编译和安装libvirt 如果只是普通用户使用libvirt,一般不需要从源码编译libvirt,只需要安装对应的Linux系统上libvirt软件包即可.一些高级用户或者开发者,可能希望对libvirt进行更多的了解,甚至修改libvirt的源代码来实现自己的功能,那么还是需要了解从源代码编译和安装libvirt的过程. 下面以在一个RHEL 6.3系统上编译libvirt 1.0.0 版本为例,介绍一下libvirt的编译和安装过程

Linux中使用VS Code编译调试C++项目详解_C 语言

前言 关于VS Code在Linux下的安装这里就不提了,不管是CentOS还是Ubuntu,如果不懂且搜问题足够的情况下,你会解决的. 一.前置知识--gcc/g++的编译链接过程 在Windows下,如果你用Visual Studio进行开发,C/C++的编译器一般采用微软提供的MSBuild:在Linux下C/C++的编译器大多采用gcc/g++.既然要在Linux下进行C++开发,很有必要了解一下g++编译器的一些基本知识. 假设我现在有一个最简单的C++文件: #include <io

DriverStudio 和 WDF驱动 通过GUID获取设备句柄的差别

DriverStudio /***************************************************************************** * 功能: 通过GUID打开设备,获得设备句柄 * 参数:  *****************************************************************************/ HANDLE lOpenByInterface(   GUID* pClassGuid, //

编译和安装Mysql数据库的过程

Mysql是一款开源的关系型数据库软件,它凭借其高性能.高可靠性和易于使用的特性,成为服务器领域中最受欢迎的开源数据库系统.目前互联中使用Mysql数据的大多是一些web服务器,因为当前比较流行使用PHP+Mysql做动态网站,所以今天讲解的Mysql数据也是针对于网站的.如果有些地方解释的不是很好,希望大家多多谅解,多多支持.谢谢大家!!! 1.安装前的准备工作 如果以前有安装过.rpm格式的mysql,在这里需要将其卸载,以免出现程序或端口冲突. [root@lcoalhost /]#rpm

驱动人生6自动安装打印机驱动神器

小周是某金融公司的网络管理员,为了保障公司50多台电脑能够正常连接打印机,给销售人员提供最大的便利;曾经试过上班一整天都为电脑无法正常连接打印机而折腾;最后还只好固定几台作为公共打印机使用. 近期,小周听说驱动人生6可以实现通过局域网安装打印机驱动;立即去安装了后测试一下到底是不是可以这么方便.结果小周高兴坏了,从来没有想到安装打印机驱动能够这样简单,以后的工作节省了大量的时间.看看他是怎么做的? 1.下载安装驱动人生6; 2.打开软件主界面,选择外设驱动功能,而后看到右下角的添加网络打印机驱动

Horizon驱动和软件如何安装?

  操作步骤: 1. 打开乐家园软件; 乐家园桌面图标和metro界面图标:   2. 点击乐家园里面的驱动与软件安装; 3. 打开驱动与软件安装; 驱动自动安装列表,里面有全套驱动; 4. 安装需要勾选的驱动,如果需要全安装点击全选安装即可,安装完电脑会倒计时自动重启. 随机软件安装,以下是电脑所有随机软件列表: 5. 安装需要的软件勾选即可,全安装点全选即可. 安装完成后电脑一样会倒计时自动重启.