Windows驱动程序入门

# Windows驱动程序开发入门:从原理到实践 Windows驱动程序(Device Driver)是一种特殊的软件组件,运行在内核模式下,负责管理特定的硬件设备。它们充当应用程序和硬件之间的翻译器,将操作系统的标准化调用转换为特定硬件能够理解的指令。#ifdef DBG。 阅读详情

摘要:本文介绍了Windows下驱动程序的设计的必要性和基本方法,主要适合于驱动程序的初学者。

一、驱动程序设计的必要性
    在传统DOS系统下,每个应用程序都有权利读写硬件,读写I/O端口,控制系统中断,然而到了Windows系统中,为了保持良好的系统安全性,对应用程序的权限作出了限制,因为不适当的硬件读写会引发整个系统的崩溃。在Windows系统中,将整个程序设计为分层结构,其中,应用程序位于ring3,驱动程序位于ring0,应用程序不能读写底层硬件,对于硬件操作必须借助于底层驱动程序,所以,只要是与硬件系统打交道的Windows程序,必然会涉及到驱动程序的开发和设计。

二、驱动程序的分类和设计工具
    驱动程序是Windows系统的内核,驱动程序的分类与Windows相关,在Windows 9X下,驱动程序的类型为VXD(虚拟设备驱动程序),在Windows 2000/XP,驱动程序的类型为WDM(Windows驱动程序设计模型),生成的驱动程序设计文件为.sys格式。
    在Windows9X下,设计驱动程序的工具称为VTOOLSD,而在Windows 2000/xp下,设计驱动程序的工具为DriverStudio中的DriverWorks,另外的设计驱动程序的工具还有WinDriver,微软提供的开发工具为Windows DDK。由于所有的驱动设计工具均以DDK作为基本的类或者参照,加上DDK是一个免费软件,所以在下面主要以DDK为例进行讲解,掌握了DDK工具,其他工具也就变得简单了。

三、Window DDK软件的安装与环境设置
    每个Windows系统都有各自的DDK开发工具,在安装DDK前,请先根据Windows系统的不同,安装不同的DDK工具。在安装DDK之前,请先安装相应的编译器如Visual C++6.0,本文以Windows 2000下的DDK为例,说明安装过程,安装DDK完成后,选择菜单“开始”->“Development Kit”->“Check Build environment”将自动进行各项环境的设置,当然用户也可选择“Free Build environment”,二者的区别在于“check”带有调试信息,“Free”则不带有调试信息,一般情况下,在软件开发阶段,选用“check”,而在发布阶段,选用“Free”。
    选择上述命令后,将进入编译环境,该环境为“DOS”界面,进入驱动程序所在的目录,一般情况下,该目录包含了以下文件:
makefile 编译文件,一般不作更改
sources 规定了其中的源文件,驱动程序的类型
源文件 为.c或者.h文件
    为了编写方便,我们可以进入DDK提供的例子下面,将makefile和sources拷贝到我们程序所在的目录下,将sources进行简单的修改,编译时,进入相应的目录,在该目录下输入“Build”,系统编译完成后,将在objchk/i386目录下生成相应的.sys文件。

四、驱动程序的编写
    寻找一个合适的编译器如EditPlus,当然也可以用VC,只不过需要手动编译,第一步,找到驱动程序的入口函数DriverEntry(),相当于Main()或者WinMain(),所有的驱动函数入口均从DriverEntry()开始,下面以端口驱动程序为例,说明驱动的编写。该文件位于NTDDK/src/general/portio下。
1.创建设备
    对于设备驱动程序,首先要创建该设备,这段代码可以放在DriverEntry中,也可放在AddDevice中。
首先,调用IoCreateDevice()创建自己的设备,该函数用法可以参考DDK或者相关示例。在端口操作中,可以将函数写为:
status = IoCreateDevice (DriverObject,
                    sizeof (LOCAL_DEVICE_INFO),
                    &7,
                    GPD_TYPE,
                    0,
                    FALSE,
                  &deviceObject);
    其次,调用函数IoCreateSymbolicLink()创建两个设备之间的连接
    status = IoCreateSymbolicLink( &win32DeviceName, &ntDeviceName );
2.初始化所用的资源
    在驱动程序中,总需要访问I/O端口、系统中断、内存地址以及DMA,使用这些资源之前,需要获取资源并且初始化,一种简单的方法是直接指定,如中断10,DMA3等,这种方法虽然简单,但灵活性差,任何硬件资源的改变均需在驱动程序中作出修改;另一种较为科学的方法就是让驱动程序访问注册表,从注册表中访问硬件资源,然后进行初始化。
