windows驱动开发(Windows驱动开发技术详解 百度网盘)
来源:http://www.tudoupe.com时间:2022-10-13
怎样从零开始学习WINDOWS下的驱动开发?
对于初学者,我们需要一个简单的例子,就和C语言里面的HelloWorld一样,编译运行,接着打印出"Hello world!"。我们要先建立起对WDF驱动的一个初步而强烈的感性认识,然后再对照着例子来学习WDF的概念,看它的代码是怎么实现的,这样就会有深刻的认识。这就是教育学上所谓的循序渐进。按照这个思路,我们就先要编译安装运行一个简单驱动程序例子。我浏览了下WDF的例子之后,发现Echo这个例子比较适合我们的这个思路。下面就开始编译、安装和运行Echo这个例子。我是在XP下面做的实验,如果在其他操作系统下,也类似。在开始试验之前,读者可以从微软的网站下载WDK开发包,大小约700Mbytes,需要耐心地下才能下完。
支持wangtk1982 这里的东西有点帮助,中文的且是国内名人所整理 http://211.90.241.130:22366/list.asp?part1=1&part2=10 http://211.90.241.130:22366/list.asp?part1=1 第二部分以及下面一些的Vxd教程
我也在学习。DDK和C开发程序是必备的。 我是零起点。C没有学过,C++学习过很久。DDK很多东西需要记住。我正在看ROOTKITS——Windows内核的安全防护这本书,内容比较详细,代码要从www.rootkit.com这个网站下载。 对我有很大帮助。以前是搞VB.net和VC的。
先支持一下“wangtk1982”,我没做过驱动,暂时也不想学,所以帮不上忙了。 还有那个“shzbjd”完全就是上来蒙事的嘛,也不看看问题就乱贴。
这是VB的(石油大学) http://kj.cqie.cn/syu200501/01.csf 中间自己加 http://kj.cqie.cn/syu200501/30.csf 这里的东西有点帮助,中文的且是国内名人所整理 http://211.90.241.130:22366/list.asp?part1=1&part2=10 http://211.90.241.130:22366/list.asp?part1=1 第二部分以及下面一些的Vxd教程
支持wangtk1982 这里的东西有点帮助,中文的且是国内名人所整理 http://211.90.241.130:22366/list.asp?part1=1&part2=10 http://211.90.241.130:22366/list.asp?part1=1 第二部分以及下面一些的Vxd教程
我也在学习。DDK和C开发程序是必备的。 我是零起点。C没有学过,C++学习过很久。DDK很多东西需要记住。我正在看ROOTKITS——Windows内核的安全防护这本书,内容比较详细,代码要从www.rootkit.com这个网站下载。 对我有很大帮助。以前是搞VB.net和VC的。
先支持一下“wangtk1982”,我没做过驱动,暂时也不想学,所以帮不上忙了。 还有那个“shzbjd”完全就是上来蒙事的嘛,也不看看问题就乱贴。
这是VB的(石油大学) http://kj.cqie.cn/syu200501/01.csf 中间自己加 http://kj.cqie.cn/syu200501/30.csf 这里的东西有点帮助,中文的且是国内名人所整理 http://211.90.241.130:22366/list.asp?part1=1&part2=10 http://211.90.241.130:22366/list.asp?part1=1 第二部分以及下面一些的Vxd教程

