-
对win10驱动开发环境的理解(一)
2019-01-21 11:42:19开始学习C的时候,开始并不知道C能做些什么事情,但是通过显示“Hello World”,首先直观知道了这个东西可以打印出我们需要的东西。学习Verilog也是类似,或者说学习FPGA的也是类似。对Verilog,也可以先通过仿真器...学习一个东西,对于初学者来说,总是希望一开始通过简单的操作,能看到一个直观的结果。开始学习C的时候,开始并不知道C能做些什么事情,但是通过显示“Hello World”,首先直观知道了这个东西可以打印出我们需要的东西。学习Verilog也是类似,或者说学习FPGA的也是类似。对Verilog,也可以先通过仿真器在屏幕上打印Hello Verilog的字样,来获得直观的感受。学习FPGA,除了利用verilog在仿真环境下打印Hello外,还可以在演示板上进行操作,比如演示板带LCD或者LED屏的话,可以显示出Hello World的字样。当然,对于FPGA学习,更常用的方式在演示板上“跑个马灯”:就是让板子上的LED灯循环的亮灭。
但是驱动略微有点不同。一开始着手学习驱动开发时,就在想一个问题,如何在开发驱动过程中,首先用开发的驱动程序打印“Hello world”?
回想自己装机过程中,是怎么处理“驱动”的。以前还会想去查查自己电脑是什么配置,然后到对应网站上去下载相应驱动安装程序。这时获得的驱动程序,多数都是可执行文件,只要在windows下双击,就可以安装驱动程序了。有些时候有新的驱动程序出来后,会获得类似于.sys的文件,获取后放在电脑上某个位置,再通过“设备管理器”找到该设备,就可以通过“更新驱动程序§”来安装新的驱动程序:
不过后来有了比如驱动精灵、驱动人生这些软件后,连这些操作都不需要了。直接在软件中进行“检测”,就可以知道哪些设备可以更新新的驱动程序了。新的驱动程序的安装也是“Push Button”的事。所以大家对驱动,似乎关注越来越少了。关于驱动程序的理解,最开始的时候,根据我自己的体会,认为驱动本质上就是一种中间软件。这是基于以前对系统“层次化”理解的进一步拓展。要开发一个系统,有硬件,有软件。软件需要访问硬件,进行系统配置、数据读取。但是软件人员不一定有机会对硬件做深入了解,其实也没有这个必要。所以这时最好的方式就是硬件人员给软件人员提供一个关于硬件操作的“基本函数”,以比如API的方式提供。但是硬件人员又不一定能对软件有深入了解,所以就需要一个人来做这种衔接。我想这该是驱动产生的原因,所以,似乎可以简单把驱动理解为硬件的“接口函数”。有了驱动后,或者有了硬件的接口函数后,软件人员通过调用这些接口函数,就可以访问硬件的“资源”了。
这样看,开发驱动,就一定要和硬件打交道。要在硬件上有“直观的感受”,不是简单的事情。回想C语言和Verilog的学习,都是在“纯软件”环境下打印“Hello World”的。学习FPGA,需要在硬件环境下“打印”“Hello World”,就必须得要有显示屏。
因此貌似学习驱动开发,不太好显示“Hello World”。任何设计,都要进行验证、测试。开发驱动程序也不例外。把驱动软件当成硬件的一个接口函数的话,那么能不能设计一个驱动程序,其功能就是在访问该驱动函数(相当于软件去访问硬件资源)时,返回的值就是“HelloWorld”? 貌似这种方式可行。
-
驱动程序为什么要做WHQL认证
2020-09-29 11:41:36但如果您的驱动程序要在Win10、server2016,2019系统中的安装运行,仅仅有一般的代码签名证书(查看常见的代码签名证书价格)是不能满足微软对驱动数字签名要求的。 这是以为在一般情况下,windows 10,server 2016...驱动程序开发出来之后,一般的开发者都知道给驱动加上数字签名,否则驱动程序难于在Windows中安装运行。
但如果您的驱动程序要在Win10、server2016,2019系统中的安装运行,仅仅有一般的代码签名证书(查看常见的代码签名证书价格)是不能满足微软对驱动数字签名要求的。
这是以为在一般情况下,windows 10,server 2016,2019系统中的secure boot服务都是默认处于开启状态的,从而使得只有第三方机构证书(例如 DigiCert、GlobalSign、Entrust)签名的驱动无法正常安装和加载。要解决这个问题就必须进行WHQL认证签名。
为此专门推出WHQL认证服务项目,协助驱动开发者通过WHQL的方式来获取微软驱动签名,从而保证驱动可以顺畅安装和兼容各类系统,提升了用户体验和产品可信度。
-
win7+vs2010配置驱动开发环境(问题种种版...)
2014-02-08 11:08:42本来按照这个来做,能跑通helloworld,可是复杂的驱动就会出错....不知道什么原因,后来就直接用命令行来编译的。 --------------------------------------------------------------------------------------------...本来按照这个来做,能跑通helloworld,可是复杂的驱动就会出错....不知道什么原因,后来就直接用命令行来编译的。
---------------------------------------------------------------------------------------------------------------------
这个学期和老师做prp(Participate in Research Program),项目的主要内容是:以一个视频采集卡为数据源开发一个虚拟的摄像头驱动程序(至少我是这样理解的)。借了本《Windows驱动开发技术详解》之后。问题就一个一个来了,头一件就是怎么配置开发环境。从网上看了很多的文章,也照着配置了很多天,就是不行。最后在综合了多个人的精华再加上自己一个一个实验后,得到了一个可行的开发环境搭建方法,也不知道以后会不会出现错误,还是先发了吧,希望广大同仁们指正。
前提:vs2010,wdk7已经安装
1. 新建 “解决配置管理器” 名称可为:Driver
2. 建立空项目,添加cpp文件。
3. 打开 视图->其他视图->属性管理器
4. 右击 Driver|Win32选择属性;
配置:
常规:
目标文件扩展名:.sys
VC++目录 (我的wdk安装目录为:C:/WinDDK/)
可执行文件目录:C:/WinDDK/7600.16385.1/bin/x86;$(ExecutablePath)
包含目录:
c:/WinDDK/7600.16385.1/inc;$(VCInstallDir)include;$(VCInstallDir)atlmfc/include;$(WindowsSdkDir)/include;$(WindowsSdkDir)/common/include;$(FrameworkSDKDir)include;c:/WinDDK/7600.16385.1/inc/api;c:/WinDDK/7600.16385.1/inc/ddk;$(IncludePath)
库目录:
C:/WinDDK/7600.16385.1/lib/win7/i386;$(LibraryPath)
链接器:
常规
输出文件:$(OutDir)/$(ProjectName).sys
输入
附属依赖项:
ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB;%(AdditionalDependencies)
忽略所有默认库: 是 (/NODEFAULTLIB)
清单文件
生成清单:否 (/MANIFEST:NO)
启动用户账户控制:否 (/MANIFESTUAC:NO)
调试
生成调试信息:是 (/DEBUG)
生成映射文件:是 (/MAP)
映射文件名:$(TargetDir)$(TargetName).map
系统
子系统:控制台 (/SUBSYSTEM:CONSOLE)
堆栈保留大小:4194304
堆栈提交大小:4096
驱动程序:驱动程序 (/Driver)
高级
入口点:DriverEntry
无入口点:否
设置校验和:是 (/RELEASE)
基质:0x10000
随机基质:删除,不填写
数据执行保护:删除不填写
配置完之后我 的是可以运行的,不知道以后会不会出问题....
-
Win8驱动的兼容性问题
2014-01-06 21:40:42最近我发现为Win8开发的驱动程序,有些能安装在Win7上(包括更早系统),有些则不能。那些不能安装的情况很可怕:一旦安装并加载驱动,系统就会立刻蓝屏。针对这个问题,做了一番调查研究。发现了一个简单的规律: ...引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog】
最近我发现为Win8开发的驱动程序,有些能安装在Win7上(包括更早系统),有些则不能。那些不能安装的情况很可怕:一旦安装并加载驱动,系统就会立刻蓝屏。针对这个问题,做了一番调查研究。发现了一个简单的规律:
如果开发时使用的是WDM驱动框架,则存在此问题;如果使用KMDF驱动框架,则正常。
这是为什么呢?一起来看看吧。
VS2012集成开发环境
Visual Studio 2012(简称VS2012)中包含了Windows驱动程序编译器,使得Windows驱动也可以在Visual Studio的集成开发环境中进行开发了。安装VS2012后,再安装Win8 WDK,打开VS2012会发现多了两种新的“平台工具集”,支持Windows内核和用户驱动程序的编译。如下图所示:
新建的内核驱动项目,会自动选择合适的工具集:WindowsKernelModeDriver8.0。更改工作集,会影响相关的工程项目设置,比如包含目录的查找路径等。所以,如果把驱动项目的工作集改成用户程序相关的话,编译器会报很多找不到头文件的错误,比如找不到<ntddk.h>。
和以前的控制台编译环境类似,在IDE环境中,我们也可以选择不同的目标系统:操作系统,硬件平台。通过工具栏上的列表框进行选择。如下图所示:
我们可以通过工程向导来产生一个WDM内核驱动项目,这里将项目名称设为Test。
Security Cookie导致的不兼容
编译器默认开启/GS编译选项,用来保护内核栈的完整性。编译器会在程序开始的地方,保存一个cookie值到栈上;在程序退出时再检查这个cookie值是否被破坏,如果被破坏,说明栈溢出,表明系统遭到了破坏从而需要蓝屏保护。
GS是一种被普遍运用的保护机制。开启了GS选项后,编译器会链接一个GS相关的库文件来实现GS功能,当目标系统为Win7时库文件是BufferOverflowK.lib,当目标系统为Win8+时库文件是BufferOverflowFastFailK.lib。链接器是如何实现栈保护的呢?它先在驱动加载的时候,也就是GsDriverEntry函数内初始化cookie。然后在每个驱动函数的开始和结束的地方,添加cookie检查的代码。
链接器为了对cookie进行初始化,会为驱动程序重新生成一个名为GsDriverEntry的入口函数,初始化Cookie后再调用驱动程序自己的DriverEntry入口函数。下面是一个典型的GsDriverEntry的实现:
Test!GsDriverEntry: 82ea403e 8bff mov edi,edi 82ea4040 55 push ebp 82ea4041 8bec mov ebp,esp 82ea4043 e8bdffffff call Test!__security_init_cookie// 初始化cookie 82ea4048 5d pop ebp 82ea4049 e9b8fff7ff jmp Test!DriverEntry (82e24006)//调用DriverEntry 82ea404e cc int 3
下面是Win7版本security_init_cookie函数的逻辑:
test!__security_init_cookie: 82eb3005 a10050e382 mov eax,dword ptr [test!__security_cookie (82e35000)] ds:0023:82e35000=00300083 82eb300a b94ee640bb mov ecx,0BB40E64Eh 82eb300f 85c0 test eax,eax 82eb3011 7404 je test!__security_init_cookie+0x12 (82eb3017) // 判断是否等于0 82eb3013 3bc1 cmp eax,ecx // 判断是否等于0BB40E64Eh 82eb3015 751a jne test!__security_init_cookie+0x2c (82eb3031) 82eb3017 a13040e382 mov eax,dword ptr [test!KeTickCount (82e34030)] // 获取当前系统时间 82eb301c 8b00 mov eax,dword ptr [eax] 82eb301e 350050e382 xor eax,offset test!__security_cookie (82e35000) 82eb3023 a30050e382 mov dword ptr [test!__security_cookie (82e35000)],eax 82eb3028 7507 jne test!__security_init_cookie+0x2c (82eb3031) 82eb302a 8bc1 mov eax,ecx 82eb302c a30050e382 mov dword ptr [test!__security_cookie (82e35000)],eax // 生成新cookie值 // 返回 82eb3031 f7d0 not eax 82eb3033 a30450e382 mov dword ptr [test!__security_cookie_complement (82e35004)],eax 82eb3038 c3 ret
这段逻辑先检查security_cookie的当前值,如果不等于0且不等于0xBB40E64E,就立即退出;否则根据当前的系统时间,产生一个随机的cookie值。这里的值0xBB40E64E是个特征值,可能是系统默认生成的。大部分的镜像在加载的时候,其cookie都会被初始化成这个特征值。
当目标OS为Win8时,编译器默认链接BufferOverflowFastFailK.lib文件,它使用新的Cookie算法。正是这个新算法导致了不兼容性。看看Win8中security_init_cookie函数的逻辑,它硬是和0xBB40E64E较上了劲:
mov eax, __security_cookie test eax, eax jz short loc_404029 cmp eax, 0BB40E64Eh // 如果等于0BB40E64Eh,跳到下面产生0x29中断,产生蓝屏 jz short loc_404029 not eax mov __security_cookie_complement, eax retn loc_404029: ; CODE XREF: push 6 pop ecx int 29h // 蓝屏
它判断当前的cookie值是否等于特征值0xBB40E64E,如果相等,立刻蓝屏。神奇的是,在 Win7及以前的OS上,大部分的驱动程序的cookie值都会被加载器初始化为0xBB40E64E。而在Win8+系统上则永远不会这样。这就是为什么能在Win8+正常运行的驱动,一放到Win7上就蓝屏的原因。
WDM和KMDF的区别
那为什么使用KMDF编译的驱动,又没有问题呢?原因很简单,KMDF框架链接的静态库文件还是BufferOverflowK.lib。不保证KMDF以后的版本不会链接新库文件的可能。
如何避免
虽然KMDF兼容性良好,但很多情况下,还是会用WDM框架编写驱动,而且还有很多小端口驱动也可能存在类似问题。如何避免呢。有三种简单的方法:
其一是为Win7及以前系统和Win8+系统产生不同的镜像文件。这也是比较推荐的方法。
其二是在Win8+系统上安装为Win7系统编译的驱动程序。经过测试,大多数为Win7编译的驱动程序,都能正常运行在Win8和Win blue系统上。但不保证更新的Windows系统出来后,这种向前兼容性仍然有效。
其三是干脆关闭GS编译选项。但这样就缺少了栈保护,不推荐。
最后介绍一种MSDN中介绍的比较高级的修改编译选项的办法,可以让编译器在为Win8+目标系统编译驱动程序时,仍选择旧版本的栈保护库文件BufferOverflowK.lib:
- 手动编译,手动设定KernelBufferOverflowLib的路径:
msbuild /p:KernelBufferOverflowLib="C:\Program Files (x86)\Windows Kits\8.1\Lib\win8\km\x64\BufferOverflowK.lib" /p:platform=x64 /p:Configuration="Win8 Release" myDriver.sln
- 用记事本软件打开驱动项目的工程文件,并在合适的地方添加下面的属性:
<KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowK.lib<KernelBufferOverflowLib>
-
WIN XP蓝屏代码大全
2013-08-08 12:29:21用于识别已发生错误的类型, 错误第二部分是被括号括起来的四个数字集, 表示随机的开发人员定义的参数(这个参数对于普通用户根本无法理解, 只有驱动程序编写者或者微软操作系统的开发人员才懂). 第三部分是错误名. ... -
Delphi2007 for Win32 完整版BLUESM2集成版
2020-04-06 22:08:06哈哈,这个是delphi版本上的史无前例,即使第三方控件包来不及支持Delphi2007,也不妨碍开发人员从D2006 升级到Delphi2007做项目开发。 4、 支持MS Build。比如支持Debug、Release。也支持编译前和编译后事件,可... -
新版Android开发教程.rar
2010-12-14 15:49:11也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新... -
为什么沉寂了两年半时间?
2009-02-23 15:53:00自从首篇博客告白开始,两年半时间过去了。这中间一直在沉寂,安安静静的,没有再写任何东西。沉寂不代表没有事情发生,生活还是很丰富多彩的,一直沉浸在幸福的生活中... 首先一个就是Windows驱动开发。如果只是说Win -
Delphi使用ADOconnection连接mysql数据库时的Connectionstring问题
2019-04-03 19:53:12以前只是对delphi有一般性的学习使用,并没有真正的做过开发,至少没做过数据库的部分 今天想稍微弄一下,却在常规使用ADOconnection时碰上了问题 去百度的话,十有八九要么直接发上一堆代码,要么就是告诉人得配置... -
如何利用树莓派从无到有打造一款树莓派机器人
2017-03-28 08:56:05树莓派是为学习计算机编程教育而设计,只有信用卡大小的...为什么要用树莓派做集群,基于树莓派本身性能有限,能用于那些场景? 树莓派最大的瓶颈在哪? 当前内容版权归码字科技所有并授权显示,盗版必究。阅读原文 -
电脑蓝屏对照码
2019-05-05 14:16:40用于识别已发生错误的类型, 错误第二部分是被括号括起来的四个数字集, 表示随机的开发人员定义的参数(这个参数对于普通用户根本无法理解, 只有驱动程序编写者或者微软操作系统的开发人员才懂). 第三部分是错误名. ... -
写得真好,不过分布式的故事还才开始
2020-09-27 14:23:48但文件系统的IO抽象在MCU上的重要性不高,虽然有posix兼容的尝试,但只是能做出来比较方便的scripting,并不会狂野到unix的一切皆io的设计抽象上,毕竟io的性能全是cache保证的,MCU哪里支付得起这样的内存成本。... -
windows 程序设计
2011-07-24 21:16:30Windows程序不要求每个应用程序都自行开发这些驱动程序,因为这种支持是Windows的一部分。 动态链接 Windows运作机制的核心是一个称作「动态链接」的概念。Windows提供了应用程序丰富的可呼叫函数,大多数用于实... -
asp.net知识库
2015-06-18 08:45:45C# 2.0会给我们带来什么 泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也来个c# 2.0 object pool 泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅... -
TEST VGA CARD GPUZ
2011-10-25 09:27:20* 安装过程会运行自主开发的驱动选择工具,此工具可智能判断所有的电脑硬件型号,最大限度地避免了因驱动冲突而蓝屏的现象。 ★ 更人性化 * 集成维护人员工具,不仅装机方便,维护更方便。 * 预置多种精美主题、壁纸... -
C#微软培训教材(高清PDF)
2009-07-30 08:51:17C#--微软.NET的第一语言 本书着重介绍语言本身,比较少涉及应用,不错的入门书,从头讲起,不怕不明白。 <<page 1>> page begin==================== 目 ...1.1.1 什么是.NET 2000 年 6 月 ... -
grub4dos-0.4.4-2009-01-11
2009-10-27 01:58:31是它的名字给人们造成了误解,这也是历史遗留问题——一开始仅仅是“for dos”,而后来开发越来越深入,“FOR DOS”已远不能涵盖其全部。于是它的名字就成了一个障碍,新接触的人往往望名生意,以为它是专给DOS用的... -
C#微软培训资料
2014-01-22 14:10:17<<page 1>> page begin==================== 目 ...1.1.1 什么是.NET 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念的一天 这一天 微软公司正式推出了其下一代... -
X-Scan v3.1
2018-10-22 08:43:03Q:如果没有安装WinPCap驱动程序是否能正常使用X-Scan进行扫描? A:如果系统未安装WinPCap驱动,X-Scan启动后会自动安装WinPCap 2.3;如果系统已经安装了WinPCap更高版本,X-Scan则使用已有版本。“WinPCap 3.1 ... -
当你系统崩溃时教你如何重装系统
2010-10-17 23:13:57⑶ 一般笔记本电脑声卡、显卡、猫的驱动XP里全有,并且基本能自动安装。我重点说一下台式机。 点开《控制面板》,点《系统》,再点《硬件》,点《设备管理器》,把里面有问号和感叹号的项 目全部卸载,点确定关... -
代码语法错误分析工具pclint8.0
2010-06-29 07:00:09本文主要对pclint集成到VC及SourceInsight环境中的方法根据本人安装和使用心得做了较详细介绍,希望对以前没使用过pclint的朋友们能有所帮助,不足之处还请多指正! PC-Lint使用简介 用开发环境进行LINT也可以... -
jquery插件使用方法大全
2012-05-24 23:58:18Jquery是继prototype之后又一个优秀的Javascrīpt框架。...当然,也可以用来开发插件,但Resig强烈建议在开发插件之前,先考虑jQuery UI widget工厂。 值得注意的是,sub函数并不提供真正的隔离,所有方法、数据、... -
X-Scan
2008-04-04 15:19:43X-Scan-v3.1 使用说明 ... 常见问题解答: <br> Q:如果没有安装WinPCap驱动程序是否能正常使用X-Scan进行扫描? A:如果系统未安装WinPCap驱动,X-Scan启动后会自动安装WinPCap 2.3;如果系统已经安装了... -
Linux操作系统基础教程
2013-04-08 21:34:26讲座的目的就是在同学们中间普及 Linux 基础知识,为今后我们更加接近的了解 Linux 做一 个好的开端。 第一讲 Linux基础 在这一讲中,我们主要是了解一下 Linux 的概况,以及对 Linux 有一个初步的感性认识。 ... -
会计理论考试题
2012-03-07 21:04:4019.软盘插入软盘驱动器后,驱动器的读写就通过读写窗口存取信息。( Y ) 20.计算机的常用输入设备有打印机和键盘。( N ) 第二套 选择题 1.PC机中 Intel8088、80286、80386、80486,PemiumPⅡ、PⅢ是指_D_的不同... -
如何查杀运行状态下的EXE、DLL病毒
2008-11-15 00:13:26因此,我们必须按下Win+Break键,然后单击“系统还原”标签,取消“在所有驱动器上关闭系统还原”选项,然后选中D盘,单击“设置”按钮,在打开的窗口中选中“关闭这个驱动器上的系统还原”选项。依次将其他的盘上的... -
计算机应用技术(实用手册)
2011-07-29 16:32:16Phoenix-award workstation BIOS V6.00PC,An Energy star Ally copyright(c) 1984-2003,Phoenix Technologies,LTD 这句英语的意思是:Phoenix-award这两家COMS芯片开发公司合并后共同开发第6号BIOS版本,采用美国... -
Tcl_TK编程权威指南pdf
2011-03-25 09:30:55内容简介回到顶部↑Tcl/Tk是第一种能通过Windows、Macintosh和Solaris等主要平台处理企业级任务的脚本语言。本书共分为55章,依次详细讲述了Tcl基础、Tcl高级特性、TK基础、TK组件、TK详解、C语言编程、各版本之间的...
-
硬件温度监测:Libre Hardware Monitor V0.8.7
-
argb和rgb风扇的区别是什么
-
用Go语言来写区块链(一)
-
3_构建一个简单的spring-boot的RESTful Client项目.zip
-
电子背散射衍射技术原理与应用 哈尔滨工业大学.pdf
-
MySQL 数据类型和运算符
-
finalshell软件
-
php底层运行机制与原理
-
华为1+X认证——网络系统建设与运维(初级)
-
Keep It for mac(Mac笔记软件)
-
NFS 实现高可用(DRBD + heartbeat)
-
C语言零基础入门(详细讲解)
-
VMware vSphere ESXi 7 精讲/VCSA/VSAN
-
MySQL Router 实现高可用、负载均衡、读写分离
-
ROS的学习资料ppt和笔记
-
电动客车电池管理器系统功能策略设计方案11.pdf
-
idea里面maven模块pom.xml一横线解决方法
-
MMM 集群部署实现 MySQL 高可用和读写分离
-
Java中的断言
-
电动客车电池管理器系统功能策略设计方案2.pdf