在驱动程序中,访问注册表的函数为RtlQueryRegistryValues(),该函数的用法较为复杂,可参考相关资料,建议在驱动程序开始开发时,直接给资源赋值,等驱动程序调试成功后再加入访问注册表代码。
3.注册驱动程序的各个处理函数
    DriverObject->MajorFunction[IRP_MJ_CREATE]          = GpdDispatch;
    DriverObject->MajorFunction[IRP_MJ_CLOSE]          = GpdDispatch;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]  = GpdDispatch;
    DriverObject->DriverUnload                          = GpdUnload;
    DriverObject->MajorFunction[IRP_MJ_PNP]            = GpdDispatchPnp;
    DriverObject->MajorFunction[IRP_MJ_POWER]          = GpdDispatchPower;
    DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL]= SystemControl;
    DriverObject->DriverExtension->AddDevice          = GpdAddDevice;
    处理函数的注册方法有点类似Windows下应用程序设计的消息处理函数,注册完成后,当处理相应的IRP时,自动调用相应的函数模块。

五、驱动程序与应用程序间的信息交互
    驱动程序用以访问底层硬件,应用程序实现人机交互,驱动程序和应用程序之间需要实现相应的信息交互,一方面,应用程序通过对驱动程序发送相应的指令,实现硬件控制的动作指令,另一方面,驱动程序将硬件读写的状态、从硬件上获得的数据传送给驱动程序,实现应用程序与驱动程序间的交互函数包括以下API函数;相应的API函数能够激发驱动程序的消息。
接口API函数          驱动程序的中IRP
CreateFile            IRP_MJ_CREATE
CloseHandle         IRP_MJ_CLOSE
ReadFile              IRP_MJ_READ
WriteFile              IRP_MJ_WRITE
DeviceIoControl    IRP_MJ_DEVICE_CONTROL
    在应用程序中,用户可以调用上述函数操作驱动程序,其中CreateFile( )用于打开驱动程序,在使用完驱动程序之后,可以用CloseHandle()关闭驱动程序,ReadFile( )用于从驱动程序中读取数据,WriteFile()用以往驱动程序中写入数据,在函数中,最重要的是DeviceIoControl(),通过定义各种ITL_CODE来实现应用程序与驱动程序间的通讯函数,并可以传递各种参数和数据。

六、驱动程序的安装
1.手动安装方法
    生成的驱动程序为sys后缀,一般放于Windows/System32/Drivers目录下,如果进行手动安装,可以将生成好的驱动程序拷贝到该目录中,然后修改注册表,对于注册表的修改,可以进入注册表修改程序进行修改,也可编写注册表程序进行修改,以下为一注册驱动程序的注册表文件示例。
REGEDIT4
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Device]
"Type"=dword:00000001
"Start"=dword:00000001
"ErrorControl"=dword:00000001
"DisplayName"="Device"
"Group"="port"
"Tag"=dword:00000001

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Device/Parameters]
"IRQ Line"=dword:00000003
    直接在资源管理器下双击reg文件,在弹出的窗口上选择“是”将直接修改注册表,完成后,重新启动Windows系统,将调用驱动程序。
2.编写安装文件INF
    INF文件含有安装一个WDM设备驱动程序需要的所有必需的信息,包括赋值的文件列表,要创建的注册表项等,Windows为大多数类型的设备提供了一个标准的安装程序。INF文件是一个文本文件,由节组成,每一节从括在方括号中的节的名称开始,后面是节的内容,每一行可以是简单的一项,或者设置一个一个值。具体的INF文件编写可以参考现成的示例。
DDK安装完成后,其中存在工具GenINF,可以按照该向导进行INF文件的编写。
3.利用API函数编程实现驱动程序的安装
    利用API函数实现注册表的安装,其实是利用访问注册表的API函数访问修改注册表,实现驱动程序的安装。这种方法完全可以嵌入到我们的应用程序中,以下提供了安装驱动程序的API代码。主要的API函数包括RegCreateKeyEx(),RegSetValueEx(),RegQueryValueEx(),RegCloseKey() 。

七、驱动程序的调试
由于驱动程序的所有信息不能直接输出到屏幕上,所以驱动程序的调试较一般应用程序要难得多,在调试时,可以利用应用程序中的DeviceIoControl()获取驱动程序的状态,也可借助调试工具SoftIce,比较方便的工具是SysInternals公司的DebugView,如果驱动程序中带有调试语句信息DbgPrint(),可以直接将该函数提供的信息显示到屏幕上。