深入浅出windows驱动开发的目录
向内核世界说一声:hello,我来了。如果你是一个初学者,并对这个世界充满好奇心,请从这一章开始,我们一起打招呼~第1章 Hello World驱动 11.1 从Hello World开始 21.1.1 HelloDRIVER 41.1.2 代码解释 81.1.3 驱动程序的编译和安装 111.1.4 查看我们的驱动 141.2 虚拟环境 151.2.1 使用虚拟环境进行驱动开发 151.2.2 使用VMware虚拟机 151.2.3 目标机设置 161.2.4 Virtual PC虚拟机 181.3 小结 19如何在规范的商业环境中,开发成功而有效的驱动软件?驱网站长马勇(ZnSoft)将向你娓娓道来。你会学到这些内容:建立一个简单而有效的开发、调试环境;64位环境下的内核编程技巧;如何发布你的驱动软件。第2章 商业驱动开发技术 202.1 建立开发调试环境 212.1.1 SVN环境 212.1.2 创建工程,导入SVN 232.1.3 建立符号服务器 252.1.4 用符号调试 272.2 64位驱动开发技术 342.2.1 64位驱动编写技术 352.2.2 32位应用程序与64位驱动混合模式 362.3 驱动程序的发布与测试 422.3.1 驱动程序签名 422.3.2 驱动程序测试 462.3.3 WHQL 492.4 小结 50WDF是目前最新的驱动编程框架。当很多内核程序员还紧抱WDM的巨大佛脚时,千万要记住,WDF已是大势所趋。本章介绍了WDF最重要的几个概念,并进行了一定程度的深度挖掘。对于WDF框架的三大核心模型:对象模型、事件模型、PNP/Power模型,本章作了重点讲述。第3章 WDF概述 513.1 主要特点 523.2 框架视图 533.3 兼容性 553.4 对象模型 563.4.1 对象和句柄 593.4.2 引用计数 603.4.3 上下文空间 613.4.4 PME接口 673.4.5 DDI接口 693.4.6 父子关系 763.4.7 对象同步 773.5 驱动对象和设备对象 783.5.1 驱动对象 783.5.2 驱动入口DriverEntry 813.5.3 设备对象 843.5.4 创建设备对象 853.5.5 设备栈 863.6 IO模型 883.6.1 IO目标对象 883.6.2 IO目标对象的细节 903.6.3 安全的缓冲区 933.6.4 内存对象(一) 963.6.5 内存对象(二) 983.6.6 框架和IO请求 1023.6.7 更详细的处理流程 1033.6.8 IO请求参数 1053.6.9 队列 1073.6.10 创建IO请求 1103.7 PNP和电源模型 1123.8 小结 115使用WDF框架开发USB驱动,方便且简单。本章首先总体上从硬件和软件两个方面介绍USB相关知识点,包括设备的电气特性、总线结构、USB驱动类型以及类驱动。编程方面,从USB设备初始化、数据操作以及设备控制等几个方面来讲解,透彻并且翔实。第4章 WDF USB设备驱动开发 1164.1 USB设备硬件结构 1174.1.1 主从结构 1174.1.2 硬件拓扑 1184.1.3 USB中断 1194.2 USB软件结构 1204.2.1 总线驱动 1204.2.2 系统类驱动 1214.2.3 功能驱动 1224.2.4 父驱动与混合设备 1224.2.5 过滤驱动 1254.2.6 USB驱动栈、设备栈 1254.3 内核开发 1274.3.1 设备驱动 1274.3.2 入口函数 1284.3.3 USB描述符 1294.3.4 描述符介绍 1304.3.5 汇总举例 1334.3.6 读取描述符 1354.3.7 初始化 1374.3.8 设备初始化函数 1384.3.9 创建设备对象 1414.3.10 设备命名、符号链接 1434.3.11 启动设备 1474.3.12 创建队列 1564.3.13 停止设备/反初始化 1584.4 数据I/O操作 1604.4.1 USB控制命令 1604.4.2 构造并发送控制命令 1624.4.3 读USB中断端口 1634.4.4 连续读操作 1654.4.5 数据处理函数 1664.4.6 中断端口的效率 1674.4.7 读/写批量端口 1684.5 设备控制 1714.5.1 关于I/O Target对象 1714.5.2 获取USB版本 1724.5.3 管道重置 1744.5.4 设备重置 1764.5.5 管道中止与终止 1774.6 用户程序 1794.6.1 内核读/写 1794.6.2 控制命令 1794.7 小结 1801394俗称火线。大伙平时最多接触它的地方大概是内核调试时,借助1394卡进行双机互联。本章首先从硬件方面介绍了1394的知识,它的总线结构很特别,极具可扩性,能非常方便地在各种类型的1394设备之间建立数据链路。内核编程方面,本章重点讲解了数据通信相关知识,分为异步通信和同步通信两种方式,颇为复杂,相对难于掌握,但套路是现成的,变化的东西不多,可以熟能生巧。本章最后介绍了1394双机互联的原理,有兴趣的读者可参考之。第5章 WDF 1394驱动开发 1815.1 1394一席谈 1825.1.1 版本情况 1835.1.2 电源特性 1835.1.3 1394卡 1835.1.4 总线拓扑 1845.2 发送请求 1865.2.1 同步方式 1875.2.2 异步方式 1895.2.3 对WDM的回忆 1915.3 总线重置与计数 1935.3.1 总线重置 1935.3.2 设置重置回调 1935.3.3 计数更新 1945.4 PNP操作 1955.5 异步通信 1965.5.1 地址范围 1975.5.2 异步读 2005.5.3 异步写 2015.5.4 异步锁请求 2025.5.5 数据流 2035.6 等时通信 2045.6.1 申请带宽 2055.6.2 释放带宽 2065.6.3 等时通道 2065.6.4 资源句柄 2075.6.5 缓冲区挂载 2105.6.6 缓冲区解挂 2115.6.7 开始传输 2115.6.8 停止传输 2125.6.9 其他等时操作 2135.7 其他操作 2135.7.1 设备配置 2135.7.2 获取控制器信息 2145.7.3 速度信息 2155.7.4 厂商自定义命令 2165.8 安装与测试 2165.8.1 1394虚拟设备 2165.8.2 创建虚拟设备 2185.8.3 示例代码 2195.8.4 安装与测试 2215.9 小结 222内核天生适合于C语言编程,但越来越多的内核项目,规模达到10数万的规模。在这种情况下,人们不由地会将目光投向优雅的C++语言。总体上说,C和C++是至亲好友,内核中使用C++本不应有什么大问题,但有几个暗礁潜伏已久,不小心的程序员,你可千万不要触礁。第6章 内核驱动C++编程 2236.1 驱动中的类 2246.1.1 一个简单的例子 2246.1.2 new/delete 2256.1.3 extern C 2276.1.4 全局/静态变量 2286.1.5 栈的忧虑 2306.2 类封装的驱动程序 2336.2.1 寻找合适的存储所 2336.2.2 类方法与事件函数 2356.2.3 KMDF驱动实现 2366.2.4 WDM驱动实现 2376.3 多态 2386.3.1 基类、子类 2386.3.2 实现多态 2396.3.3 测试 2416.4 小结 241使用WDF框架编写的驱动程序,在测试和调试的时候,有特殊的工具。本章介绍了目前所知的三个,它们分别是:Windbg扩展调试命令、WDFTester测试工具、WDFVerifier测试工具。本章将以示例方式,介绍这些工具的使用。第7章 WDF驱动测试 2427.1 WDF错误 2437.1.1 实例分析 2457.1.2 USB错误 2467.2 WDF扩展调试命令 2477.3 WDFTester 2547.3.1 WDFFiTester 2547.3.2 使用 2567.3.3 WDFCallTracer 2607.4 WDFVerifier 2637.4.1 识别KMDF驱动 2637.4.2 使用与介绍 2657.5 小结 266SoftIce渐行渐远之后,Windbg成为内核调试的第一利器。使用Windbg的最大难点是命令繁多,参数复杂。本章以总结归纳的形式,介绍了作者在工作中经常用到的几大类调试命令,并以实例形式一一介绍。作者根据个人经验所作的分类,未能全备,但能够保证的是,所有实例翔实而可靠,可以作为可信的参考。第8章 调试命令详解 2678.1 概述 2688.1.1 寻求帮助 2698.1.2 DML语言 2708.1.3 基本信息 2718.1.4 基本设置 2728.1.5 格式化显示 2738.1.6 开始调试 2738.2 符号与源码 2768.2.1 模块列表 2778.2.2 模块信息 2798.2.3 符号路径 2808.2.4 符号加载 2838.2.5 符号搜索 2858.2.6 源码命令 2878.3 进程与线程 2898.3.1 进程命令 2898.3.2 线程命令 2928.3.3 异常与事件 2968.3.4 局部变量 3008.3.5 显示类型 3018.4 断点 3018.4.1 软件断点 3018.4.2 硬件断点 3038.4.3 其他操作 3038.5 内存命令 3048.5.1 查看内存 3048.5.2 内存信息 3078.5.3 其他命令 3118.6 小结 312相信大多数人在学习内核开发的时候,都问过这样一个问题:内核驱动怎么向用户程序发送消息,或者如何调用Win32函数。用户程序和内核同步,是一个基本而重要的知识,本章介绍了三种主要的实现方式。至于内核是否可以调用Win32函数,读一读本章开篇的话,你就有答案了。第9章 内核同步 3139.1 关于内核同步 3149.2 内核事件同步 3169.2.1 原理 3169.2.2 用户程序 3189.2.3 内核实现 3199.3 IRP同步 3209.3.1 用户程序 3219.3.2 内核实现 3239.4 WMI同步 3259.5 数据缓冲区同步 3269.6 反向调用 3289.7 小结 330微软最新的音视频编程框架即AVStream框架,不管从什么方面来说,音视频编程都是一个很小众的领域。AVStream框架极其复杂,个人看法是掌握的难度超过了WDF。本章介绍了AVStream框架的各种基本知识点,并以实例讲解一个内核音频过滤器在系统中是如何工作的。第10章 音频驱动开发 33110.1 简介 33210.1.1 音频模块架构 33210.1.2 系统中的音频设备 33410.2 AVStream对象 33810.2.1 设备对象 33910.2.2 Filter工厂和Filter对象 34010.2.3 Pin工厂和Pin对象 34210.2.4 Node对象与Connection结构体 34310.3 AVStream描述符 34610.3.1 描述符简介 34610.3.2 描述符示例 34710.3.3 分发函数表 34910.3.4 自控表 34910.3.5 自控表示例 35110.4 代码讲解 35510.4.1 入口函数 35510.4.2 设备分发函数 35710.4.3 Filter与Pin分发函数 35810.4.4 创建和删除 35910.4.5 数据处理 36010.4.6 数据格式 36210.5 自控表函数 36410.5.1 事件函数 36410.5.2 属性函数 36610.5.3 方法函数 36710.5.4 用户接口 36710.6 硬件操作 37010.6.1 数据DMA 37010.6.2 AVStream中的DMA实现 37110.6.3 谈谈ISR 37410.7 安装与测试 37610.7.1 安装 37610.7.2 测试工具 37610.8 小结 379ASIO音频驱动具有两个非常亮眼的优点:低延迟、多通道。低延迟能够达到几毫秒,使得最灵敏的耳朵也难也察觉;多通道则让通常的双声道、6.1声道等一齐歇菜,而可以很轻松地让多达十几、几十个声道同时工作,在进行高级音频编辑时,这非常重要。第11章 ASIO虚拟声卡 38011.1 引言 38111.2 关于ASIO 38311.3 ASIO用户驱动 38411.3.1 COM接口 38411.3.2 安装与卸载 38611.3.3 IASIO接口 38711.3.4 技术核心 39011.3.5 计算延迟 39211.4 内核驱动实现 39311.4.1 同步 39311.4.2 原理 39311.4.3 实现 39611.5 ASIO音频软件 39611.6 小结 397从本章开始的三章内容,讲的都是“驱动安装”这个话题。在本章中,介绍了系统中和驱动安装有关的各种系统模块。读者通过阅读本章后,至少能够掌握这两个基本知识:系统如何识别一个旧设备,并为它加载合适的驱动文件;系统如何发现一个新设备,并完成驱动安装。第12章 设备驱动安装入门 39912.1 基础知识预介 40012.1.1 设备类型 40012.1.2 设备实例ID 40112.1.3 驱动加载和安装 40312.2 安装模块 40412.2.1 内核PNP管理器 40512.2.2 用户PNP管理器 40612.2.3 安装接口函数(Setup API) 40812.2.4 配置管理器接口(CfgMgr API) 41012.2.5 类安装器(Class Installers) 41012.2.6 类协安装器(Class Co-Installers) 41012.2.7 设备协安装器(Device Co-Installers) 41112.2.8 驱动包(Driver Package) 41212.2.9 驱动仓库(Driver Store) 41312.2.10 设备管理器(Device Manager) 41412.2.11 安装程序 41512.2.12 新设备向导 41612.2.13 添加硬件向导 41612.2.14 驱动安装器(Driver Installer) 41612.3 重要问题 41712.3.1 寻找和选择 41712.3.2 32位与64位系统兼容 41812.3.3 系统重启 41912.4 安装模式 42012.4.1 示例1:客户端模式 42112.4.2 示例2:服务器模式 42312.5 安装器编程 42412.5.1 DIF码 42412.5.2 处理流程 42712.5.3 工程示例 42912.5.4 注册 43012.6 小结 431INF文件即驱动程序的“安装文件”,它包含了各种与驱动安装有关的指令信息。通过INF文件,系统知道如何处理驱动包中的各个文件,并在系统注册表中做出准确记录。本章主要从指令和域,这两个方面进行讲解。第13章 深入解析INF文件 43213.1 概述 43313.1.1 域 43313.1.2 指令 43413.1.3 多系统 43513.2 注册表指令 43613.2.1 缩写根键 43613.2.2 软件键 43713.2.3 硬件键 43713.2.4 AddReg 43813.2.5 DelReg 44013.2.6 BitReg 44113.3 文件操作指令 44113.3.1 CopyFiles 44113.3.2 DelFiles 44313.3.3 RenFiles 44313.4 服务指令 44413.4.1 AddService 44413.4.2 DelService 44513.5 基本域 44613.5.1 版本域 44613.5.2 文件域 44713.5.3 默认安装域 45113.5.4 控制域 45413.5.5 字符串域 45713.6 设备类安装域 45813.6.1 主域 45913.6.2 服务子域 46113.7 接口类安装域 46113.8 厂商/产品域 46213.8.1 厂商域 46313.8.2 产品域 46413.9 设备安装域 46413.9.1 硬件子域 46613.9.2 协安装器子域 46713.9.3 接口子域 46813.9.4 厂商默认配置子域 46913.9.5 逻辑优先配置子域 47013.10 ChkInf介绍 47113.11 小结 472驱动安装程序让你的驱动软件显得更加专业,所以,放弃手动安装驱动的做法吧,你的驱动将显得更靓。本章的示例软件MyDrvInst,可以作为读者设计更漂亮的安装软件的开始。第14章 设计驱动安装程序 47314.1 驱动包 47414.1.1 安装方式 47414.1.2 安装驱动包 47514.1.3 卸载驱动包 47614.2 驱动更新 47714.2.1 设备已连接 47714.2.2 设备未连接 47814.2.3 枚举系统设备 48114.3 分析INF文件 48414.3.1 函数介绍 48414.3.2 打印设备ID 48614.4 MyDrvInst介绍 48714.5 制作软件安装包 49014.5.1 视图介绍 49014.5.2 我们的工程 49214.5.3 编译执行 49314.6 小结 494附录A CY001 USB开发板 495附录B VisualKD + VMWare实现单机内核调试 501

