WDF驱动的编译、调试、安装

简介: <span style="font-size:24px;">编译和调试</span><br>使用WDK编译,源代码应包括wdf.h,ntddk.h以及KMDF_VERSION=1,编译使用/GS。<br>KMDF包括以下库:<br>1). WdfDriverEntry.lib(编译时绑定):驱动入口,调用驱动的DriverEntry。<br><p>2). WdfMM000.sys:DDI库,安
编译和调试
使用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启动时候启动该服务)和设定其加载次序(使得其先于客户驱动而被加载)。

目录
打赏
0
0
0
0
47
分享
相关文章
LLDB 调试命令、插件和技巧(上)
LLDB 调试命令、插件和技巧(上)
683 0
嵌入式Linux系列第14篇:使用gdb和gdbserver构建在线调试环境
嵌入式Linux系列第14篇:使用gdb和gdbserver构建在线调试环境
Clion配置远程CUDA调试环境
在阿里云GPU ECS实例上搭建Remote CUDA开发环境,使用Jetbrains Clion作为Develop IDE。
967 1
Clion配置远程CUDA调试环境
【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(三)
【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(三)
333 0
【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(三)
【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(二)
【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(二)
225 0
【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(二)
【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(一)
【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(一)
311 0
【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(一)
LLDB 调试命令、插件和技巧(下)
LLDB 调试命令、插件和技巧(下)
499 0
LLDB 调试命令、插件和技巧(中)
LLDB 调试命令、插件和技巧(中)
476 0
xmake新增对WDK驱动编译环境支持
xmake v2.2.1新版本现已支持WDK驱动编译环境,我们可以直接在系统原生cmd终端下,执行xmake进行驱动编译,甚至配合vscode, sublime text, IDEA等编辑器+xmake插件去开发WDK驱动。
1354 0