Windows 10驱动开发入门(一):环境搭建 windows 10 驱动开发入门,环境的搭建。 阅读详情

相关推荐

Windows驱动开发深入指南

本文还有配套的精品资源,点击获取 简介:Windows驱动开发是IT领域中一项关键的技术工作,它确保操作系统与硬件设备的正确交互。本文将深入探讨Windows驱动开发的不同方面,包括Windows 2000时代的驱动模型、Windows Driver Model (WDM)、文件系统过滤驱动开发,以及驱动程序开发的环境搭建和调试技巧等。开发者将需要掌握C/C++编程,对Wi...

weixin_36382073的博客 2874

Windows 驱动开发 新手入门(一)

Windows 驱动开发 新手入门(一)引言驱动介绍Win10 WDK建立一个驱动项目建立MyDriver.cpp理论知识驱动入口派遣函数 MajorFunctionDevice和SymbolicLinkDeviceExtensionIRP 引言 本文是对Windows下的驱动开发有一个简单的介绍,我尽可能写的小白文一些,因为大多数的驱动开发书籍对新手来说还是过于难理解。 驱动介绍 在介绍驱动开发之前,先了解一下基础知识,驱动是什么的? 驱动这个词是由Driver直译的,这和平常开发中的测试驱动开发(TD

Doub1's Blog 2万+

Windows驱动开发(一)

总结来说,WDM是早期的Windows驱动开发模型,需要开发人员直接操作底层硬件资源,而WDF是在WDM之上的高级和抽象的驱动程序开发框架,提供了更简化和自动化的开发方式。注意:在极少数情况下,你需要编写注意到 PnP 或电源事件的软件驱动程序,并且驱动程序需要访问无法通过 KMDF 获取的数据,你必须使用 WDM。WDF提供了更多的自动化和简化功能,减少了驱动程序开发的复杂性和错误,提高了开发效率和稳定性。WDM驱动程序以核心驱动程序、功能驱动程序和过滤器驱动程序为基础,涵盖了广泛的硬件设备类型。

qq_38933606的博客 3531

Windows 驱动开发环境搭建

本章内容简单介绍了关于 Windows 驱动开发环境的相关知识,并基于 Windows 10 22H2 的操作系统版本进行了 Windows 驱动开发环境的部署验证。要完成 Windows 驱动开发环境需要根据自己开发的目标操作系统版本选择对应的 Visual Studio 版本及 WDK(Windows 驱动工具包)版本。安装步骤也是先安装 Visual Studio 后安装 WDK。

跑不了的你的博客 5426

Windows 上的驱动程序入门

Windows 上的驱动程序入门什么是驱动程序?是否需要编写驱动程序?选择驱动程序模型编写你的第一个驱动程序Windows 兼容的硬件开发板Sharks Cove 硬件开发板预配计算机以便进行驱动程序部署和测试 (WDK 10)适用于所有驱动程序开发人员的概念 内容摘自Microsoft 官方文档 什么是驱动程序? 是否需要编写驱动程序? 选择驱动程序模型 编写你的第一个驱动程序 Windows 兼容的硬件开发板 Sharks Cove 硬件开发板 预配计算机以便进行驱动程序部署和测试 (WDK 10) 适

weixin_46099170的博客 444

Windows驱动程序入门 .

转载:Windows驱动程序入门 2009-03-03 10:05 A.M. 摘要:本文介绍了Windows驱动程序的设计的必要性和基本方法,主要适合于驱动程序的初学者。 一、驱动程序设计的必要性     在传统DOS系统下,每个应用程序都有权利读写硬件,读写I/O端口,控制系统中断,然而到了Windows系统中,为了保持良好的系统安全性,对应用程序的权限作出了限制,

zb872676223的专栏 825

TAP-Windows6驱动程序:从入门到精通的完整构建手册

在虚拟网络技术领域,TAP-Windows6驱动程序如同连接现实世界与虚拟世界的桥梁,为虚拟专用网络等应用程序提供稳定可靠的网络适配器支持。掌握其构建和使用技巧,是每位网络工程师必备的核心能力。 ## 构建旅程:从零开始的驱动开发 ### 第一步:环境搭建与准备 在开始构建之前,需要确保开发环境配置完整。基础要求包括Python 2.7运行环境、Windows 10 EWDK工具包以及必要的

gitblog_00872的博客 457

Windows驱动开发系列小白入门经典 - vs2019双机调试wdk驱动程序

vs2019双机调试wdk驱动程序远程配置虚拟机我们发现VS2019菜单栏那里没有Driver选项,怎么办呢?在虚拟机设置中把打印机移除后再添加串行端口该端是服务器,另一端是应用程序,这是什么意思呢?NT式的驱动就是以服务的方式,用工具SRVINSTW来安装开始设置vs2019中的调试设备禁用驱动程序强制签名 远程配置虚拟机 我们发现VS2019菜单栏那里没有Driver选项,怎么办呢? 记得要把防火墙都关掉 在虚拟机设置中把打印机移除后再添加串行端口 因为打印机默认会用串口1,

zhaopeng01zp的博客 5134

Windows驱动程序开发快速入门指南:从零到一的完整学习路径

Windows驱动程序开发是连接硬件与操作系统的核心技术,而微软官方的Windows Driver Kit(WDK)文档则是掌握这一技能的终极资源。对于想要快速上手的开发者来说,这份官方文档提供了从基础概念到实战项目的完整学习路径。本文将为你揭示如何高效利用这份权威资料,快速掌握Windows驱动开发的精髓。 ## 为什么选择Windows Driver Kit作为学习起点? Windows

gitblog_00657的博客 461

Windows CE嵌入式开发入门——基于Xscale架构》 第9章 Windows CE BSP及驱动程序结构分析

 9.1  Windows CE驱动程序结构概述Windows CE的驱动程序可以从多种角度进行区分。1.从加载以及接口方式来区分可以分为本机设备驱动(Built-In Driver)、可加载驱动(Loadable Driver)以及混合型驱动。(1)本机设备驱动本机设备驱动即Native Device Drivers。这些驱动程序在系统启动时,在GWES的进程空间内被加载

taling的专栏 1万+

WDK开发环境构建驱动程序入门Windows驱动程序的Check Build和Free Build

先安装WDK 7;驱动开发包 7; 包含 build环境,调试工具,设备仿真和测试相关; 路径; DSF一时不知道是什么; 安装过程; 完成; 开始菜单出来两个一级菜单,调试工具,驱动开发包; 看一下构建环境,包含Checked和Free两种;有何区别? "Checked build" 有 traces和asserts, "Free build" 没有;基本上这两者与我们传统的 "Debug" 和 "Release" 相对应; chk表示Checked,f.

bcbobo21cn的专栏 2267

Zettlr 使用指南:从起草到导出,一篇论文的完整写作流程

论文写到一半,最乱的不是正文,而是满屏的文献引用:作者名敲错、年份漏掉、页码对不上。Zettlr 把起草、卡片笔记、引用和导出放进同一个窗口。这篇 Zettlr 教程按写一篇论文的顺序,把每步动作讲清楚。 ## 两分钟装好 Zettlr 装 Zettlr 不用碰源码:去官网下对应系统的安装包,或在 Mac 上直接用包管理器一行装完。 ```bash brew install --cask z

gitblog_01195的博客 373

深度学习环境配置002-驱动程序,CUDA,CUDNN在Windows下的安装【手把手教学,适合入门新手小白】

本文是深度学习环境配置的cuda篇,旨在帮助入门新手小白完成初次环境搭建。手把手教学,已经细致到每一个鼠标or键盘操作了。并且标注了顺序,没有跳步骤。

wuyouxianshen的博客 1364

Windows CE嵌入式开发入门——基于Xscale架构》 第9章 Windows CE BSP及驱动程序结构分析...

9.1 Windows CE驱动程序结构概述 Windows CE的驱动程序可以从多种角度进行区分。 1.从加载以及接口方式来区分 可以分为本机设备驱动(Built-In Driver)、可加载驱动(Loadable Driver)以及混合型驱动。 (1)本机设备驱动 本机设备驱动即Native Device Drivers。这些驱动程序在系统启动时,在GWES的进程空间内被加载,因...

yesjavame 89

WinDriver驱动程序开发入门教程

WinDriver驱动程序开发入门教程 Windriver是jungo公司的一款高效易用的驱动开发软件,方便用户基于此开发自己的驱动程序,而不需要对windows DDK作深入的研究。 Windriver相比driverstudio使用起来更为方便,同时,它支持windows、Linux、Vxworks、winCE、Solaris等OS,对于当前流行的硬件设备,如:端口、ISA、PCI(-X, -E)、PCMCIA、USB等都有很好的支持。作为驱动开发的入门工具,windriver是很好的选择。 Incl

qq_22326895的博客 1万+
上一篇: 驱动程序开发入门(一)HelloWorld
下一篇: 第一个驱动程序
syf442
博客等级 码龄19年 179粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值