从事Windows 驱动开发有前途吗?
有前途还是有前途的。因为只要你掌握了核心的编程技术,即使再做改行也是一件很容易的事情。 其实无论是写什么操作系统的驱动,其实都是小众,这个圈子注定不大。另外写驱动的学习曲线确实有点陡,调试驱动需要极大的耐心和毅力以及底层知识。 当然如果你像我一样还能做点硬件,给自己的硬件写驱动还是蛮好玩的。另外我司确实有很多大牛也写驱动,不过他们的驱动是为了hips,和传统的硬件驱动意义不一样,驱动对于hips来说只是一个功能的载体,是代码进入内核的包装。

什么是windows驱动开发?
这个,介绍只好复制来说了。我觉得你要是有兴趣,随便在那都能找到很多有趣的资料。看下面驱动的发展史: Windows 驱动程序的发展演变我们在学习开发驱动程序时有必要弄清楚Windows设备驱动程序的发展演变过程(为了简便起见,以下简称驱动程序),以便明白我们将要开发什么样的驱动程序。这就象你开发一个应用程序时必须弄清楚它是运行在WINDOWS平台下还是在DOS平台下,否则我们能写出什么样的应用程序就可想而知了。驱动程序开发者的各项任务之中,有许多是为特定的硬件编写驱动程序。由于WINDOWS的发展,这样的工作在 Windows 9X 下要比在前一版Windows(windows3.x 、Windows Workgroup) 中容易得多。先了解一些历史演变,可能会对驱动程序的编写有所帮助。实模式Windows(Real-Mode Windows)从一开始,MS-DOS 和系统基本输入输出系统(BIOS) 就已经提供了许多硬件设备的驱动程序。BIOS 通过一些常用的软件中断,开放出驱动程序的服务 ,像INT 10h 是显示系靳中断,INT 13h是磁盘子系靳中断,INT 16h 是键盘中断等等。BIOS 也处理硬件中断,并承担对“可编程中断控制器”(Programmable Interrupt Controller ,PIC )的管理任务。MS-DOS 也通过软件中断(如 INT 21h 、INT 25h 、INT 26h )提供了系统服务 ,并提供一个机制(CONFIG.SYS 中的 device= 语句),让新的或强化后的驱动程序能?蛟谙到y启动时被加载进操作系统内核。标准模式Windows(Standard-Mode Windows)早期的 Windows 中,MS-DOS 和 BIOS 是最重要的。Windows运行在实模式状态中,这时的Windows充其量不过是一个强化后的MS-DOS图形用户界面而已。从系统角度看,Windows只不过是个大的图形应用程序。Intel 80286 的出现,使 Windows能?蛟诒;つJ街性诵胁⒒竦酶叽? 16MB 实际内存空间。依靠保护模式和实模式的转换,Windows 仍然继续使用MS-DOS 和 BIOS 提供的服务来完成所有的系统需求。这种运作模式被称为 Windows标准模式(Windows standard mode) 。在 80286 机器上切换实模式和保护模式,系统开销很大。Intel 于是提供了一个快又有效率的指令,让你从实模式切换到保护模式。但Intel 认为没有什么人还需要再从保护模式切换回实模式。结果,唯一能?蛉帽;つJ匠绦颍ㄈ? Windows standard mode )存取实模式软件(如 MS-DOS )的方法就是复位CPU(reset CPU) 。在人们开发出来的各种复位方法中,最普遍的一种就是触发键盘控制器,提供由 Ctrl-Alt-Delete 键所发出的外部信号。于是引发所谓的三键失效(triple fault,即三键热启动),这是 CPU 先天无法处理的一种“失效“。事实上无论哪一种作法,代价都很昂贵,因为它们至少都得经过 BIOS 的引导程序 。事实上,在某些 286 机器,模式的切换要花掉好几毫秒。显然 Windows 需要一种方法,避免每次一有事件发生,像是键盘被按下或鼠标移动等等,就得切换到实模式。解?Q方法就是写一个保护模式驱动程序,可以在保护模式中处理 I/O 中断。这些驱动程序直到今天我们都还在使用,你在 SYSTEM 子目录中看到的扩展名为 .DRV 的文件都是!包括 MOUSE.DRV 、COMM.DRV 等等。我把它们称为 ring3 DLL 驱动程序,因为它们实质上都是 16 位 Windows 动态链接库(DLLs ),在 ring3层 (Intel CPU 最不受保护的层,一般应用程序运行在ring3层,核心态的驱动程序动行在ring0层)执行。它们的任务是在不离开 CPU保护模式的前提下,和 Windows KERNEL 、USER 、GDI 模块之间形成接口。增强模式Windows(Enhanced-Mode Windows )Intel 80386 CPU 使 Windows的第三种操作模式(所谓的 enhanced mode)成为可能。在此模式中 Windows 采用分页(paging) 和虚拟86(V86) 特性,创造出??拟机器(VirtualMachines ,VMs )。对一个应用程序而言,VM 就像一独立的的个人电脑,独自拥有自己的键盘、鼠标、显示器等等硬件。而实际上,经过所谓的??拟化(virtualization ),数个 VMs 共享相同硬件。对最终用户而言,最大的好处是他现在能?蛟诖翱谧刺?中(而非全屏幕)运行MS-DOS程序 。"??拟化"是 VxDs 的工作。VxD 的名称来自于 "virtual x device",意思是此驱动程序用来??拟化某个(x )设备。例如:VKD用来??拟化键盘,使Windows 和任何一个MS-DOS程序都自认为独立拥有属于自己的键盘。VMD 用来??拟化鼠标。某些 VxDs 并不是为了??拟化某些硬件,而是为了提供各种底层系统服务。页面交换(PAGESWAP) 和 页面文件(PAGEFILE)就属于这种非设备VxD ,它们共同管理交换文件(swap file ),使 增强模式Windows (enhanced-modeWindows) 得以将磁盘空间分配成为??拟内存的一部份。尽管基础技术令人耳目一新,但增强模式Windows (enhanced-mode Windows )还是继续在磁盘和文件 I/O 方面使用 MS-DOS 和 BIOS 。需要交换(swap )一个文件时,它还是把 CPU 切换到 V86 模式,让 MS-DOS 和 BIOS 来处理 I/O 操作。在保护模式、真实模式、V86 模式之间的所有切换动作都使得 Windows 慢下来。更多的延时则来自于MS-DOS 和 BIOS 不可重入这一问题(即不能两个程序同时使用相同的服务)。Windows 必须强迫所有应用程序在同一个队列等待实模式服务。Windows95Windows 95 将终结这一份对历史的回忆。Windows 95 使用数种不同的驱动程序模型,大部份是使用 32 位 ring0层的虚拟设备驱动程序(VxDs) ,而非 rin3层的 DLLs 。所有的设备驱动程序都有一个具有管理功能的核心虚拟机VMM(虚拟机管理器)管理。Windows对中断的处理与MS-DOS大不一样。当中断发生时,处理器转换为ring0级保护模式。Windows系统并不像MS-DOS那样通过中断描述符表IDT(Interrupt Descriptor Table)直接指向中断处理过程,而是由IDT入口指向VMM中的程序。该程序将判断是否为中断调用,如果是,则把中断控制权交给虚拟可编程中断控制器VPICD(Virtual Programmable Interrupt Controller Device),VPICD实际上是一个重要的VxD。VPICD再将其交给另一个注册了该中断的VxD(如Audcard.vxd)来处理。VxD程序是通过调用VPICD服务VPICD_Virtualize_IRQ来注册中断的。Windows 95 对于设备 (device) 的处理,一般的模型是:由一个 VxD 掌管所有中断并执行所有数据传输,应用程序则使用函数调用 (function calls) 的方式对 VxDs 发出服务请求。这种VxD 为主的设备规划模型的一个好例子就是:Windows 95 的串行通信(serial communications) 。从前 Windows的串行通讯是使用一个 ring3 驱动程序(COMM.DRV ),?群?硬件中断处理程序以及驱动一个通用异步收发蕊片(universal asynchronous receiver-transmitter (UART )蕊片)所需的全部逻辑功能代码。在未让此驱动程序知道的情?r下,两个 VxDs (VCD 和COMBUFF )拦截了硬件中断和软件 IN/OUT 指令,为的是??拟化每一个 port ,并且改善因多任务而引起的问题。Windows 95 也有一个 ring3 组件名为 COMM.DRV ,但这个组件已经成为新的VxD (VCOMM )的一个简单的外层程序,只用来提供 16 位程序和 VCOMM之间的接口。VCOMM 则处于底层,联结一般应用程序、VxD clients 、 VxD 端口驱动程序和实际的硬件。端口驱动程序现在负责处理所有中断,并执行真正与硬件起作用的 IN/OUT 指令。Windows 95 文件系统是另一个好例子。过去,对文件系统服务的请求(requests ),源自于16 位保护模式程序所发出的 INT 21h 。有一个 VxD 用来处理这些 INT 21h ,并将它们切换到 V86 模式,以便让MS-DOS 处理。MS-DOS 发出 INT 13h中断 ,以请求使用 BIOS 的磁盘 I/O 功能;发出 INT 2Fh ,允许网络的 "redirector modules"(重新定向模块)将此请求通过网络传输出去。Windows 95 提供给应用程序的,仍是向上兼容的接口,INT 21h 仍旧是导至文件系统的动作,但是底层基础却大不一样。在 Windows 95 之中,一个名为“可安砚文件系统“(Installable File System ,IFS )的管理器会处理所有 INT 21h ,甚至是来自于 V86 模式的。然后它把控制权交斤一个文件系统驱动程序(File System Driver ,FSD )。有一个 FSD 名为 VFAT ,是针对 MS-DOS文件系统(所谓 File Allocation Table ,FAT )而设计;另一个 FSD 名为 CDFSD ,可以解析 CD-ROM 格式;此外还有其他 FSDs ,知道如何经由各种网络彼此通讯。针对本机(local 端)FSD (如VFAT )的磁盘操作,会经过被I/O管理器(Input/Output Supervisor ,IOS)监视管理的一堆VxDs处理。甚至 V86 模式的 INT 13h 中断调用最终也是由 IOS 处理。换句??真,实模式和保护模式所发出的对文件系靳的请求(request ),不论是针对本地(local )或远程(remote )磁盘,有可能完全(或几乎完全)由 VxDs 来处理。Windows 95 这种以 VxD 为中心的驱动程序模型,好处之一是,系统程序员不一定要是 MS-DOS 和 BIOS 的专家,就可以写驱动程序。那些准备提供系统扩展组件的程序员,也同享这个好处;原本你必须了解DOS保护模式接口(DPMI)以及 Windows 核心模块的许多神秘特性或未公开特性,现在只需了解 Win32 的 DeviceIoControl API 函数,以及那些支持所谓 "alertable waits”(即时唤醒,大意是那些可以在VXD中调用的Windows 32位 API函数,但数量极其有限,)的 Win32 API 即可。这两个接口可以让你把 VxD 当做 32 位应用程序的扩展组件。尽管Windows系统驱动程序设计的任务主要是在系统底层上扩展 Windows 的功能,但Windows 95 还是保留了令人印象深刻的向上兼容能力(对上层程序,如dos程序来说,它们的调用接口没变,但底层实际操作却大不一样了)。DPMI 还是存在(有些16 位程序还是需要它),你还是可以运行实模式的网络驱动程序或文件系统驱动程序--如果这是你的必要选择。事实上,你往往可以把 Windows 3.1 的一整组硬件设备、网络驱动程序、16 位应用程序及其必要的 VxDs 整个搬到 Windows 95 ,不至于遭遇什么大问题。 Windows98&2k&NT1996年的Windows Hardware Engineering Conference(WinHEC)会议上,Microsoft宣布了一种新的Windows设备驱动程序模型――Win32 Driver Model(WDM)。这种新的设备驱动程序模型将成为Windows 2000(即Windows NT 5.0)的核心。这个消息令从事Windows设备驱动程序(VxD)开发的程序员感到沮丧(虽然大家早已预料到Windows系列与Windows NT系列最终将走到一起)。WDM将vxd的开发人员带到了一个新的起点上,什么都是新的:新的模式,新的观点。如果你曾看过DDK的汇编代码的话,你一定可以体会这个消息对VxD开发者是个沉重的打击,而对于Windows NT设备驱动程序(Kernel Mode Driver)的开发者来说,却是另一番心情――因为WDM基本等于Kernel Mode Driver+Plug and Play。 VxD将让位于WDM,现在令我们欣慰的是Microsoft宣布Windows 98(Windows 98支持VxD,推荐使用WDM方式驱动,但有些设备,如打印机等还不能用它,微软预先设想的是Windows98和Windows 2k x86版在WDM驱动上可以二进制码兼容,但实际上没有完全实现)可能会坚持到200X年(天知道,估计也就是三两年)。在这期间,掌握VxD技术的你还是可以主动要求老板给你加薪的。即使到了WDM一统天下之时,也不用灰心,因为无论是VxD还是WDM,都要求开发人员对计算机硬件有着全面而细致的了解。通过VxD的锻炼,你至少熟悉了计算机的硬件资源并对保护模式有了比较深刻的认识,这些东西都是将来从事WDM开发的硬功夫。 好了,该说说Windows NT了。在Windows NT中,80386保护模式的“保护”比Windows 95中更坚固,这个“镀金的笼子”更加结实,更加难以打破。在Windows 95中,至少应用程序I/O操作是不受限制的,而在Windows NT中,我们的应用程序连这点权限都被剥夺了。在NT中几乎不太可能进入真正的ring0层。在Windows NT中,存在三种Device Driver: 1.“Virtual device Driver” (VDD)。通过VDD,16位应用程序,如DOS 和Win16应用程序可以访问特定的I/O端口(注意,不是直接访问,而是要通过VDD来实现访问)。 2.“GDI Driver”,提供显示和打印所需的GDI函数。 3.“Kernel Mode Driver”,实现对特定硬件的操作,比如说CreateFile, CloseHandle (对于文件对象而言), ReadFile, WriteFile, DeviceIoControl 等操作。“Kernel Mode Driver”还是Windows NT中唯一可以对硬件中断和DMA进行操作的Driver。SCSI 小端口驱动和 网卡NDIS 驱动都是Kernel Mode Driver的一种特殊形式。 Windows NT的驱动程序模型与Windows 3.1、Windows 95是截然不同的。所以如你的程序使用的某些特有驱动程序是VXD驱动的话,在Windows nt和windows 2k中是不能运行的。你听说过的CIH病毒就是运用的是VXD相似技术。所以不可能在nt和windows 2k中感染CIH病毒。 关于WDM驱动程序方面的相关知识,可以参看《WINDOWS WDM设备驱动程序开发指南》和《Programming the Microsoft Windows Driver Model》两本书或参看微软DDK文档。在本专栏以后的文章中,我们将一起学习WDM驱动程序的开发技术(大势所趋嘛)。

从事Windows 驱动开发有前途吗?
有前途还是有前途的。因为只要你掌握了核心的编程技术,即使再做改行也是一件很容易的事情。

相关新闻
- 2023-01-29 windows驱动开发(Windows驱动开发技术
|
|